通过子类引用变量访问超类​​对象

时间:2014-06-26 14:01:45

标签: java

为什么我们无法通过子类引用变量访问超类​​对象..i有一个代码来讨论我的问题。

class A
{ 
     void    set()    
  {
    System.out.println("i am in a");
  }
}

class B extends A
{
   void set()
  {
    System.out.println("i am in b");
  }

  public static void main(String args[])
  {  
     A instance=new B(); //line 
     instance.set();  //this would call set() in B.
     B in=new A(); //But this line gives error
  }
}

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

子类可能包含超类不具备的成员,因此不允许将超类实例分配给子类引用。
想象一下B有另一种方法subMethod()。如果您可以将A实例分配给B引用,则可以编写以下代码:

B example = new A();
example.subMethod();

会破坏,因为A没有subMethod()

反之亦然,因为子类总是拥有超类所拥有的一切。

另请注意,static方法无法覆盖,只有实例方法具有多态性。

答案 1 :(得分:1)

再举一个类似于你的问题的例子,

class Animal
{ 
     void set()    
  {
    System.out.println("i am in animal");
  }
}

class Dog extends Animal
{
   void set()
  {
    System.out.println("i am in dog");
  }
  void bark(){
  System.out.println("woof woof");
  }

  public static void main(String args[])
  {  
     Animal instance=new Dog(); //line 
     instance.set();  //this would call set() in B.
     Dog in=new Animal(); //But this line gives error
  }
}

继承遵循is-a关系,现在我们可以说Dog extends Animal and Dog is-a Animal。那讲得通。但是Animal is-a Dog没有意义。

当您编写Animal instance=new Dog();时,您正在为Dog参考分配一个Dog对象,听起来很直观,LHS(Animal实例)也是参考变量,参考变量的工作是决定什么调用对象的函数(那些在Animal中出现的类似set()),你不能使用实例调用bark()方法,因为它是Animal引用类型,是的但你可以调用set(),因为它存在于Animal类中。现在有两个版本的set()一个出现在类Animal和类Dog中,现在哪一个调用取决于RHS(new Dog();),因为RHS是一个实例,类型为Dog() ,将调用Dog中的set()版本。总而言之,请在注释中查看以下代码和输出: -

Animal a1=new Animal();
a.set();// output- i am in animal

Dog d1=new Dog();
d.set(); //output- i am in dog
d.bark; //valid and output- woof woof

Animal a2=new Dog();
a2.set();//output- i am in dog
a2.bark();// compilation error, you cannot refer to this method since it is not present in Animal class.

Dog d2=new Animal(); // compilation error

答案 2 :(得分:0)

继承是分层的。

您可以使用Person方法创建课程Karl extends Person和课程sayName()

然后当您创建Karl时,它将适合Person个变量,但不是每个Person都是Karl

如果要显式调用超类,可以在类saySuperName()中创建一个函数Karl,在其中调用super.sayName()

另请参阅:http://docs.oracle.com/javase/tutorial/java/IandI/super.html