美文网首页
内部类的重载问题(基础)

内部类的重载问题(基础)

作者: 998584f56259 | 来源:发表于2016-08-18 10:22 被阅读146次

如果你创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被重载吗?这看起来似乎是个很有用的点子,但是“重载”内部类就好像它是外围类的一个方法,其实并不起什么作用:

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) {
       new BigEgg();
}
}

输出结果为:
New Egg()
Egg.Yolk()

缺省的构造器是编译器自动生成的,这里是调用基类的缺省构造器。你可能认为既然创建了BigEgg的对象,那么所使用的应该是被“重载”过的Yolk,但你可以从输出中看到实际情况并不是这样的。
这个例子说明,当你继承了某个外围类的时候,内部类并没有发生什么特别神奇的变化。这两个内部类是完全独立的两个实体,各自在自己的命名空间内。当然,明确地继承某个内部类也是可以的:

/**
 *程序输出结果:
 *Egg2.Yolk()
 *New Egg2()
 *Egg2.Yolk()
 *BigEgg2.Yolk()
 *BigEgg2.Yolk.f()
 */
class Egg2 {

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

       public void f() {
              System.out.println("Egg2.Yolk.f()");
       }
}

//Egg2.Yolk() 成员变量先于构造方法执行
private Yolk y = new Yolk();

//New Egg2() 父类构造方法先于子类构造方法执行
public Egg2() {
    System.out.println("New Egg2()");
}

public void insertYolk(Yolk yy) {
       y = yy;
}

public void g() {
       y.f();
}
}

public class BigEgg2 extends Egg2 {

public class Yolk extends Egg2.Yolk {
        
       
       public Yolk() {
              System.out.println("BigEgg2.Yolk()");
       }
       
      //BigEgg2.Yolk.f() 子类重载父类的构造方法
       public void f() {
              System.out.println("BigEgg2.Yolk.f()");
       }
}

//Egg2.Yolk() 父类构造方法先于子类构造方法执行
//BigEgg2.Yolk() 自己的构造方法后执行
public BigEgg2() {
    insertYolk(new Yolk());
}

public static void main(String[] args) {
       Egg2 e2 = new BigEgg2();
       e2.g();
}
}

现在BigEgg2.Yolk 通过extends Egg2.Yolk 明确地继承了此内部类,并且重载了其中的方法。Egg2 的insertYolk()方法使得BigEgg2 将它自己的Yolk 对象向上转型,然后传递给引用y。所以当g()调用y.f()时,重载后的新版的f()被执行。第二次调用Egg2.Yolk()是BigEgg2.Yolk 的构造器调用了其基类的构造器。可以看到在调用g()的时候,新版的f()被调用了。

相关文章

  • 内部类的重载问题(基础)

    如果你创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被重载吗?这看起来...

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • javah生成jni函数名的bug

    背景知识 JNI是什么? Resolving Native Method Names bug 函数重载和内部类类型...

  • 内/外部类加载顺序问题

    public class AA { private static int _var =1; { System.ou...

  • 内部类的继承问题(基础)

    1、因为内部类的构造器要用到其外围类对象的引用,所以在你继承一个内部类的时候,事情变得有点复杂。问题在于,那个“秘...

  • C++基础-(重载)

    C++基础 重载 哪些运算符可以被重载:::,.,->,*,?:不能被重载 重载操作符的标志(operator) ...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Swift 2 学习笔记 16.下标和运算符重载

    课程来自慕课网liuyubobobo老师 下标 下标基础 多维下标 运算符重载 运算符重载基础 重载比较运算符 自...

  • Java 内部类、静态内部类、方法内部类(未完待续)

    内部类 什么是内部类?内部类其实就是在一个类中创建的类。内部类有四种: 成员内部类 静态内部类 局部内部类 匿名内...

网友评论

      本文标题:内部类的重载问题(基础)

      本文链接:https://www.haomeiwen.com/subject/wtrvsttx.html