java的向上转型

时间:2025-02-24 12:10:31

目录

引言

1.向上转型 

在java中 向上转型有几种表现形式

1.即直接赋值,这是最常见的向上造型

2.将方法形参声明成父类类型,实际传入子类对象

3.方法返回值为父类类型,实际返回子类 

4.构造方法(构造器)中调用父类的构造方法

向上转型的应用:


引言

在java中,一个类可以继承另一个类,被继承的类叫做父类(超类),继承的类叫做子类。子类的创建过程中,会先对父类部分进行初始化(先创建一个父类对象),再对子类部分初始化,并且子类会继承父类所有的属性与方法(包括private,但是无法直接访问),同时子类可以对父类方法进行覆盖(详细见/OIJ41) 

转型, 指的是在Java中将一个对象的类型转换为另一个类型。Java中的数据类型可以分为基本数据类型和引用数据类型,这两种数据类型之间存在自动转型强制转型两种方式。

1.向上转型 

向上转型(造型)是Java中常用的类型转换方式之一,也称为自动类型转换。这种类型转换发生在继承关系中的父子类之间,通常是将子类对象转换为父类对象。

在java中 向上转型有几种表现形式

1.即直接赋值,这是最常见的向上造型

例如,如果有一个Animal类和其子类Cat,那么在将Cat赋给Animal变量时就会发生向上转型。

class Animal {
    public void eat() {
        ("动物吃东西");
    }
}

class Cat extends Animal {
    public void eat() {
        ("猫在吃猫粮");
    }
    public void catAction() {
        ("猫把你的花瓶打碎 沙发扯破 乱拉尿拉屎 扯坏窗帘还咬你");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Cat(); // 向上转型
        (); // 调用父类的eat方法,输出“猫在吃鱼”
        // (); // 编译错误,无法访问子类特有的方法

        Cat cat = (Cat)animal; // 向下转型
        (); // 正常调用子类的catAction方法,输出“猫把你的花瓶打碎 沙发扯破 乱拉尿拉屎 扯坏窗帘还咬你”
    }

由于Cat继承自Animal类,所以Cat的方法eat重写了父类的eat,故输出“猫在吃鱼”。需要注意的是,在进行向上转型时,只能访问父类中存在的方法和属性。也就是说,即便Cat中定义了独有的方法或属性,在向上转型后仍然无法访问到它们。如果需要访问子类特有的属性或方法,则需要先将父类引用转回子类引用(即进行向下转型,请看下文)。

2.将方法形参声明成父类类型,实际传入子类对象

示例代码如下

class Animal {
    public void eat() {
        ("动物吃东西");
    }
}

class Cat extends Animal {
    public void eat() {
        ("猫在吃猫粮");
    }
    public void catAction() {
        ("猫把你的花瓶打碎 沙发扯破 乱拉尿拉屎 扯坏窗帘还咬你");
    }
}

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        animalEat(cat);
    }
    public static void animalEat(Animal animal){
        ();//输出:猫在吃猫粮
    }

在此例子中,我们定义了一个animalEat方法,其形参声明为Animal类型。在调用该方法时,我们传入了一个Cat对象。这里的Cat对象会自动向上转型为Animal类型,并作为参数传递给animalEat方法。

3.方法返回值为父类类型,实际返回子类 


public class Main { 
    public static void main(String[] args) { 
        Animal animal = createAnimal(); 
    }     
    public static Animal createAnimal() { 
        return new Cat(); //返回子类对象
    } 
} 

在这个例子中,我们定义了一个createAnimal方法,其返回值声明为Animal类型。在该方法中,我们创建了一个Cat对象并将其返回。这里的Cat对象会自动向上转型为Animal类型,并作为返回值返回到主程序。 

4.构造方法(构造器)中调用父类的构造方法

class Animal {
    private int age;
    
    public Animal(int age) {
         = age;
    }
    
    public int getAge() {
        return age;
    }
};

class Cat extends Animal {
    private String name;
    
    public Cat(String name, int age) {
        super(age); // 调用父类构造函数
         = name;
    }
    
    public String getName() {
        return name;
    }
};

public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat("呆呆", 7);
        (());
        (());
    }
}

在上述例子中,我们定义了一个Cat类,它继承自Animal类。在Cat的构造函数中,我们调用了其父类Animal的构造函数,并传入age参数。这里的Cat对象会自动向上转型为Animal类型。

向上转型的应用:

向上转型可以提高代码的可复用性和灵活性,主要用于多态的实现。

class Animal {
    public void eat() {
        ("动物吃东西");
    }
}

class Cat extends Animal {
    public void eat() {
        ("猫吃鱼");
    }
}
class Dog extends Animals{
    public void eat {
        ("狗吃骨头");
    }
}

不使用多态性实现的时候:

public class Text{
    public static void main(String[] args){
        fun(new(Cat));
        fun(new(Dog));
    }
    public static void fun(Cat cat){
        ();
    }
    public static void fun(Dog dog){
        ();
    }
}

看似还算方便但是每当增加一种动物,fun方法就要重载一次,十分的麻烦,那如果使用对象多态性来完成呢:

public class Text{
    public static void main(String[] args){
        fun(new(Cat));
        fun(new(Dog));
    }
    public static void fun(Animal animal){
        ();
    }
}

使用向上转型,让fun方法接受子类并进行自动造型,而fun方法不需要任何改变,程序便变得简洁而又方便。