子类可以直接赋值给父类,但

子类可以赋值给父类,但是只能用父类有的公有方法和属性。
调用公有方法时,如果子类重写了方法则使用子类重写的方法,如果没有重写就使用父类的方法。
调用公有属性时,当子类和父类都有相同属性时,用的是父类属性。
注意,赋值只是赋值给引用具有父类方法和公有属性的变量而已,内存里还是指向子类的对象,保存的是子类的对象,比如例子里用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框架里面经常使用这样的方式进行解耦。太美妙了。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值