亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

變量的編譯時類型和運行時類型

標簽:
Java

当变量的编译时类型和运行时类型不同时,通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定。但通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。

public class StudyVisitorSonVar {public static void main(String[] args) {new Cricle("圆形");}}class Shap{public String desc;public Shap() {//该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型即Shap决定//通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象即Cricle来决定this.desc = getDesc();}public String getDesc() {this.desc = "形状";System.out.println("Shap 父类的描述为:" + this.desc);return desc;}public void setDesc(String desc) {this.desc = desc;}}class Cricle extends Shap{public String desc;public Cricle(String desc) {this.desc = desc;}@Overridepublic String getDesc() {System.out.println("Cricle 子类的描述为:" + this.desc);return this.desc;}}运行结果为:Cricle 子类的描述为:null

之所以会出现这种结果是因为调用子类构造器前会隐式调用父类无参构造器,this.desc这个this虽然代表Cricle对象,但它却位于Shap构造器中,它的编译时类型是Shap,而它实际引用一个Cricle对象。

当变量的编译时类型和运行时类型不同时,通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定,但通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。这时候就会调用子类的getDesc()方法,因为子类的desc成员变量还没有被初始化所以输出结果为null。

所以需要注意如果父类构造器调用了被子类重写的方法,且通过子类构造器来创建子类对象,不管是显式还是隐式调用了这个父类构造器就会导致子类的重写方法在子类构造器的所有代码之前被执行,从而导致子类的重写方法访问不到子类的实例变量值的情形

原文出处

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消