超类引用的子类变量?

时间:2016-02-16 08:56:57

标签: java inheritance overloading method-hiding

当一个类扩展一个类时,我们可以在为子类对象分配内存时使用超类引用。 到目前为止我已经理解这样做是可以的,因为子类继承了其父类的数据,但它无法访问子类的成员,因为它只是引用,因此不知道添加了什么由孩子班完成。

我的问题是,当我将方法隐藏到上述概念中时,超类引用变量开始引用子类的函数。这是为什么 ?为什么它没有像它应该的那样称它为自己的方法?

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? 
 }
}

3 个答案:

答案 0 :(得分:2)

变量和方法是两回事。变量坚持其类型,其中方法根据提供的实现类型执行运行时。

<强>多态性即可。方法动态绑定并在运行时选择。如果你将它们设置为实现类,则会执行它们,否则类型类中的实现将被执行。

写作时

 A a1= new B();

表示来自please call the implementations from the class B类型的A(位于右侧)

答案 1 :(得分:1)

您必须了解java中的覆盖概念。

关于覆盖的oracle documentation页面:

覆盖和隐藏方法

实例方法

  

具有相同签名(名称,加上其参数的数量和类型)的子类中的instance method和作为超类中的实例方法的返回类型会覆盖超类的方法

     

子类覆盖方法的能力允许类从超类继承,其行为足够接近&#34;然后根据需要修改行为。

但是压倒不同于隐藏。

静态方法

如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。

隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

  1. 被调用的重写实例方法的版本是子类中的版本。
  2. 被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。
  3. 要理解的例子:

    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)

它始终从最具体的类中调用该方法。