对象的向上转型对象
如果动物类(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