Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的多重继承,类中的类_Java - Fatal编程技术网

Java中的多重继承,类中的类

Java中的多重继承,类中的类,java,Java,我们知道在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的“孩子”,但可以访问a的属性,它是a的一部分,但不是它的子类。 您可以运

我们知道在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的“孩子”,但可以访问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)不是Main的instacneof,但对于第二个问题,它将打印为true,因为B是C的实例

EDIT:编辑代码以使其更具可读性(至少在我看来是这样)

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()。这就是继承成员和仅访问成员之间的区别

进一步阅读

“多重继承”指的是拥有一个以上的直接父代

在您的示例中,A包围着B,B是C的父级,但这并不意味着A是C的父级

如果是多重继承,那么A和B都将是C的父级(
C扩展了A,B
),而这在Java中是无法实现的


(作为旁注:在Java中,如果没有显式指定父类,那么Java.lang.Object将被静默使用。这就是为什么每个方法都有一个toString())。

是的,所以B可以继承两个类的属性/特性?@Randon:它可以访问它们,但不能继承自a。看看我刚才提供的代码,哪一个“证明”C不是a的子类。B是C,B不是a。你可以在其他地方用B作为C,你不能用它作为a。是的,所以B可以继承两个类的属性/特征?这就是所谓的委托,是继承的替代品。假设你继承了你父亲的姓氏,但是你可以请你最好的朋友帮你,但这并不意味着你也有你最好朋友的姓氏。+1--我明白为什么这会让学习JavaNon-static内部类的人感到困惑,使用委托模拟多重继承。它“感觉”像MI,在某些情况下非常有用。是的,那么B能够继承两个类的属性/特性吗?@Randon,我添加了一段关于继承与仅访问类成员有何区别的内容。