Java初学(七)

一、内部类

  1、内部类概述:把类定义在其他类内部,这个类被称为内部类(内部类可以使用static修饰,外部类不可)

  2、内部类访问特点:内部类可以直接访问外部类成员,包括私有的

               外部类要访问内部类的成员,必须创建对象

  3、内部类位置:

      成员位置:在成员位置定义的类,被称为成员内部类

      局部位置:在局部位置定义的类,被称为局部内部类

Java初学(七)_第1张图片

  4、成员位置内部类案例

    内部类和外部类没有继承关系

    通过外部类限定this对象

Java初学(七)_第2张图片

  5、局部位置内部类

    可以直接访问外部类成员

    在局部位置可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

    局部内部类访问局部变量必须用final修饰,原因:局部变量是随着方法的调用而调用,随着方法使用完毕而消失,而堆内存的内容不会立即消失(要等垃圾回收器空闲时才回收垃圾变量)。局部变量加final修饰后变为常量,经反编译可看到,局部内部类访问的变量直接是常量而非变量

 Java初学(七)_第3张图片

  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 }
匿名内部类面试题

 

你可能感兴趣的:(java)