代码如下:
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
};
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
System.out.println("B --> public void fun3(){}") ;
}
};
class C extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("C --> public void fun1(){}") ;
}
public void fun5(){
System.out.println("C --> public void fun5(){}") ;
}
};
public class PolDemo05{
public static void main(String asrgs[]){
fun(new B()) ; // 传递B的实例
fun(new C()) ; // 传递B的实例
}
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
};
问题:
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
谢谢!
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
};
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
System.out.println("B --> public void fun3(){}") ;
}
};
class C extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("C --> public void fun1(){}") ;
}
public void fun5(){
System.out.println("C --> public void fun5(){}") ;
}
};
public class PolDemo05{
public static void main(String asrgs[]){
fun(new B()) ; // 传递B的实例
fun(new C()) ; // 传递B的实例
}
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
};
问题:
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
谢谢!
解决方案 »
- 关于jtable的editor
- 请问 编译时如何跳过有语法错误的代码,比如一个方法内部的代码有错误,那么编译时跳过这个方法,编译剩下的代码。
- 变量和变量的值..与健值对的健,与值,有什么区别
- java怎么实习类似搜索提示的东西
- 请问:哪一本教材上讲UML各种图是结合C#代码或VB代码讲解的。只有uml图与代码结合起来才有利于理解依赖、聚合、...等等概念的实用之处
- 求助~~环境变量和注册表问题!!
- 不明白?为何总是这样?
- 请大家帮忙, 程序出现ClassCastException
- 已经设置了setOpaque怎么还不透明?
- 用jbuilder6 开发 database application时遇到点问题,请指教(在线等)
- 请教高手 怎样 在代码中加载一个Jar包
- 【HtmlParser】提取网页的meta信息
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
1,这段代码是里的a是A的对象的对象
但fun(new B()) ; // 传递B的实例
fun(new C()) ; // 传递B的实例调用了这个方法public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}并传递了两个对象 所以调用的是B类和C类中重写过的方法 先调用的是fun(new B())可以看成 A a=new B() 然后找A类的fun1方法 发现被覆盖了 就是在A类中该方法已经不存在了 所以调用的是B类的fun1方法 下面的也同上 解释语言不是很流畅 楼主谅解
定义的是A类的对象,传实参传的是B的实例,所以调用的是B的方法,要不怎么能实现多态?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
是的
三点建议:
1:楼主再认真看一下多态,A a是形参,实参你传入的是B的实例
2:代码格式调整一下,方便他人阅读
3:做人要厚道,问题解决了要结贴
现在你需要一个苹果,也就像方法需要一个参数。public void fun(A a);A你可以看成是你需要的苹果,
现在呢有一个是青苹果(酸的),有一个是红苹果(甜的)。
如果这个时候给你的是青苹果,那么你就咬一口觉得是酸的。
如果给你是红苹果,那么你咬一口觉得是甜的。
那么青苹果就像B对象,红苹果也就相当于是C对象。
而酸的,甜的。也都是他们各自的方法咯。不知道这样说你能理解吗
根据实际类型调用其相应的方法。所以调用fun1()方法是
子类中重写过的内容。
2.是。
public static void main(String asrgs[]){
A b = new B();
a.fun1() ;
A c = new C();
c.fun1() ;
}
} 这样会好理解点吧。