请问一下代码执行的结果为什么是hello hello hello?请详细说明,谢谢
public class A{
protected void hello(object a){
System.out.println("hello tom");
}
}
public class B extends A{
protected void hello(String s){
System.out.println("hello mike");
}
protected void hello(Object o){
System.out.println("hello");
}
public static void main(String[] args){
Object arg1 = "AAA"; B b = new B();
b.hello(arg1); A a = new B();
a.hello(arg1); String arg2 = "ABC";
a.hello(arg2);
}
}
public class A{
protected void hello(object a){
System.out.println("hello tom");
}
}
public class B extends A{
protected void hello(String s){
System.out.println("hello mike");
}
protected void hello(Object o){
System.out.println("hello");
}
public static void main(String[] args){
Object arg1 = "AAA"; B b = new B();
b.hello(arg1); A a = new B();
a.hello(arg1); String arg2 = "ABC";
a.hello(arg2);
}
}
对于你这段代码.
1.对于
B b = new B();
b.hello(arg1);
创建的是类B的实例,自然会使用B中的方法.2.对于
A a = new B();
a.hello(arg1);
声明的是父类,但是创建的是子类的实例,这个时候是对hello(Object)方法的覆盖。
即还是会使用子类的方法.3.对于
A a = new B();
String arg2 = "ABC";
a.hello(arg2);父类A中只有一个 hello(Object)方法,你在使用 a.的时候也只能看到这个方法.
而子类B中的 hello(String)对于父类是不可视的,之所以能运行是因为String类本身就是Object类的子类.
子类到父类可以进行自动的类型转化,所以3其实和2是一样的.
你可以把B中的方法改成 hello(int).你看能不能调用到.以上是个人看法,希望高手批评。
a.hello(arg1);
// 同理,a.hello(arg2)也是调用B的hello(Object object)方法,只不过是先把args2转型为Object了
String arg2 = "ABC";
a.hello(arg2);