类;
面向对象思想,封装,继承,多态,this,super,static,final,权限
接口 抽象类
内部类;
内部类整体来说使用的比较少;但是是一个非常精妙的设计,一般高手都会用;
因为内部类有很多特性;
内部类定义:
当一个类,作为另一个类的类体存在,那么这个类就是内部类;
外部类定义:
包含了内部类的类,就是外部类;
.
内部类的四种形式:
成员内部类
静态内部类
局部内部类
匿名内部类
内部类 和 外部类的特性:
外部类 为 public 那么内部类还可以是公共类;
一个java文件有内部类和外部类,那么编译为class,每个类都对应着一个字节码文件,默认的名字是 外部类+$+内部类名字.class
成员内部类
成员内部类;
外部类不可以直接访问成员内部类的成员;
不是外部类的类不可以直接访问内部类的成员;
外部类需要创建对象才可以访问;
外部类创建内部类的对象:
在普通方法可以直接 new 内部类构造器();
在静态方法里不可以直接 new 内部类构造器;
1. 不可以在外部类的静态方法中,new 内部类构造器 来创建内部类的对象。
原因:静态的 要优先被加载,依附于类;
非静态的依附于对象,如果说对象不存在,那么可以认为非静态方法和非静态属性不存在;
成员内部类,依附于外部类的对象存在!
在静态的加载时,外部类的对象没有,进而得出内部类不存在!!
2. 外部类的静态方法里,得到内部类的对象;
2.1 先创建外部类的对象
Outclass outclass = new Outclass();
2.2 利用外部类的对象创建内部类的对象;
InnerClass innerClass = outclass.new InnerClass();
3. 在不是外部类的类中,创建内部类的对象;
3.1 先创建外部类的对象;
Outclass outclass = new Outclass();
3.2 利用外部类的对象创建内部类的对象;
OuterClass.InnerClass innerClass = outclass.new InnerClass();
如果不单独到内部类的包,那么用 外部类.内部类名 的类型;
得到内部类的对象,访问其成员的特殊之处:
外部类 即便是 私有化 private 修饰的成员;仍然可以使用 对象.方式访问;
成员包括:属性 构造器 方法
不是外部类的类,就要遵守权限的约束!
内部类可以直接访问外部类的成员,不受到权限的限制,可以直接访问外部类的静态成员;
外部类不可以直接访问成员内部类的静态成员;
成员内部类,不可以有静态成员:
但是可以给一个解决的方案,在属性上增加final;
1. 成员内部类 不可以有静态成员;
static 代表静态的 优先被加载的
成员内部类依附于外部类的对象存在;两者有矛盾
2. 增加了 final 就可以有静态的属性;
final 代表最终的,不变的,final修饰的属性时常量;
常量是在编译期的时候就确定的;
3. 成员内部类 可以被 static 修饰;
成员内部类 被 static 修饰之后 就变成了静态内部类
静态内部类的特性 和 成员内部类有很大的区别;
静态内部类
静态内部类
在 成员内部类的基础上,加上 static 修饰符;就变成了 静态内部类;
和 局部内部类,匿名内部类 没关系
静态内部类不依附于外部类对象,依附外部类;
因为静态内部类 相当于 外部类的静态成员;
外部类可以直接访问 静态内部类的 静态成员 内部类名.属性名
外部类不可以直接访问 非静态的成员;
非外部类的类,可以直接访问静态内部类的静态成员;
不可以直接访问非静态类的成员
外部类 和 非外部类的类 通过创建对象 才能访问 静态内部类的非静态成员;
创建静态内部类的对象
new 静态内部类构造器( [ 实参] )
外部类 InnerClass innerClass = new InnerClass();
非外部类的类OutClass.InnerClass innerClass = new OuterClass.InnerClass();
访问内部类权限上有何特殊之处?
外部类可以不考虑权限限制;
不是外部类的类,需要考虑权限;
静态内部类可以直接访问外部类静态成员;
可以创建外部类的对象,用对象访问非静态成员;
使用了静态内部类,不会导致外部类加载
内部类的意义:
真正的实现多继承;
内部类还要其他的应用场景;