向上转型和向下转型

Posted ct-debug

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向上转型和向下转型相关的知识,希望对你有一定的参考价值。

Java转型记住一句话:父类引用指向子类对象。

父类引用指向子类对象

向上转型

Father f1 = new Son();
//向上转型不用强制转换,将子类对象转为父类对象,父类对象可以是接口。
// 现在 f1 引用指向一个Son对象

向下转型

Son s1 = (Son)f1;
//指向子类对象的父类引用赋给子类引用叫向下转型,要强制转换,与向上转型相反,即是把父类对象转为子类对象。
//f1 就是一个指向子类对象的父类引用。把f1赋给子类引用 s1 即 Son s1 = (Son)f1;
//其中 f1 前面的(Son)必须加上,进行强制转换。

父类引用能指向子类对象,而子类引用不能指向父类对象

Father f2 = new Father();
Son s2 = (Son)f2;
//出错,父类引用能指向子类对象,而子类引用不能指向父类对象

实例代码:

package case2;

import java.util.Scanner;

public class Task2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String cName = sc.next();
		String cSex = sc.next();
		int cAge = sc.nextInt();
		String eName = sc.next();
		String eSex = sc.next();
		int eAge = sc.nextInt();
		// 创建测试类对象test
		// 创建Person类对象person1,引用指向中国人,通过有参构造函数实例化中国人类对象
		// 通过showEat()方法调用Chinese的eat()方法
		// 创建Person类对象person2,引用指向英国人,通过有参构造函数实例化英国人类对象
		// 通过showEat()方法调用English的eat()方法
		/********* begin *********/
        Person person1 = new Chinese(cName,cSex,cAge);
		person1.eat();//此处将调用子类的eat()方法。原因:person1实际指向的是Chinese子类,故调用时会调用子类本身的方法。
        //需要注意的是向上转型时person1会遗失除与父类对象共有的其他方法。如本例中的shadowBoxing()方法不再为person1所有。
		System.out.println("--------------------------");
		showEat(person1);
		Person person2 = new English(eName,eSex,eAge);
		person2.eat();
		System.out.println("--------------------------");
		showEat(person2);
		/********* end *********/
		// 强制类型转换(向下转型) 调用Chinese类特有的方法shadowBoxing()
		// 强制类型转换(向下转型) 调用English类特有的方法horseRiding()
		/********* begin *********/
        Chinese c = (Chinese) person1;
		c.shadowBoxing();
		English e = (English) person2;
		e.horseRiding();
		/********* end *********/
	}

	// 定义showEat方法,使用父类作为方法的形参,实现多态,传入的是哪个具体对象就调用哪个对象的eat()方法
	/********* begin *********/
    public static void showEat(Person p){
		p.eat();
	}
	//这里以父类引用为参数,利用了向上转型,传入的是哪个具体对象就调用哪个对象的eat()方法,体现了JAVA的抽象编程思想。
	/********* end *********/
}

// 抽象类Person 封装属性name、sex和age
// 构造函数初始化name、sex和age
// 声明抽象方法eat()
abstract class Person {
	/********* begin *********/
    public abstract void eat();
	String name;
	String sex;
	int age;
	/********* end *********/
}

// Chinese类继承自Person类
// 构造函数初始化name、sex和age
// 重写父类方法eat() 输出‘姓名:name,性别:sex,年龄:age,我是中国人,我喜欢吃饭!‘
// 定义子类特有方法shadowBoxing(),当父类引用指向子类对象时无法调用该方法 输出‘name在练习太极拳!‘
class Chinese extends Person {
	/********* begin *********/
	public Chinese(String n,String s,int a){
		name = n;
		sex = s;
		age = a;
	}
    public void eat(){
        System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",我是中国人,我喜欢吃饭!");
	}
	public void shadowBoxing(){
		System.out.println(name+"在练习太极拳!");
	}
	/********* end *********/
}

// English类继承自Person类
// 构造函数初始化name、sex和age
// 重写父类方法eat() 输出‘姓名:name,性别:sex,年龄:age,我是英国人,我喜欢吃三明治!‘
// 定义子类特有方法horseRiding(),当父类引用指向子类对象时无法调用该方法 输出‘name在练习骑马!‘
class English extends Person {
	/********* begin *********/
	public English(String n,String s,int a){
		name = n;
		sex = s;
		age = a;
	}
    public void eat(){
        System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",我是英国人,我喜欢吃三明治!");
	}
	public void horseRiding(){
		System.out.println(name+"在练习骑马!");
	}
	/********* end *********/
}

以上是关于向上转型和向下转型的主要内容,如果未能解决你的问题,请参考以下文章

JAVA向上转型和向下转型

java中对象的向上转型和向下转型

Java向上转型和向下转型

Java中的向上转型和向下转型

问下向下转型作用

JAVA对象 向上转型upcasting,向下转型downcasting