当一个类扩展一个类时,我们可以在为子类对象分配内存时使用超类引用。 到目前为止我已经理解这样做是可以的,因为子类继承了其父类的数据,但它无法访问子类的成员,因为它只是引用,因此不知道添加了什么由孩子班完成。
我的问题是,当我将方法隐藏到上述概念中时,超类引用变量开始引用子类的函数。这是为什么 ?为什么它没有像它应该的那样称它为自己的方法?
class A{
void show(){ System.out.print("CLass A. \n"); }
}
class B extends A{
void show(){System.out.print("Class B. \n"); }
}
class Main{
public static void main(String[] args){
A a= new A();
B b= new B();
a.show(); // prints Class A
b.show(); // prints Class B
A a1= new B();
a1.show(); // print Class B. why is this ? it should be Class A as per theory?
}
}
答案 0 :(得分:2)
变量和方法是两回事。变量坚持其类型,其中方法根据提供的实现类型执行运行时。
<强>多态性即可。方法动态绑定并在运行时选择。如果你将它们设置为实现类,则会执行它们,否则类型类中的实现将被执行。
写作时
A a1= new B();
表示来自please call the implementations from the class B
类型的A
(位于右侧)
答案 1 :(得分:1)
您必须了解java中的覆盖概念。
关于覆盖的oracle documentation页面:
覆盖和隐藏方法
实例方法
具有相同签名(名称,加上其参数的数量和类型)的子类中的
instance method
和作为超类中的实例方法的返回类型会覆盖超类的方法子类覆盖方法的能力允许类从超类继承,其行为足够接近&#34;然后根据需要修改行为。
但是压倒不同于隐藏。
静态方法
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。
隐藏静态方法和覆盖实例方法之间的区别具有重要意义:
要理解的例子:
public class Animal {
public static void testClassMethod() {
System.out.println("The static method in Animal");
}
public void testInstanceMethod() {
System.out.println("The instance method in Animal");
}
}
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The static method in Cat");
}
public void testInstanceMethod() {
System.out.println("The instance method in Cat");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
输出:
The static method in Animal
The instance method in Cat
答案 2 :(得分:0)
它始终从最具体的类中调用该方法。