7 对象的上转型对象

  我们经常说“老虎是动物”、“狗是动物”等。若动物类是老虎类的父类,这样说当然正确,因为人们习惯地称子类与父类的关系是“is-a”关系。但需要注意的是,当说老虎是动物时,老虎将失去老虎独有的属性掘功能(子类新增的成员变量,原来有但子类要再写一遍的成员变量,子类新增的方法)。从人的思维方式上看,说“老虎是动物”属于上溯思维方式,下面讲解和这种思维方式很类似的Java语言中的上转型对象。

自己的理解:

A a;

B b= newB();

A 父类   ,B   是    A的子类,

B的成员变量:老老实实继承来的a,原先就有的b现在又写了一遍同名的b,新增加的c;

B的方法:老老实实继承来的方法x,原先就有的方法y重写过后新的方法y,新增加的方法z;

自己的理解:A是动物,B是老虎,a=b相当于把b的引用给a,但是a不等于b,相当于说:老虎是动物。此时老虎被说成是动物,自然地就失去了老虎的独有特征,老虎的尖牙利爪等。

在程序中,老虎b失去了自己新增的成员变量,新增的方法,此时老虎b成为了动物,能够调用隐藏的成员变量以及老老实实继承的成员变量和方法,以及重写的方法(重写的方法本质上也是先继承再重写,所以算是属于动物的行为)。

注意:

①不要将父类创建的对象和子类对象的上转型对象混淆。

②可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有的属性和功能。

③不可以将父类创建的对象的引用赋值给子类声明的对象。(不能说“人是美国人”);

④如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。(但是我们在写代码的时候,很少重写父类的静态方法)

⑤上转型对象去调用重写的方法等价于子类对象去调用这些方法。(这一点非常关键)

比如:

class A{
int m;
int getM(){
return m;
}
int seeM(){
return m;
}
}
class B extends A{
int m;
int getM(){
return m+100;
}
}
public class E {
public static void main(String[] args) {
B b=new B();
b.m=20;
System.out.println(b.getM());
A a=b;
a.m=-100;
System.out.println(a.getM());
System.out.println(b.seeM());
}
}
运行结果:

120
120
-100

(1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些行为)

(2)上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或者子类重写的实例方法。

  上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。

  因此,如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法。

 

posted @   馅饼丶  阅读(226)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示