public class A{
public void f(){
System.out.println("A.f()");
}
}
public class B extends A{
public void f(){
System.out.println("B.f()")
}
}
public class C{
public void g(A a){
System.out.println("g(A a)");
a.f();
}
public void g(B b){
System.out.println(g(B b));
b.f()
}}
然后运行:
C c=new C();
A a=new B();
c.g(a);
为什么结果是
g(A a)
B.f()
public void f(){
System.out.println("A.f()");
}
}
public class B extends A{
public void f(){
System.out.println("B.f()")
}
}
public class C{
public void g(A a){
System.out.println("g(A a)");
a.f();
}
public void g(B b){
System.out.println(g(B b));
b.f()
}}
然后运行:
C c=new C();
A a=new B();
c.g(a);
为什么结果是
g(A a)
B.f()
解决方案 »
- java串口RS-232开发的API ,要中文版的
- 关于String类和StringBuffer类一个深层次思考的问题,高手请进,谢谢!
- java操作文件 根据txt文件里的特殊字符替换另外特殊字符里面的东西(搞了两年java了,觉得这个问题最奇怪)
- 如何控制JEditorPane的大小
- Link List 的节点数据输出问题
- 求助:java编程中怎样才能将一串随机产生的int数字写入一个数组?
- 请教JAVA连接ORACLE8I问题
- 請問double類型中有沒有只取整數部分的方法.謝謝.
- 请问,扩展名为jar的文件是什么类型的文件?
- 如何用Jbuilder写一个最简单的helloworld程序,具体步骤是什么
- Java,出现空指针异常,求教原因。异常位置已用问号标示。谢谢
- 关于JAVA -==和equals的问题
A a=new B(); a实际上是B类型的对象,所以执行的时候只要B覆盖了基类的f方法,就会执行他自己的f
A a=new B();更是个最好的例子,编译时候看左边(的方法),运行看右边(的方法)。
对对我的问题就是为什么执行函数g()的时候 是执行g(A a)而不是g(B b)
对对我的问题就是为什么执行函数g()的时候 是执行g(A a)而不是g(B b)
这么和你解释,A a = new B();如果调用一个a.f();,他会先从父类中寻找这个方法,然后再查询子类是否重写了这个方法,如果重写了就用子类的,反之父类的
{
public void f()
{
System.out.println("A.f()");
}
}
public class B extends A{ //B是 A的子类,对继承自A父类的f方法不满意,重写了f方法。
public void f()
{
System.out.println("B.f()")
}
}
/*
C驱动类,等价与下面:
A a = new B();
a.f()
java中的方法默认都是虚方法,可以直接重写。由于B重写了父类A的f方法,所以,
即便是用父类A的引用a调用方法f,也是调用的B类实中的f。因为a指向的本身就是B类对像b。
这就是多台的表现。所以,应该注重引用的对象是什么类型,而不是引用变量是什么类型。
*/