子类可以赋值给父类,但是只能用父类有的公有方法和属性。
调用公有方法时,如果子类重写了方法则使用子类重写的方法,如果没有重写就使用父类的方法。
调用公有属性时,当子类和父类都有相同属性时,用的是父类属性。
注意,赋值只是赋值给引用具有父类方法和公有属性的变量而已,内存里还是指向子类的对象,保存的是子类的对象,比如例子里用equals进行测试的部分,还是相等的,说明保存不变只是访问的口变了。如果再次赋值回来子类类型的变量还是会是原来的子类一点不变。因为保存在堆中的对象还是子类的对象,这个可以自行验证。这个就发现一个伟大父类Object,所有类的父类,也就是万能的,所有类都可以赋值给一个Object的引用变量而不会报错……
public class Student {
public static void main(String[] arg){
Parent text = new Child(50,5);
text.getAge();
text.getheight();
System.out.println(text.mm);
text.getmm();
Child text1 = new Child(50,5);
text1.getheight();
System.out.println(text1.mm);
Parent text2=text1;
if(text1.equals(text2)){
System.out.println("equal");
}
else {
System.out.println("no equal");
}
}
}
class Parent{
private int age;
public int mm=2;
private int height=170;
public Parent(int age){
this.age=age;
}
public void getAge() {
System.out.println(age);
}
public void getheight(){
System.out.println(height);
}
public void getmm(){
System.out.println(mm);
}
}
class Child extends Parent{
public int mm=9;
private int age1;
public Child(int age,int age1) {
super(age);
this.age1=age1;
}
public void getAge() {
System.out.println(age1);
}
public void getmm(){
System.out.println(mm);
}
}
运行
5
170
2
9
170
9
equal
Process finished with exit code 0
感想
这种机制可能不是是为了更好的抽象解耦诞生的,但至少在抽象解耦上面很有用,怎么说,来个例子
复杂的大自然复杂的认类社会,无奇不有,比如汽车就有好多种车,但是用车的人可能只是需要抽象出汽车有上车,开车,下车的功能,所以抽象出car的接口有上车,开车,下车函数,然后实现类其他人去实现,用的时候只需要把实现类的赋值给接口类既可以用相应的方法,在用car的地方基本可以不用,也不用关心是哪个类实现了Car接口,即实现和使用通过接口进一步解耦。在spring框架里面经常使用这样的方式进行解耦。太美妙了。