码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-08-14 21:18:10      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:nbsp   ted   rate   输出   实例化   rgs   类的方法   div   一个   

内部类的继承

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匿名内部类的继承和覆盖

标签:nbsp   ted   rate   输出   实例化   rgs   类的方法   div   一个   

原文地址:http://www.cnblogs.com/lovefoolself/p/7359890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!