Think in java读书笔记之:java匿名内部类的继承和覆盖

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Think in java读书笔记之:java匿名内部类的继承和覆盖相关的知识,希望对你有一定的参考价值。

内部类的继承

Java中继承匿名内部类一个要结局的问题就是,内部类的构造器必须要指向其外围对象的引用,所以要采取特殊的语法。书上给的示例代码的可有编译版本,必须在继承的内部类的构造器内添加enclosingClassReference.super().

 1 class WithInner{
 2     class Inner{}
 3 }
 4 public class InheritInner extends WithInner.Inner{
 5 InheritInner(){
 6      enclosingClassReference.super();
 7 }
 8 InheritInner(WithInner wi){
 9 wi.super();
10 }
11 public static void main(String[] args){
12     WithInner wi = new withInner();
13     InheritInner i1 = new InheritInner(wi);
14 }
15 }

内部类的覆盖

在java中可以子类不需要什么特别的声明就可以覆盖父类的方法,但是如果要覆盖父类的内部类就必须指明覆盖的是谁。

代码块1和代码块2说明了这一点

class Egg{
    private Yolk y;
    protected class Yolk{
        public Yolk(){
            System.out.println("Egg.Yolk");
        }
    }
    public Egg(){
        System.out.println("New Egg()");
        y=new Yolk();
    }
}
public class BigEgg extends Egg{

    public class Yolk {
        public Yolk() {
            System.out.println("BigEgg.Yolk()");
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new BigEgg();
    }

}

代码块的输出是:New Egg(),Egg.Yolk()

如果要覆盖书上给出了下面的示例:

 1 public class Egg2 {
 2     protected class Yolk {
 3         public Yolk() {
 4             System.out.println("Egg2.Yolk()");
 5         }
 6 
 7         public void f() {
 8             System.out.println("Egg2.Yolk.f()");
 9         }
10     }
11 
12     private Yolk y = new Yolk();
13 
14     public Egg2() {
15         System.out.println("new Egg2()");
16     }
17 
18     public void insertYolk(Yolk yy) {
19         y = yy;
20     }
21 
22     public void g() {
23         y.f();
24     }
25 }

 

 1 public class BigEgg2 extends Egg2 {
 2 
 3     public class Yolk extends Egg2.Yolk {
 4         public Yolk() {
 5             System.out.println("BigEgg2.Yolk()");
 6         }
 7 
 8         public void f() {
 9             System.out.println("BigEgg2.Yolk().f()");
10         }
11 
12     }
13 
14     public BigEgg2() {
15         insertYolk(new Yolk());
16     }
17 
18     public static void main(String[] args) {
19         // TODO Auto-generated method stub
20         Egg2 e2 = new BigEgg2();
21         e2.g();
22     }
23 
24 }

这样写就明确的覆盖了类,当实例化BigEgg2(),不仅调用父类的构造方法,子类的方法也调用了,e2.g(),输出的不再是父类的f(),而是子类的。

 

以上是关于Think in java读书笔记之:java匿名内部类的继承和覆盖的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记《think in Java》①

Think in java读书笔记序列化

Think In Java读书笔记:内部类覆盖及其初始化

Think in java 笔记之 finalize() 函数

think in java 笔记

《Thinking in Java 4th Edition》读书笔记之1.1 抽象过程