Java中的内部类
内部类
为什么会出现内部类:java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。
- 静态内部类
1.声明在类体部,方法体外,并且使用static修饰的内部类
2.访问特点可以类比静态变量和静态方法
3.脱离外部类的实例独立创建
在外部类的外部构建内部类的实例
new Outer.Inner();
在外部类的内部构建内部类的实例
new Inner();
4.静态内部类体部可以直接访问外部类中所有的静态成员,包含私有
- 成员内部类
1.没有使用static修饰的内部类。
2.在成员内部类中不允许出现静态变量和静态方法的声明。
static只能用在静态常量的声明上。
3.成员内部类中可以访问外部类中所有的成员(变量,方法),包含私有成员,如果在内部类中定义有和外部类同名的实例变量,访问:
OuterClass.this.outerMember;
4.构建内部类的实例,要求必须外部类的实例先存在
外部类的外部/外部类的静态方法:new Outer().new Inner();
外部类的实例方法:
new Inner();
this.new Inner();
- 局部内部类
1.定义在方法体,甚至比方法体更小的代码块中
2.类比局部变量。
3.局部内部类是所有内部类中最少使用的一种形式。
4.局部内部类可以访问的外部类的成员根据所在方法体不同。
如果在静态方法中:
可以访问外部类中所有静态成员,包含私有
如果在实例方法中:
可以访问外部类中所有的成员,包含私有。
局部内部类可以访问所在方法中定义的局部变量,但是要求局部变量必须使用final修饰。
- 匿名内部类
1.没有名字的局部内部类。
2.没有class,interface,implements,extends关键字
3.没有构造器。
4.一般隐式的继承某一个父类或者实现某一个接口
5.吃货老师讲的一个很生动的例子
/**
* @author gress 匿名内部类,我只会使用一次的类
* 假如我想吃一个泡面,但我不可能建一个厂,制造一个流水线,生产一包泡面之后就在也不去使用这个泡面厂了
* 所以这里引申出匿名内部类 ,而我们建立的泡面厂就像这里构建的一个类Pencil 铅笔类一样
*/
内部类避免内存泄露 文章地址
抽象类
1.方法:抽象方法
不能有方法体
抽象方法所在类一定是抽象类
抽象方法存在就是被覆盖的,如果子类继承带有抽象方法的抽象类,必须对所以的抽象方法进行覆盖
2.类 :抽象类
抽象类不能被实例化
抽象类是对类的抽象,抽象所具有的共有特征和行为
抽象类所存在的目的就是用来被继承,实现代码的复用
抽象类可以有抽象方法也可以没有抽象方法,可以像普通的一个类具有成员变量和方法
如果一个类继承抽象类,必须实现抽象父类的抽象方法,或者子类也是一个抽象方法
接口
1.接口是比抽象类还抽象的存在,接口是抽象类的极致抽象。
2.接口中所有的方法都是public abstracht,接口中所有的变量都是public static final
3.接口主要用来定义标准。
4.接口可以多继承。一个类可以实现多个接口。
5.接口的存在本身可以规避java不能多继承的操作特点。
参考文章 链接地址