笔试题:java继承、多态

这是一道笔试题,请分析输出结果:

注释里有我个人的理解 

public class Test {
	 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是A(调用对象),从重载的角度
	        //顺序为:
		//(1)方法形参参数类型恰好相同
		//(2)方法参数类型是本类的父类(继承关系),没有的话就找参数是本类父类的父类,以此类推
		//(3)还找不到则编译报错
	        System.out.println(a1.show(b));//A and A
	        System.out.println(a1.show(c)); //A and A
	        System.out.println(a1.show(d));//A and D
	        
			
//从“ A a2 = new B(); ”中new后面那个类,即本类中,从下往上找到它的祖宗类(最顶层);
//在它的祖宗类内部找形参参数类型相同的方法;
	//如果找不到,在祖宗内部找形参参数类型是本类的父类的方法,若没有这个方法(参数是本类的父类)接着找参数是(本类父类的父类)的方法,
		//若直到祖宗类内部的方法的(形参参数)找到了(祖宗参数)还没有,编译会报错;				
	//如果找到了,紧接着从祖宗往下找那个合适的方法的重写,可以隔代,如果没有重写就输出祖宗类那个合适的方法;
		//若有重写再往下找到没有重写为止,且受“ A a2 = new B(); ”中new后面那个本类类型的影响,
		//即最多找重写找到本类为止,不管本类的子类有没有重写这个方法。


                //上面简而言之,就是编译在左,运行在右
	        System.out.println(a2.show(b)); //B and A 
	        System.out.println(a2.show(c));//B and A
	        System.out.println(a2.show(d));//A and D
			
		//只在调用对象内部中找,这里是b
		//继承父类后,子类中也有父类的方法
	        System.out.println(b.show(c));//B and B
	        System.out.println(b.show(d));//A and D   
	       
	    }
}	

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(A obj){ 
 	return ("B and A"); 
 } 
 
 public String show(B obj){ 
 	return ("B and B"); 
 }
 }
class C extends B{}
class D extends B{}

 

你可能感兴趣的:(java)