多态经典面试题解析

多态经典面试题

已知类ABCD,B继承于A,C和D继承于B,具体如下

public class A {
	public void print(A a){
		System.out.println("A and A");
	}
	
	public void print(D d){
		System.out.println("A and D");
	}
}

public class B extends A{
	public void print(B b){
		System.out.println("B and B");
	}
	
	public void print(A a){
		System.out.println("B and A");
	}
	
	/*//继承的
	
	public void print(D d){
		System.out.println("A and D");
	}*/
}
public class C extends B{
	public void print(C c){
		System.out.println("C and C");
	}
	
	public void print(A a){
		System.out.println("C and A");
	}
	
	
	/*//继承的
	public void print(D d){
		System.out.println("A and D");
	}
	
	public void print(B b){
		System.out.println("B and B");
	}*/
}

public class D extends B{
	public void print(D a){
		System.out.println("D and D");
	}
	
	public void print(A a){
		System.out.println("D and A");
	}
	
	/*//继承的
		
	public void print(B b){
		System.out.println("B and B");
	}*/
}
题目如下:

public class Main {
	public static void main(String[] args) {
		A a1 = new A();
		A a2 = new B();
		
		B b = new B();
		C c = new C();
		D d = new D();
		
		a1.print(b);//A and A
		a1.print(c);//A and A
		a1.print(d);//A and D
		
		a2.print(c);//B and A
		a2.print(c);//B and A
		a2.print(d);//A and D
		
		b.print(b);//B and B
		b.print(c);//B and B
		b.print(d);//A and D
		
		d.print(b);//B and B
		d.print(c);//B and B
		d.print(d);//D and D
	}
}
结果已经备注在上面

针对这个题目,绝大多数人的解题思路是这样的,搞一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)

除了上面这个思路,其实我们同样可以从继承和多态的本质出发,进行解析:

1,子类继承父类,则默认继承父类的非私有方法,如上述代码,注释里面是隐式继承的部分;

2,C\D继承于B,B继承于A,则C的对象默认不仅属于C类,也属于B类,也属于A类,即,狗不仅属于犬类,也同样属于动物类;

3,子类继承父类, 可以覆写父类的方法;
依据以上三点,可以轻松解题:

比如:

a2.print(c)
a2是A类型的对象,程序执行时会优先到A类里面去找print方法,同时c属于C类型,同样c也是B类,也是A类。则找到A的print(A a)方法

与此同时,a2引用的是B类型的实例化,被父类定义,实际执行时,A中的print(A a)会在B类中被覆写(这里就是多态),即实际执行的是B中的print(A a),得到“B and A”;

例2:

b.print(d);//A and D
b是B类型的对象,所以在B类中找print(D d)方法,结果发现了从A类中继承过来的print(D d)方法,直接调用,得到“A and D”

其他题目,以照这种方法分析,就能得到相应的答案。



  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个Java多态继承的案例代码,代码注释中会对其进行解析: ``` // 父Animal class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } // 子Dog,继承自Animal class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog is barking"); } } // 子Cat,继承自Animal class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat is meowing"); } } // 测试 public class Main { public static void main(String[] args) { // 创建Animal、Dog、Cat对象 Animal animal = new Animal(); Dog dog = new Dog(); Cat cat = new Cat(); // 调用各自的makeSound方法 animal.makeSound(); // 输出:Animal is making a sound dog.makeSound(); // 输出:Dog is barking cat.makeSound(); // 输出:Cat is meowing // 使用父引用指向子对象 Animal a = new Dog(); a.makeSound(); // 输出:Dog is barking a = new Cat(); a.makeSound(); // 输出:Cat is meowing } } ``` 在这个案例中,Animal是父,Dog和Cat是子。Animal中有一个makeSound方法,而子Dog和Cat分别重写了这个方法。 在测试中,我们分别创建了Animal、Dog、Cat对象,并调用各自的makeSound方法。此时输出结果分别对应各自的实现。 接着我们使用父引用指向子对象,即Animal a = new Dog() 和 Animal a = new Cat()。这里体现了多态的特性,即父引用可以指向子对象。 当调用a.makeSound()时,由于a是Animal型的引用,所以会调用Animal中的makeSound方法。但是由于a指向的实际上是Dog或Cat的对象,所以最终输出对应的结果,即Dog is barking和Cat is meowing。 这就是Java多态继承的一个简单案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值