【java基础学习】java中父类引用指向子类对象

一点自己在复习java基础时的心得,然后引出了很多的知识点… = =
一起来看看吧

父类和子类定义

在这里插入图片描述

class Father {
    public double height;
    public int age;

    public void work(){
        System.out.println("父亲:工作....");
    }
    //类中默认有一个无参构造器,可显式写出
    //构造器使用public 修饰符 或者 不使用修饰符
    Father(){
        //创建对象实例时赋值
        age = 43;
        height = 172.4;
    }
    
}

class Son extends Father {
    public int age;
    public double score;

    public void read(){
        System.out.println("儿子:读书....");
    }

    Son(){
        // super();
        //创建对象实例时赋值
        age = 18;
        score = 87.0;
    }
}

实例

public class Mytest {
    public static void main(String[] args) {
        Father f = new Father();   //父类引用  指向父类实例
        Son s = new Son();          //子类引用  指向子类实例

        Father x = new Son();    //父类引用  指向子类实例
    }
}

内存中实例情况

在这里插入图片描述
在这里插入图片描述

测试

对应引用指向对应实例

System.out.println(f.height);   //172.4 父类引用 使用 父类实例 属性
f.work();        //父亲:工作....       父类引用 使用 父类实例 方法
System.out.println(s.height);   //172.4 子类引用 使用 子类继承部分 属性
s.work();         //父亲:工作....      子类引用 使用 子类继承部分 方法


// System.out.println(f.score);   //编译报错  父类实例中 不存在 子类新增部分属性
// f.read();                    //编译报错  父类实例中 不存在 子类新增部分方法
System.out.println(s.score);     //87.0 子类引用 使用 子类实例 中的 新增部分属性
s.read();         //儿子:读书....      子类引用 使用 子类实例 中的 新增部分方法

System.out.println(f.age);  //43
System.out.println(s.age);  //48

父类引用指向对应实例

System.out.println(x.height);   //172.4 父类引用 使用 子类继承部分 属性
x.work();        //父亲:工作....       父类引用 使用 子类继承部分 方法
// System.out.println(x.score);     //编译报错  子类实例 子类继承部分 中不存在
// x.read();                        //编译报错 子类实例 子类继承部分 中不存在
System.out.println(((Son)x).score);  //87.0 将父类引用修改为子类引用  此时可调用 子类实例 子类新增部分属性
((Son)x).read();   //儿子:读书....        将父类引用修改为子类引用  此时可调用 子类实例 子类新增部分方法

System.out.println(x.age);          //43         父类引用       使用   子类继承部分 中的age
System.out.println(((Son)x).age);   //18  将父类引用强转为子类引用 使用 子类新增部分 中的age

其中,只存在一个子类对象,被父类引用x指向
验证方法:在调用构造器时打印

class Father {
    //...
    Father(){
        //...
        System.out.println("调用父类构造器:"+this);
    }
}
class Son extends Father {
    //...
    Son(){
        //...
         System.out.println("调用子类构造器:"+this);
    }
}
public class Mytest {
    public static void main(String[] args) {
        Father f = new Father();   //父类引用  指向父类实例
        System.out.println("------------");
        Son s = new Son();          //子类引用  指向子类实例
        System.out.println("============");
        Father x = new Son();    //父类引用  指向子类实例
     }
}
调用父类构造器:javaTest.Father@1615099
------------
调用父类构造器:javaTest.Son@8102c8
调用子类构造器:javaTest.Son@8102c8
============
调用父类构造器:javaTest.Son@996db8
调用子类构造器:javaTest.Son@996db8

参考文章:
【java】父类与子类的引用赋值关系(参考了内存中实例情况图部分)
java -----多态:父类引用指向子类对象(参考了向上转型和向下转型部分)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值