Java 对象类型转换(向上转型 向下转型详解)

目录

一.概念

1.类型转换

2.继承

3.对象类型转换

(1)向上转型

(2)向下转型

二.示例


一.概念

1.类型转换

将一个类型强制转换成另一个类型的过程被称为类型转换。

2.继承

继承是面向对象语言中一个代码复用的机制,Java中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类(也叫基类或者超类),新产生的类称为子类(也叫派生类),子类继承了父类中的非私有属性和可以继承的方法(可以重写),子类可以继续扩展自己的属性及方法。

3.对象类型转换

对象类型转换,是指存在继承关系的对象,不是任意类型的对象。

Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java中引用类型之间的类型转换(前提是两个类是父子关系)主要有两种,分别是向上转型和向下转型。

(1)向上转型

        父类引用指向子类对象为向上转型,即通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换,形式如下:

FatherClass f = new SonClass();

使用向上转型可以调用父类类型中的所有成员,不能调用子类类型中特有成员。

(2)向下转型

        子类对象指向父类引用为向下转型,即通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换,形式如下:

SonClass s = (SonClass) f; 

使用向下转型可以调用子类类型中所有的成员。

注意:如果父类引用对象是子类对象,那么在向下转型的过程中是安全的;如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会抛出Java强制类型转换(java.lang.ClassCastException)异常,我们一般使用instanceof运算符来避免出此类错误。(instanceof运算符用于判断该运算符前面引用类型变量指向的对象是否是后面类或者是其子类、接口实现类创建的对象,如果是则返回true,否则返回false)

二.示例

//先写一个父类
class Transport{
    String transportName = "交通工具";
    public void run(){
        System.out.println("我正在运行");
    }
}

//再给他写一个子类
class Car extends Transport{
    String transportName = "车";
    static String transportType = "特斯拉";
    public void runType(){
        System.out.println("我在地上跑");
    }

    public static void main(String[] args) {
        Transport transport1 = new Car();  //向上转型,将Car类型转为Transport类型
        System.out.println(transport1.transportName);  //输出"交通工具"
        transport1.run();                              //输出"我正在运行"
        //但是transport1不能调用Car中的runType()方法,因为向上转型可以调用父类类型中的所有成员,不能调用子类类型中的特有成员

        System.out.println("==============我是分割线===============");

        Transport transport2 = new Car();
        if (transport2 instanceof Car){
            Car car = (Car) transport2;  //向下转型,将Transport类型转为Car类型
            //car可以调用Car中所有的成员
            System.out.println(car.transportName);   //输出"车"
            System.out.println(car.transportType);   //输出"特斯拉"
            car.run();                               //输出"我正在运行"
            car.runType();                           //输出"我在地上跑"
        }

    }

}

交通工具
我正在运行
==============我是分割线===============
车
特斯拉
我正在运行
我在地上跑

猜你喜欢

转载自blog.csdn.net/senxu_/article/details/126552567
今日推荐