如果我有两个班,A和B,
public class A {
public int test() {
return 1;
}
}
public class B extends A{
public int test() {
return 2;
}
}
如果我这样做:A a1 = new B()
,那么a1.test()
会根据需要返回2而不是1。
这只是Java的一个怪癖,还是有这种行为的原因?
答案 0 :(得分:5)
这称为polymorphism。在运行时,将根据a1
的“真实”类型调用正确的方法,在这种情况下为B
。
正如维基百科所说的那样:
工业中多态的主要用法(面向对象 编程理论)是物体属于不同的能力 类型以响应同名的方法,字段或属性调用, 每一个都根据适当的类型特定行为。该 程序员(和程序)不必知道确切的类型 预先确定对象,因此确定的确切行为 运行时(这称为后期绑定或动态绑定)。
答案 1 :(得分:3)
不,这是正确的(这是由于多态性)。所有方法调用都在对象上运行,而不是引用类型。
此处您的对象属于B,
类型,因此将调用class B
的测试方法。
答案 2 :(得分:2)
这是polymorphism,更具体地说是Java overriding。如果要从类B调用A类测试方法,则需要使用super来调用超类方法。 e.g:
public class B extends A{
public int test() {
return super.test();
}
答案 3 :(得分:0)
这是预期的行为。 B类中的方法test()
将覆盖A类方法test()
。
答案 4 :(得分:0)
有关
A a1 = new B();
a1
指向B的对象,这是运行时的真实类型。因此,值从对象B打印。
答案 5 :(得分:0)
A obj = new A();
obj.test()
将返回1
A obj = new B();
obj.test()
将返回2
B obj = new B();
obj.test()
将返回2
正如其他答案中所述,这是多态性的工作原理。
This帖子可能会让事情变得更清晰
答案 6 :(得分:0)
Java使用动态绑定(或后期绑定),因此调用B
的方法,而不是A
。这与静态绑定相反。有一个很好的例子here。
答案 7 :(得分:0)
你将你的对象声明为A但是你的实例是B.所以将被调用的方法来自B类。如果你要在B中注释方法测试,B扩展A(我们可以说A是B的父级)然后回想一下这个方法,在这种情况下,调用的方法将从A类测试并返回1.