目录
引言
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方法不需要任何改变,程序便变得简洁而又方便。