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实例//trueAnimal 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;