Java继承和方法重写

Java继承和方法重写,java,Java,这是我在研究继承时在网上找到的一个例子 class Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public cla

这是我在研究继承时在网上找到的一个例子

 class Animal {
       public void move() {
          System.out.println("Animals can move");
       }
    }

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   
      Animal b = new Dog();   

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}
我的主要困惑是主要方法中的行:动物b=新狗

我明白:

动物是类名 b是对象引用 内存分配的新方法 狗是构造函数调用 但“b”在哪里指得太准确了? 什么是动物b=新狗;做什么? 如果狗扩展了动物,为什么是动物b=新狗而不是狗b=新狗;? 如果我用狗b=新狗替换了那条线;,与动物b=新狗有什么区别

声明一个名为b的变量,用于存储动物对象。狗是一种动物吗?对所以一只狗可以被放进b。很好

如果狗延伸了动物,为什么它是动物b=新狗而不是狗b=新狗

如果这就是全部代码,那么没有明显的原因。编写代码的人认为,让我们这样做,他就这样做了

考虑到更多的上下文,编写代码的人可能希望以后存储其他动物,例如猫。如果他宣布它像狗b一样,他以后就不能把猫藏在里面了

另一个原因可能是为了证明多态性。它表明,是的,您确实可以将狗指定给动物变量。这是因为狗延伸了动物

那么动物b和狗b有什么区别呢

与当前代码没有区别。但是如果你在Dog中声明更多的成员,你就会看到不同。让我们来写一个叫做“狗吠”的方法。对于动物b,你不能接近树皮,但是对于狗b,你可以。这是因为对于前者,编译器认为b是动物,而不是狗。事实上,很难

声明一个名为b的变量,用于存储动物对象。狗是一种动物吗?对所以一只狗可以被放进b。很好

如果狗延伸了动物,为什么它是动物b=新狗而不是狗b=新狗

如果这就是全部代码,那么没有明显的原因。编写代码的人认为,让我们这样做,他就这样做了

考虑到更多的上下文,编写代码的人可能希望以后存储其他动物,例如猫。如果他宣布它像狗b一样,他以后就不能把猫藏在里面了

另一个原因可能是为了证明多态性。它表明,是的,您确实可以将狗指定给动物变量。这是因为狗延伸了动物

那么动物b和狗b有什么区别呢


与当前代码没有区别。但是如果你在Dog中声明更多的成员,你就会看到不同。让我们来写一个叫做“狗吠”的方法。对于动物b,你不能接近树皮,但是对于狗b,你可以。这是因为对于前者,编译器认为b是动物,而不是狗。事实上,这很难

使用Dog b=新狗没有什么错。 这只是创建一个Dog对象。 现在 动物a=新动物; 动物b=新狗


对象b即使有动物引用,也会在运行时创建Dog对象。因此,基本上可以使用超类引用实例化子类对象。因此,这只是用于显示方法重写,因为您可以使用超类引用调用子类方法move。

使用Dog b=new Dog没有任何问题。 这只是创建一个Dog对象。 现在 动物a=新动物; 动物b=新狗


对象b即使有动物引用,也会在运行时创建Dog对象。因此,基本上可以使用超类引用实例化子类对象。因此,这只是用于显示方法重写,因为您可以使用超类引用调用子类方法move。

的左手=表示变量b的declare类,右手是确切的类

类Dog扩展了类Animal,一个变量可以声明为父类并由子类实现

运行下面的代码,就可以得到正确的答案

动物的System.out.printlnb实例//符合事实的
狗的System.out.printlnb实例//true

的左边=表示变量b的declare类,右边是确切的类

类Dog扩展了类Animal,一个变量可以声明为父类并由子类实现

运行下面的代码,就可以得到正确的答案

动物的System.out.printlnb实例//符合事实的
狗的System.out.printlnb实例//true

Animal b=新狗的意思是,动物引用和狗对象?b引用的是狗的实例,但b充当的是动物的实例。。。披着羊皮的狼-欢迎使用多态性为什么要使用List=new ArrayList?将代码与特定实现解耦。动物和狗也一样。当你的狗变成猫时,你的代码只需要修改1处,因为使用动物仍然是正确的。@MaccenWright这在内部是什么意思?它是如何工作的?它引用了Animal类并为dog类创建了一个对象?我不明白
内部发生的事情。这是多态性和向上投射。动物b=新狗;这一行意味着您可以使用Animal类的接口,也就是说,您可以在编译时使用Animal的方法。但在运行时,Dog类的方法运行。Animal b=新的Dog意味着,Animal引用和Dog对象?b引用的是Dog的实例,但b充当的是Animal的实例。。。披着羊皮的狼-欢迎使用多态性为什么要使用List=new ArrayList?将代码与特定实现解耦。动物和狗也一样。当你的狗变成猫时,你的代码只需要修改1处,因为使用动物仍然是正确的。@MaccenWright这在内部是什么意思?它是如何工作的?它引用了Animal类并为dog类创建了一个对象?我无法理解内部发生了什么。这是多态性和向上投射。动物b=新狗;这一行意味着您可以使用Animal类的接口,也就是说,您可以在编译时使用Animal的方法。但在运行时,Dog类的方法会运行。您需要更多地强调良好的实践,比如编程到接口和松耦合,而不是说如果这就是所有代码,那么没有明显的原因。很好的解释。你需要更多地强调好的实践,比如编程到接口和松耦合,而不是说如果这些都是代码,那么没有明显的原因。很好的解释。
Animal b;