关于 java 中 多态和继承的关系

class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A...{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B...{}
class D extends B...{}
(二)问题:以下输出结果是什么?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
a1.show(b)里面的b参数是什么意思 , A a2= new B(); a2为 A类型 但是b是B的实例,为什么不能调用B的方法。 求详细解答每个输出的结果 这个概念上有点迷糊 多谢
再比如⑧,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为"B and B”。
上面是解答 但是我不明白 前面在类B找show(C obj)方法, 为什么后面又提到到B里面找show(B obj)方法。

第一个问题是纯概念性的,baidu下继承,多态,只是个概念,不理解作用也不大
第二个Aa,Ab,Ac继承A
那么就有A a=new Aa(),A a=new Ab(),A a=new Ac()就是所说的父类引用指向子类对象,因为程序里有时候需要根据实际运行情况、参数决定去指向哪一个具体的子类(程序员并不能知道运行时使用者具体的选择),由子类里重写的方法去执行处理过程。比如A类是父类,有函数print(),Aa里重写print(),输出了Aa,Ab里重写print(),输出了Ab,Ac里重写print(),输出了Ac,这里可能要了解下mvc模式,前面这样的A,Aa,Ab,Ac可能就是m层,然后编写c层代码是会根据v层传回的参数决定A a=new A*,也就是父类引用a具体指向哪个子类的对象,然后调用a的print()去执行处理,将结果传回给v层去显示。可能你有疑问是干吗要用继承,我直接根据传回的参数是哪个,就实例化哪个子类就执行哪个子类的方法就行了,不需要用父类引用指向子类对象这样的方法。但是实际情况是,在c层里对象是传递的,可能实例化是在这个类里,调用就跑到另一个类里面去了,实例化的类知道a是Aa,还是Ab,还是Ac,但是调用的类呢,这时候调用的类就不需要关心是哪个了,因为知道a是A的引用,有个print()是需要调用的就行了。这个可能解释的有点乱,等你了解mvc时结合一下就可以发现区别了
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-02
你只要搞懂下面的就行了。
class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
A a=new B(); //省略了 向上转型是自动的。
return ("A and A");
}
}
第2个回答  2012-08-01
哎 看着 这个 要解释 好多字
给你结果
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D本回答被网友采纳
第3个回答  2012-08-01
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
B and B追问

有一点很迷糊 A a1=new A(); a1的类型为A 但是 b又是 B的实例, 那么、a1.show(b) 到底是去 A里面找方法 还是B里面找方法

追答

去A里边找方法喽

继承和多态的关系
Java中继承和多态的关系为:继承是指子类继承父类中所有的属性和方法,但对于private的属性和方法,子类虽然可以继承,却无法访问。而多态是指父类的某个方法被子类重写时,可以各自产生自己的功能行为。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概...

为什么要使用java的继承与多态?使用java的继承与多态的好处是什么?
继承和多态是面向对象的几大特性之一 继承:如果你的多个类中具有相同的属性,就可以把那些相同的属性提取出来做为父类,其他那些类继承父类,子类将会拥有你类的所有的非私有的属性和方法,这样即可以减少代码的冗余,又增强了代码的可读性和健壮性 多态:多态分为静态的多态和动态的多态,静态的多态是...

java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多...
在 Java 中,多态主要通过继承和接口实现来实现。在上述示例中,A a = new C(); 就是一个多态的应用。因为在这里,A 类型的引用变量 a 可以指向 C 类型的实例对象,这就是多态的一种表现形式。通过多态,可以实现代码的灵活性和可扩展性,让代码更加优雅和易于维护。

封装、继承、多态之间的关系是什么?
3、多态 就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

java语言中继承的特点是什么?多态有什么好处?
2、多态:方法的覆盖(方法的重写overriding)、方法的重载(overload)3、封装一.继承 继承就是子类对父类的继承.包含父类的方法,还可以添加自己独有的方法。二.多态 方法名称允许相同,但根据传入参数的类型,个数不同形成多态的形式. 方法覆盖要满足5个条件:(方法覆盖:存在继承关系)1、...

继承与多态的关系?
在C++中允许定义类之间的继承关系。当一个类继承另一个类时,这个类被称为继承类、派生类或子类,另一个类被称为被继承类、基类或父类。子类能够继承父类的全部特征,包括所有的数据成员和成员函数,并且子类还能够定义父类所没有的、属于自己的特征,即自己的数据成员和成员函数。通过类的继承关系,使得一些类的代码...

什么是多态?
多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式。多态(Polymorphism)按字面的意思就是“多种状态”。在面向...

java一个类可以继承多个类吗
在Java中,一个类可以继承多个类。拓展知识:这种特性被称为多态性或多重继承。一个类可以继承自一个或多个父类,只要这些父类没有直接的继承关系。在Java中,使用关键字<extends>来声明一个类继承另一个类。例如: class Animal { \/\/ Animal类的公共方法 } class Dog extends Animal { \/\/ Dog...

java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多...
如果此方法继承自A或B,那么即使在C中重写了此方法,这两个句子产生出来的a调用此方法产生的结果都是一样的,这就是多态性。但上面这话不适合于静态成员和静态方法,比如你可以在A,B,C中都定义 public static String getS()并返回不同值,这几个getS()之间不是重写的关系而是各管各的。如果是 A...

java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多...
可以报站,到公交站可以报站让乘客下车。总体而言就是:对象能调用哪个方法是根据我们所知道的它是哪个类来看,而调用该方法实际执行的操作是根据它实际上是哪个类来看。子类继承父类就有了父类的方法,而重写父类的方法就改掉了实际执行的操作。这就是多态。希望对你有帮助。

相似回答