对象的向上转型对象

如果动物类(Animal)是父类,老虎类(Tiger)是子类,那么可以说老虎是动物,这时,老虎将失去作为老虎独有的属性和功能。从人的思维方式来看,说“老虎时动物”属于上溯的思维方式,从而衍生出Java中的向上转型对象。

向上转型对象的声明

Animal a = new Tiger();
//或者
Animal a;
Tiger b = new   Tiger();
a = b;

这时,称对象a是b的向上转型对象。对象的向上转型对象是调用子类的构造方法创建的。但是上转型对象会失去原对象的一些属性和方法。(向上转型对象相当于子类对象的一个简化版)。

上溯转型对象与子类对象的比较

在这里插入图片描述

  • 上溯转型对象不能操作子类新增的成员变量,不能调用子类新增的方法,相当于失去了一部分属性和方法。
  • 上溯转型对象可以访问子类继承或者隐藏的成员变量,也可以调用子类继承的方法和子类重写的实例方法。
  • 如果子类重写了父类的实例方法,上溯转型对象调用时调用的是子类重写了的实例方法。
  • 不要将父类创建的对象和子类对象的上转型对象混淆
  • 可以将对象的向上转型对象强制转换成一个子类对象,该子类对象又具备了子类对象的所有属性和方法
  • 不可以将父类创建的对象引用赋值给子类声明的对象
  • 如果子类重写了父类中的静态方法,那么子类对象的向上转型对象不能调用子类重写的静态方法,只调用父类的静态方法。

利用上溯转型对象实现多态

我们经常说哺乳动物有很多种叫声,这就是叫声的多态。
当一个类有很多子类时,并且这些子类都重写了父类的某个方法。那么当把子类创建的对象的引用放到一个父类的对象中去的时候,得到了一个向上转型对象,通过调用向上转型对象中重写了的方法,实现多态。

class Animal {
	void cry(){

	}
}

class Dog extends Animal {
	void cry(){
		System.out.println("汪汪......");
	}
}

class Cat extends Animal {
	void cry(){
		System.out.println("喵喵......");
	}
}

public class text {
	public static void main(String[] args) {
		Animal myAnimal ;
		myAnimal = new Dog();
		myAnimal.cry();
		myAnimal = new Cat();
		myAnimal.cry();
	}
}

汪汪......
喵喵......

在这里插入图片描述

import Liu.StaticText;

//抽象类SIM
abstract class SIM {
	public abstract void setNumber(String s);
	public abstract String getNumber();
	public abstract String getCorpName();
}

//Mobilephone调用SIM子类对象的上溯转型对象
class Mobilephone {
	SIM card;
	public void useSIM(SIM card) {
		this.card = card;
	}
	public void showMessage() {
		System.out.println("使用的卡是:"+card.getCorpName()+"提供的手机号码是"+card.getNumber());
	}
}

//中国移动的SIM类
class SIMofChinaMobile extends SIM {
	String number;
	private final String  corpname = "中国移动";
	public void setNumber(String s) {
		this.number = s;
	}
	public String getNumber() {
		return this.number;
	}
	public String getCorpName() {
		return this.corpname;
	}
}

//中国联通的SIM类
class SIMofChinaUnicom extends SIM {
	String number;
	private final String  corpname = "中国联通";
	public void setNumber(String s) {
		this.number = s;
	}
	public String getNumber() {
		return this.number;
	}
	public String getCorpName() {
		return this.corpname;
	}
}

public class Main {
	public static void main(String[] args) {
		Mobilephone phone = new Mobilephone();
		SIM mySim = new SIMofChinaMobile();
		mySim.setNumber("15545554555");
		phone.useSIM(mySim);
		phone.showMessage();
		mySim = new SIMofChinaUnicom();
		mySim.setNumber("13343334333");
		phone.useSIM(mySim);
		phone.showMessage();
		
	}
}

使用的卡是:中国移动提供的手机号码是15545554555
使用的卡是:中国联通提供的手机号码是13343334333

猜你喜欢

转载自blog.csdn.net/practical_sharp/article/details/88622046