[英]java.upcasting
我有这个例子:
class One
{
public void testOne(){System.out.println("One!!!");}
public void testTwo(){System.out.println("One!!!");}
}
public class Jenia extends One
{
static void test(One o) {o.testOne(); o.testTwo();}
public static void main(String args[])
{
test(new One());
}
}
结果:
One!!!
One!!!
好的,没问题。
比,我尝试修改我的代码:
仅此方法:
public static void main(String args[])
{
test(new Jenia());
}
结果:
One!!!
One!!!
好的,我们得到这个结果是因为-这里是upcasting(Jenia-One)。
一切都还可以,但是,再次修改:在class Jenia override method
testOne`:
public void testOne(){System.out.println("Two!!!");}
所以我有这段代码:
class One
{
public void testOne(){System.out.println("One!!!");}
public void testTwo(){System.out.println("One!!!");}
}
public class Jenia extends One
{
public void testOne(){System.out.println("Two!!!");}
static void test(One o){o.testOne(); o.testTwo();}
public static void main(String args[])
{
test(new Jenia());
}
}
结果:
Two!!!
One!!!
我的问题:为什么两个! ?? 为什么我们不丢失重写方法?
多数民众赞成在所需的行为..调用哪种方法取决于运行时类型,而不是引用类型。 由于obect的类型是Jenia
的Jenia
版本testOne
被调用,即使是引用类型One
。 那是普通的老多态性。
因为就C ++ / C#而言,Java中的所有方法都是虚拟的,并且所有值都是通过引用传递的。 因此,当您调用某种方法时,引用的类型无关紧要,重要的是它所指向的对象的类型。 在您的情况下,对象是Jenia类型的,因此调用了Jenia方法。
请参阅注释中的说明
class One
{
public void testOne(){System.out.println("One!!!");}//method one
public void testTwo(){System.out.println("One!!!");}//method two
}
public class Jenia extends One
{
public void testOne(){System.out.println("Two!!!");}//method 3
static void test(One o){o.testOne(); o.testTwo();}//method 4
public static void main(String args[])
{
test(new Jenia());//calls method 4 which in turns calls 3 and 2.
}
}
}
当您在test
方法中调用o.testOne()
时,它会调用Jenia.testOne
因为o
是Jenia
的实例。 您可以通过o.getClass().getName();
进行检查o.getClass().getName();
。
此处覆盖的Java是教程http://download.oracle.com/javase/tutorial/java/IandI/override.html
public class A {
void print() {
System.out.println("A");
}
public static void main(String[] args){
A a1 = new A();
a1.print(); // A
A a2 = new B();
a2.print(); // B ! because it overrides print method
B b = new B();
b.print(); // B
}
}
class B extends A {
void print() {
System.out.println("B");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.