以下是继承概念的测试程序。 如果我正在运行这个程序,那么o / p是“Im A的方法 - 1”,如果我删除了注释,那么输出是“Im b's method - 2”。
class A {
public void test(int x){
System.out.println("Im A's method - 1");
}
public void test(Integer x){
System.out.println("Im A's method - 2");
}
}
class B extends A{
public void test(Integer x){
System.out.println("Im b's method - 1");
}
// public void test(int x){
// System.out.println("Im b's method - 2");
// }
//
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
A a=new B();
a.test(2);
}
}
问题:
根据我的知识,它不应该扩展到A级。请纠正我!!!
答案 0 :(得分:2)
这是Java中dynamic binding
的典型案例。所以,在阅读本评论之后,您应该先阅读一些关于this
其次。它正在显示 Im A的方法 - 1 因为看看你的main
,你说A value = new B()
你说的是我有汽车和我希望它成为一辆汽车。
此外,您正在调用类型为int
而不是Integer
的值的方法,因此它会调用int
类B
中需要{{1}}的方法。< / p>
因为你没有这样的方法,所以它继续在超类中搜索它。
PS:如果你打算继续学习java并在java中工作,这是你在面试中会得到很多的问题
答案 1 :(得分:2)
当您在a
变量上调用方法时,它会调用B
类中定义的方法的版本(如果有);否则它将调用从A
继承的版本。
您使用文字编号2(test
而不是int
来调用Integer
。所以被调用的方法是test(int)
,而不是test(Integer)
。由于B
未定义test(int)
方法,因此会调用A
中的方法。
如果A
也没有test(int)
方法,则编译器会将int
转换为Integer
(这称为“自动装箱”)并查看对于可用的test(Integer)
方法。在这种情况下,您将从B
获得一个。但是当您传递int
时,任何可用的test(int)
方法(甚至是继承的方法)都优于test(Integer)
方法。
答案 2 :(得分:1)
覆盖在运行时得到解决,因此,在您的情况下,它总是会照看B类的对象。
A a = new B();
因此,一旦覆盖test()方法并运行main方法,将调用B的方法,否则将调用A的方法。
答案 3 :(得分:1)
看你何时
A a = new B();
B
中覆盖A
方法的所有方法都可以访问,而A
中未被B
覆盖的方法也可以访问。
所以
a.test(1); will print "Im A's method - 1"
a.test(new Integer(1)); will print "Im B's method - 1"
答案 4 :(得分:0)
这意味着什么?总是指向B类中的方法,或者它意味着什么?
是。当你写
A a=new B();
现在,当您在a
上调用方法时,会从类B
调用覆盖的实现。