一、内部类
1、内部类概述:把类定义在其他类内部,这个类被称为内部类(内部类可以使用static修饰,外部类不可)
2、内部类访问特点:内部类可以直接访问外部类成员,包括私有的
外部类要访问内部类的成员,必须创建对象
3、内部类位置:
成员位置:在成员位置定义的类,被称为成员内部类
局部位置:在局部位置定义的类,被称为局部内部类
4、成员位置内部类案例
内部类和外部类没有继承关系
通过外部类限定this对象
5、局部位置内部类
可以直接访问外部类成员
在局部位置可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
局部内部类访问局部变量必须用final修饰,原因:局部变量是随着方法的调用而调用,随着方法使用完毕而消失,而堆内存的内容不会立即消失(要等垃圾回收器空闲时才回收垃圾变量)。局部变量加final修饰后变为常量,经反编译可看到,局部内部类访问的变量直接是常量而非变量
6、匿名内部类(内部类的简化写法)
前提:存在一个类或者接口(这里的类可以是具体类也可以是抽象类)
格式: new 类名或者接口名(){
重写方法;
}
本质:是一个继承了该类或实现了该接口的子类匿名对象
案例:
1 interface Inter { 2 public abstract void show(); 3 public abstract void show2(); 4 } 5 class Outer { 6 public void method() { 7 Inter i = new Inter() { //多态 8 public void show() { 9 System.out.println("show"); 10 } 11 12 public void show2() { 13 System.out.println("show2"); 14 } 15 }; 16 17 i.show(); 18 i.show2(); 19 } 20 } 21 class InnerClassDemo6 { 22 public static void main(String[] args) { 23 Outer o = new Outer(); 24 o.method(); 25 } 26 }
7、
匿名内部类面试题:
按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
1 interface Inter { 2 void show(); //public abstract void show(); 3 } 4 class Outer { 5 //补齐代码 6 public static Inter method() { 7 //子类对象 -- 子类匿名对象 8 return new Inter() { 9 public void show() { 10 System.out.println("HelloWorld"); 11 } 12 }; 13 } 14 } 15 class OuterDemo { 16 public static void main(String[] args) { 17 Outer.method().show(); 18 /* 19 1:Outer.method()可以看出method()应该是Outer中的一个静态方法。 20 2:Outer.method().show()可以看出method()方法的返回值是一个对象。 21 又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。 22 */ 23 } 24 }