java内部类可以覆盖吗

若创建一个内部类,然后从封装类继承,并重新定义内部类,那么会出现什么情况呢?也就是说,我们有可能覆盖一个内部类吗?这看起来似乎是一个非常有用的概念,但“覆盖”一个内部类——好象它是外部类的另一个方法——这一概念实际不能做任何事情:
 

//: BigEgg.java
// An inner class cannot be overriden
// like a method

class Egg {
  protected class Yolk {
    public Yolk() {
      System.out.println("Egg.Yolk()");
    }
  }
  private Yolk y;
  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();
  }
} ///:~

默认构建器是由编译器自动合成的,而且会调用基础类的默认构建器。大家或许会认为由于准备创建一个BigEgg,所以会使用Yolk的“被覆盖”版本。但实际情况并非如此。输出如下:
New Egg()
Egg.Yolk()
这个例子简单地揭示出当我们从外部类继承的时候,没有任何额外的内部类继续下去。然而,仍然有可能“明确”地从内部类继承:
 

//: BigEgg2.java
// Proper inheritance of an inner class

class Egg2 {
  protected class Yolk {
    public Yolk() {
      System.out.println("Egg2.Yolk()");
    }
    public void f() {
      System.out.println("Egg2.Yolk.f()");
    }
  }
  private Yolk y = new Yolk();
  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()");
    }
    public void f() {
      System.out.println("BigEgg2.Yolk.f()");
    }
  }
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
} ///:~

现在,BigEgg2.Yolk明确地扩展了Egg2.Yolk,而且覆盖了它的方法。方法insertYolk()允许BigEgg2将它自己的某个Yolk对象上溯造型至Egg2的y句柄。所以当g()调用y.f()的时候,就会使用f()被覆盖版本。输出结果如下:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
对Egg2.Yolk()的第二个调用是BigEgg2.Yolk构建器的基础类构建器调用。调用
g()的时候,可发现使用的是f()的被覆盖版本。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, system
, public
, 一个
, println
, 内部
java方法覆盖
java 写文件 覆盖、java代码覆盖率工具、java覆盖和重载、java覆盖、java 覆盖文件,以便于您获取更多的相关知识。

时间: 2024-12-25 23:55:10

java内部类可以覆盖吗的相关文章

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来了,用起来相当方便.你不用去关心它后面做了些什么,执行了哪些命令,基于什么原理.然而也是这种过分的依赖往往让人散失了最基本的技能,当到了一个没有IDE的地方,你便觉得无从下手,给你个代码都不知道怎么去跑. 首先我在C盘上编写了一个InnerClassTest.java代码

Java内部类this$0字段产生的一个小bug

首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类BinomialHeapEntry,这个内部类的对象即二项堆中的每一个结点,除了包含结点对应的关键字外,还记录父节点parent,下一个兄弟结点sibling和第一个孩子结点child三个指针.二项堆的根表通过每棵二项树根节点的sibling指针链接. cloneBinomialTree(BinomialHea

Java内部类的继承(全)_java

下面通过实例代码给大家分享下有关JAVA内部类的继承,具体详解如下: Java内部类的构造器必须连接到指向其外围类对象的引用(构造内部类必须给它一个外部类对象的引用,内部类依赖于外部类对象),所以在继承内部类的时候,需要在导出类的构造器中手动加入对基类构造器的调用. 因为,在导出类实例化时,并不存在一个外围类对象,以让导出类的实例去连接到它. 所以,我们需要创建一个外围类,然后用一个特定的语法来表明内部类与外围类的关系. 在下例子中,需要给导出类InheritInner一个来自内部类的外围类中的

java重载与覆盖,新人求教

问题描述 java重载与覆盖,新人求教 如题Java重载与覆盖 麻烦大神给讲解一下,网上也查了资料但是还不是理解的特别透彻. 解决方案 重载是方法名一样,参数列表不同: 覆盖(重写),子类重写父类的方法,一般有Override关键字修饰: 看下这个多实践就应该能理解了.http://blog.csdn.net/fsz521/article/details/8739236 解决方案二: 方法重载:在一个类里面,相同功能乃至不同功能(必须是形式参数类型不同)的方法用同一个方法名来写的手段,例如 cl

java-本人新手求教 关于Java内部类的问题 请大神看图

问题描述 本人新手求教 关于Java内部类的问题 请大神看图 解决方案 就是将 entry 这个对象 加入到 entrys这个数组中去 , 每次夹的时候 都会 count 加1 解决方案二: 这个呢也不是内部类的问题,,就是entrys数组中放入entry对象,,count++就是count先赋值再自增 解决方案三: 将实例entry赋值给entry数组.具体不知道你具体想问什么? 解决方案四: 这个不是内部类的问题,是在一个类中定义了方法,然后把entry 的值赋给entrys 数组j进行前+

java内部类-java实验题 内部类的定义与使用

问题描述 java实验题 内部类的定义与使用 定义一个Cube类,其中包含一个变量height,一个方法:计算立方体的体积(带形参,形参为面积).并在其内部定义一个Rectangle类,其中包含两个变量width和height,一个方法:计算底面积. 解决方案 class Cube { private double height; Cube() {} Cube(double height) { this.height = height; } public double volume(double

java内部类总结

内部类是指在一个外部类的内部再定义一个类. 内部类作为外部类的一个成员,并且依附于外部类而存在的. 内部类可为静态,可用protected和private修饰.(而外部类不可以:外部类只能使用public和默认的). 内部类分为:成员内部类.局部内部类.静态内部类.匿名内部类 几种内部类的共性:A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号,比如Outer.class和Outer$Inner.class.B.内部类不能用普通的方

java内部类实例化错误

问题描述 java内部类实例化错误 请帮我看看下面出错的原因是什么?(粗体字部分) 为什么静态方法里不能直接调用内部类,成员方法却可以? package com.zcl5; class Quetion1 { class ATM { int myMoney = 100; int viewMoney(){ return myMoney; } void outMoney(int money){ myMoney=myMoney-money; } } public void m1(){ ATM atm=n

重写-JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法?

问题描述 JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? 解决方案 使用super.methodName();调用. Java中super关键字指代的是父类. this关键字指代的是自身. 解决方案二: 用super.方法名调用 解决方案三: 试试super.xxx 解决方案四: 直接用super.方法名调用对应的方法