发表于: 2017-02-03 23:59:01
1 1976
今天学习的内容:主要是内部类和枚举类
外部类也可以叫宿主类
内部类也可以继续有内部类
内部类根据使用不同的修饰符和位置分为四种
1.实例内部类
2.静态内部类
3.局部内部类
4.匿名内部类
内部类可以看做是外部类的一个成员所以可以用public/缺省protect/private修饰
1.实例内部类:没有使用static修饰,说明内部类属于外部类的对象,不属于外部类本身,
特点:
1.创建实例内部类前必须通过外部类对象创建内部类对象(当存在内部类对象时一定存在外部类对象)
2.实例内部类的实例自动持有外部类的实例引用,内部类可以直接访问外部类成员
3.外部类中不能直接访问内部类成员,必须通过内部类的实例访问
4.实例内部类中不能定义静态成员,只能定义实例成员
5.如果实例内部类和外部内部类存在同名的字段或方法,那么在内部类中,this.abc表示访问内部类成员,外部类.this.abc表示访问外部类成员
静态内部类:使用static修饰的内部类
1.静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类实例时候不需要创建外部类实例,
2.静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,则需要通过外部类的实例去访问,
3.静态内部类中可以定义静态成员也可以实例成员
4.测试类可以通过完整的类名直接访问静态内部类的静态成员,
局部内部类(一般很少用局部内部类,一般用匿名内部类)
在方法中定义的,其可见范围和当前方法的局部变量是一个级别的
1.不能使用访问修饰符
2.局部内部类只能在当前方法中使用
3.局部内部类和实例内部类一样不能包含静态成员
4.局部内部类和实例内部类一样可以访问外部类的所有成员
5.局部内部类访问的局部变量必须使用final修饰(java8中不是,自动默认隐式添加final,依然是常量,不能改变)原因:如果当前方法不是main方法那么当前方法调用完毕后当前方法的栈帧被销毁,方法内部的局部变量的空间全部销毁,然后局部内部类是定义在方法中的,而且在方法中会创建局部内部类对象,而局部内部类会去访问局部变量,当当前方法被销毁的时候,对象还在堆内存,依然持有对局部变量的引用,但是方法被销毁的时候局部变量已经被销毁了,此时出现在堆内存中,一个对象引用着一个不存在的数据,为了避免该问题,我们使用final修饰局部变量,从而变成常量,永驻内存空间,即使方法销毁之后,该局部变量也在内存中,对象可以继续持有
匿名内部类:匿名内部类是一个没有名称的内部类,适合只用一次的类
在开发中经常有这样的一些类,只需要定义一次使用一次就可以丢弃,此时不应该白白定义在一个文件中,在javaSE/安卓事件处中,不同的按钮点击之后应该有不同的响应操作,首选使用匿名内部类
特点:
1.匿名内部类本身没有构造器,(没有类名就没有构造器,会调用父类构造器)
2.尽管没有构造器,但是可以在匿名类中提供一段实例初始化代码块,jvm在调用父类构造器之后会执行该代码
3.内部类除了可以继承类之外还可以实现接口
枚举是从java5开始提供的一种新的数据类型,是一个特殊的类,就是多个常量对象的集合
特点:
枚举类的特点:
1.枚举类直接父类为java.lang.Enum,但是不能显示集成Enum
2.枚举就相当一个类,可以定义构造方法,成员变量,普通方法,抽象方法
3.默认私有的构造方法,即使不写访问权限也是private
4.每个实例分别用一个全局变量来表示,枚举类的对象是固定的,实例个数有限,不能使用new关键字
5.枚举实例必须位于枚举体中最开始部分,枚举实例列表的后要有分号与其他成员相分隔
6.枚举实例后有花括号时,该实例时枚举类的匿名内部类对象
遇到的问题:没有实际代码来加强理解,怕是过段时间会遗忘
明天计划:
开始学习spring
评论