Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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_Inheritance - Fatal编程技术网

询问Java中的继承

询问Java中的继承,java,inheritance,Java,Inheritance,假设我的情况如下: class Base{ public Base() { System.out.println("Base"); } } class Derived extends Base{ public Derived(){ System.out.println("Devired"); } } class DeriDerived extends Derived{ public DeriDerived(){

假设我的情况如下:

class Base{

    public Base() {
        System.out.println("Base");
    }

}


class Derived extends Base{

    public Derived(){

      System.out.println("Devired");
    }
}


class DeriDerived extends Derived{
    public DeriDerived(){
      System.out.println("DeriDevired");
    }
}
我不太清楚继承是如何工作的,例如,如果我尝试:
Derived b=new-Derived()
derivered b1=新的derivered(),它们都生成相同的结果

对于第二种情况:
derivered b1=new derivered()我所理解的(可能是正确的,可能不是???)DeriDerived将调用其派生的超类,而Deviled将再次调用其基础的超类,因此最后我们将得到类似于:Based/Devired/DeriDerived的结果

但对于第一种情况,我不明白它是如何工作的,以获得与基于/偏差/衍生相同的结果

谁能帮我解释一下吗


非常感谢你

两个对象都是派生对象的实例,因此它们的行为相似。
它们只共享同一个构造函数。
但是,如果类中有其他方法,则只能访问派生类和基类中的方法(在第一种方案中),而在第二种方案中,可以访问父类中的所有方法。

不建议这样做,因为这会给代码带来一些歧义。

这两个对象都是派生对象的实例,因此它们的行为类似。
它们只共享同一个构造函数。
但是,如果类中有其他方法,则只能访问派生类和基类中的方法(在第一种方案中),而在第二种方案中,可以访问父类中的所有方法。

不建议这样做,因为这样会给代码带来一些歧义。

在java中,保存对对象引用的变量不会影响对象的创建

在所有情况下,您都在调用
derivered
构造函数,但这样创建的对象可以按类型引用:derivered、Devired、Base、object

但在每种情况下,您都有不同的方法可见性


因此,当您将创建derivered的实例,但由Devired引用它时,您将只能访问Devired和基类中的方法。您将不会看到来自DeriDerived类的方法,尽管这将是对同一对象->DeriDerived的引用。

在java中,保存对对象引用的变量不会影响对象的创建

在所有情况下,您都在调用
derivered
构造函数,但这样创建的对象可以按类型引用:derivered、Devired、Base、object

但在每种情况下,您都有不同的方法可见性


因此,当您将创建derivered的实例,但由Devired引用它时,您将只能访问Devired和基类中的方法。您将不会看到DeriDerived类中的方法,尽管这将是对同一对象->DeriDerived的引用。

当您创建对象时

 Derived d=new DeriDerived()
内部默认构造函数的第一个语句是super()

super关键字还可用于调用父类构造函数。构造函数从下到上调用,从上到下执行

  • DeriDerived()构造函数作为DeriDerived调用派生()构造函数 构造函数的第一个语句是super(),它调用父构造函数,即 派生()构造函数

  • 对Base()构造函数的派生()构造函数调用

  • Base()构造函数调用对象类构造函数,因为对象是父类

  • 但在以下层次结构中执行Base()-->Derived()-->derivered()

    调试此代码

    class Base{
    
        public Base() {
             super();
            System.out.println("Base");
        }
    }
    
    
    class Derived extends Base{
    
        public Derived(){
         super();
    
          System.out.println("Devired");
        }
    }
    
    
    class DeriDerived extends Derived{
        public DeriDerived(){
           super();
          System.out.println("DeriDevired");
        }
    }
    

    创建对象时

     Derived d=new DeriDerived()
    
    内部默认构造函数的第一个语句是super()

    super关键字还可用于调用父类构造函数。构造函数从下到上调用,从上到下执行

  • DeriDerived()构造函数作为DeriDerived调用派生()构造函数 构造函数的第一个语句是super(),它调用父构造函数,即 派生()构造函数

  • 对Base()构造函数的派生()构造函数调用

  • Base()构造函数调用对象类构造函数,因为对象是父类

  • 但在以下层次结构中执行Base()-->Derived()-->derivered()

    调试此代码

    class Base{
    
        public Base() {
             super();
            System.out.println("Base");
        }
    }
    
    
    class Derived extends Base{
    
        public Derived(){
         super();
    
          System.out.println("Devired");
        }
    }
    
    
    class DeriDerived extends Derived{
        public DeriDerived(){
           super();
          System.out.println("DeriDevired");
        }
    }
    

    请参见创建两个对象中的 派生b=新的派生()衍生b1=新衍生()

    您调用的是相同的引用,这意味着使用引用调用,即使用b或b1,它们都在创建相同的实例,这就是它们给出相同结果的原因

    如果您想有所不同,那么在每个类中创建公共方法,并尝试使用引用进行访问


    使用子类引用(即使用b1)可以访问派生类方法,但使用超类引用(即使用b)将无法访问子类(派生)类方法参见两个对象的创建 派生b=新的派生()衍生b1=新衍生()

    您调用的是相同的引用,这意味着使用引用调用,即使用b或b1,它们都在创建相同的实例,这就是它们给出相同结果的原因

    如果您想有所不同,那么在每个类中创建公共方法,并尝试使用引用进行访问


    使用子类引用(即使用b1)可以访问派生类方法,但使用超类引用(即使用b)将无法访问子类(派生)类方法

    在两个示例中调用相同的构造函数。为什么它会生成不同的结果?存储构造函数结果(实例)的变量类型不会影响构造。它将只定义框的类型,然后定义可访问的属性(方法、变量)。但是您仍然创建相同的类型