编程是一种强逻辑的社交活动,建立在人与计算机之间。
高质量的因果关系(物理逻辑)对应着清晰的边界(权限范围),即分工。
最近在学习到了继承,遇到了几个有助于加深印象的点,贴出来自己的理解,往前辈指正补充。
案例分析
(1)多态中调用方法的选择
(父类引用指向子类对象-创建对象;父类引用接收子类对象-做参数)
多态情况下 编译看左面 运行看右面
首先,看父类是否能够保证编译的通过
①当父类没有声明这个方法时,编译不能通过;
②当父类声明此方法时,编译通过。
③再看右侧,对应的子类中是否对此方法进行重写;重写,则使用子类中重写的方法;没重写,则使用父类中的原始方法!
最常见的一种情况是:父类是抽象类,子类实现父类的抽象方法;
编译看左面:父类中含有此方法体,编译通过;
运行看右面:子类实现抽象方法,必定重写,所以运行子类重写之后的方法,即右面!
如果不是多态情况(子类引用指向子类对象)左右两面都是同一个类,所以编译与运行都是看子类,但也可以说成是编译看左面,运行看右面,因为左右都相等!
//思考实验题:
class A{
public String show(D d){//D类的引用只能接收自己的对象--没有子类
return ("A and D");
}
public String show(A a){//A类的引用能够接收A,B,C,D类的对象
return ("A and A");
}
}
class B extends A{
/*
public String show(D d){//D类的引用只能接收自己的对象--没有子类
return ("A and D");
}
此处隐藏了此方法,继承自A中
*/
public String show(B b){//B类的引用能够接收B,C,D类的对象
return ("B and B");
}
public String show(A a){//A类的引用能够接收A,B,C,D类的对象
return ("B and A");//对A中的方法进行重写(复写)
}
}
class C extends B{//继承B中的全部方法
}
class D extends B{//继承B中的全部方法
}
class DuoTaiTest{
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();
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
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
System.out.println(b.show(b)); //B and B
System.out.println(b.show(c)); //B and B
System.out.println(b.show(d)); //A and D
}
}