【问题标题】:Multiple Inheritance in Java, class inside classJava中的多重继承,类中的类
【发布时间】:2011-06-11 08:01:46
【问题描述】:

我们知道在 Java 中没有多重继承,你将如何用这个例子来证明它的合理性。

Class A 

{

      has some features

     Class B extends Class C 
        {

              I can access A + C's features, B is child of two parents?
         }

}

【问题讨论】:

  • B 是 C,B 不是 A。你可以在别处将 B 用作 C,但不能将其用作 A。
  • 是的,所以 B 能够继承两个类的属性/特征? ?
  • 这叫做委托,是继承的替代品。假设你继承了你父亲的姓氏,但你可以请你最好的朋友帮助你,但这并不意味着你也有你最好朋友的姓氏。
  • +1 -- 我明白为什么这会让学习 Java 的人感到困惑
  • 非静态内部类使用委托模拟多重继承。它“感觉”像 MI,在某些情况下可能非常有用。

标签: java


【解决方案1】:

B 是相对于 A 的内部类。另一方面,它不是 A 的子类。

更准确地说,B 是一个非静态嵌套类(这使它成为一个内部类)。嵌套类是其封闭类的成员。内部类可以访问嵌套它们的类的所有成员。在封闭类的成员上声明的私有访问说明符不会阻止内部类访问该成员。

通过子类继承和通过内部类访问成员之间的区别在于成员的继承允许成员被隐藏(对于属性)和覆盖(对于方法)。内部类不能隐藏封闭类属性,它们可以访问它们。

为了进一步简化,请考虑以下代码示例:

class C
{
    void c()
    {}
}

public class A {

    void a(){}

        class B extends C
        {
            // a new member of B
            void b()
            {
            }

            //does not override A.a()
            void a()
            {
                a(); //invokes A.a() as B has access to it.
                super.a(); //illegal                
            }

            //overrides C.c()
            @Override
            void c()
            {
                super.c(); //invokes C.c()
            }
        }
}

请注意,您不能从嵌套类调用 super.a()。这就是继承成员和仅仅访问成员的区别。

进一步阅读

【讨论】:

  • 是的,所以B可以继承两个类的属性/特征?
  • @Randon,我添加了一段关于继承与仅访问类成员有何不同的段落。
【解决方案2】:

B 不是两个父母的孩子,它是 C 的“孩子”,但可以访问 A 的属性,它是 A 的一部分,但不是 A 的子类。
您可以运行以下代码来确定:

class Main {
    public void bar() {
        Object o = new B();
        System.out.println("is B subclass of Main:" + (o instanceof  Main));
        System.out.println("is B subclass of C:" + (o instanceof  C));
    }
    public class C { }
    public class B extends C { }
    public static void main(String[] argv) {
        Main a = new Main();
        a.bar();
    }
}

它将打印 false,因为 o(它是 B)对于第一个问题不是 instacneof Main,但对于第二个问题是 true,因为 B 是 C 的一个实例
编辑: 编辑了代码以使其更具可读性(至少在我看来..)

【讨论】:

  • 是的,所以B可以继承两个类的属性/特征?
  • @Randon:它可以访问它们,但它没有从 A 继承。看看我刚刚提供的代码,它“证明”C 不是 A 的子类。
【解决方案3】:

“多重继承”是指有多个直接的父级

在您的示例中,A 围绕 B,B 是 C 的父级,但这不会使 A 成为 C 的父级。

如果是多重继承,那么 A 和 B 都将是 C (C extends A, B) 的父级,而这在 Java 中无法做到。

(附带说明:在 Java 中,如果没有明确指定父级,则 java.lang.Object 会被静默使用。这就是每个方法都有一个 toString() 的原因)。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2010-11-08
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2017-02-04
    相关资源
    最近更新 更多