当前位置: 首页 > 面试题库 >

涉及内部类时,Java继承如何工作

龙亮
2023-03-14
问题内容

当存在内部类时,我很难理解继承在Java中的工作方式。我目前正在处理一些子类需要稍微更改其父类的内部类功能的事情。我在下面提出了一个更简单,类似的示例。

我希望此代码可以打印“我是ChildClass.InnerClass”,但可以打印“我是ParentClass.InnerClass”。为什么是这样?另外,如果我将main中的obj对象更改为ChildClass类型,则输出将更改为“我是ChildClass.InnerClass”。为什么是这样?

通常,建议的改变对象父类内部对象行为的方法是什么?

class InnerClassTest {
   //-----------------------------------------------------------------------
   // PARENT CLASS
   class ParentClass {
      public ParentClass() {
         x = new InnerClass();
      }

      InnerClass x;

      class InnerClass {
         public void speak() {
            System.out.println("I am a ParentClass.InnerClass");
         }
      }
   }

   //-----------------------------------------------------------------------
   // CHILD CLASS
   class ChildClass extends ParentClass {
      public ChildClass() {
         x = new InnerClass();
      }

      InnerClass x;

      class InnerClass extends ParentClass.InnerClass {
         public void speak() {
            System.out.println("I am a ChildClass.InnerClass");
         }
      }
   }

   //-----------------------------------------------------------------------
   // MAIN
   public static void main(String[] args) {
      ParentClass obj = (new InnerClassTest()).new ChildClass();
      obj.x.speak();
   }
}

问题答案:

变量不像方法那样“被覆盖”。

在您的通话中,您希望x成为Child的人,但这不是因为x是变量,而不是方法。

但要注意:你的引用类型是ParentClass这样obj.x指向ParentClassInnerClass属性,即使真正的实例背后parentClass是一个ChildClass

为了显示您期望的句子,您必须将类型引用更改为ChildClass

public static void main(String[] args) {
      ChildClass obj = (new InnerClassTest()).new ChildClass();
      obj.x.speak();
}

为了更好地理解该概念,请尝试在ParentClassChildClass类中都定义一个方法:

public InnerClass getInnerClass(){
  return x;
}

x私有化。

因此,“替代概念”适用。

在这种情况下,您的最终通话是:

ParentClass obj = (new InnerClassTest()).new ChildClass();
obj.getInnerClass().speak();

要更改内部类的行为,请考虑使用 模板方法 模式或更佳的 方法策略模式 (因为更加尊重DIP)



 类似资料:
  • 问题内容: 我有一个(对我而言)复杂的Java泛型问题。我通读了一些文档,并了解了一些,但不是全部。基本上,对我来说,尝试解决它会导致尝试和错误。 在下文中,我给出了代码的精简示例,一次没有任何泛型(这样一个人就可以希望理解我想要实现的目标),而另一个则有一些更接近解决方案的补充。请更正我的第二个版本和/或指向特定的文档。(我有Java泛型的常规文档。但是我的代码似乎遇到了一些干扰性的挑战,因此很

  • 我正在阅读关于从内部类继承的内容,我一直在努力理解下面的代码是如何工作的: 据我所知,关键字Super指的是超类,Super()指的是它没有参数构造函数。在外层类的情况下,超类是Object类。 我想了解一下,这段代码是如何工作的。 为什么Object类的实例化使扩展内部类成为可能? 创建Object类实例与创建外层类对象有什么关系? 删除包含"o.super();"的行会导致错误: java:包

  • 问题内容: 我们有下课: 输出为: 超 子 问题: 什么礼物?是父级的对象,哪个孩子作为字段保留? 如果是这样,抽象类的继承如何工作?您不能创建抽象类的实例。 如果不是,重写方法在哪里保留? 我尝试使用Google,但发现的只是关于如何继承类的常见信息。 更新: 您仍在告诉我明显的事情。也许我的问题没有引起误解,但我将尝试改写一下: 当我们使用调用方法时,您说的是,我们正在访问父级的方法。但是,如

  • 我尝试了下面的代码,根据它,我理解内部类继承到OuterClass的子类。是正确的吗? 输出除外: 2. 奥特你好。内部的 当这行代码运行时,它应该意味着内部类被继承给了ChildClass 我很困惑,因为我在链接上发现了下面的语句 当外部类由其子类扩展时,成员内部类将不会继承到子类。若要在外部类的子类内使用内部类属性,子类还必须具有内部类,并且该内部类必须扩展外部类的内部类。

  • 假设类“X”映射到表“X”,类“A”映射到表“A”,类“B”映射到表“B”。 表X结构:(X\u ID,其他一些列表A结构:(A\u ID,X\u ID,其他一些列)表B结构:(A\u ID,其他一些列)。。。表B也有一个\u Id “B”类扩展了“A”类。我们将它们的映射文件都设置为: “A”类父映射文件: “B”类映射文件: 现在,我有一个SQL查询,如下所示,我需要使用Hibernate标准

  • 我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。 有三个文件: 1. Person.java-基类2. Student.java-派生的Person.java3. Family.java-不太确定,我认为这是它自己的基类 人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equal