为什么我们无法通过子类引用变量访问超类对象..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
}
}
任何人都可以帮忙吗?
答案 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