面向对象(5)之内部类
1.内部类概述和访问特点
A:内部类概述
就是在一个类的内部
* B:内部类访问特点
* a:内部类可以直接访问外部类的成员,包括私有。
* b:外部类要访问内部类的成员,必须创建对象。
* 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
* C:案例演示
* 内部类极其访问特点
2.静态成员内部类
* static
* B:成员内部类被静态修饰后的访问方式是:
* 外部类名.内部类名 对象名 = 外部类名.内部类对象;
案例:
3.面试题
要求:使用已知的变量,在控制台输出30,20,10.
public class InnerClassTest { public static void main(String[] args){ //内部类创建对象方法 Outer.Inner a = new Outer().new Inner(); a.show(); } } class Outer{ public int num= 10; class Inner{ public int num=20; public void show(){ int num=30; System.out.print(num+","); System.out.print(this.num+",");//本类变量 System.out.print(Outer.this.num+",");//外部类变量 } } }
4.局部内部类访问局部变量的问题
* A:案例演示
* 局部内部类访问局部变量必须用final修饰
* 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug
案例:
5.匿名内部类的格式和理解
* A:匿名内部类
* 就是内部类的简化写法。
* B:前提:存在一个类或者接口
* 这里的类可以是具体类也可以是抽象类。
* C:格式:
*
new 类名或者接口名(){
重写方法;
}
* D:本质是什么呢?
* 是一个继承了该类或者实现了该接口的子类匿名对象。
* E:案例演示
* 按照要求来一个匿名内部类
案例:
public class Demo1_NoNameInnerClass { public static void main(String[] args){ Outer o = new Outer(); o.method(); } } interface Inter{ public void print(); } class Outer{ class Qff implements Inter{ public void print() { // TODO Auto-generated method stub } } public void method(){ new Qff(){ //实现Qff接口必须重写接口方法 整个相当于对象(自new开始到}.) public void print(){//重写方法 System.out.println("print"); } }.print(); } }