第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

java創(chuàng)建對(duì)象問題

java創(chuàng)建對(duì)象問題

public?class?Yuanzhu?{ public?static?void?main(String?args[]){ Circle?cir=new?Circle(2); Volume?vol=new?Volume(cir,5); } } class?Circle{ double?radius; public?Circle(double?r){ radius=r; } double?getArea(){ return?3.14*radius*radius; } } class?Volume{ double?heigh; Circle?circle; public?Volume(Circle?c,double?h){ circle=c; heigh=h; } double?s=circle.getArea();//s為底面積 public?void?getVolume(){ double?volume=s*heigh; System.out.println("體積是"+volume); } }三個(gè)類計(jì)算圓柱體積,Circle類創(chuàng)建底面圓對(duì)象,有個(gè)方法返回圓面積,Volume類計(jì)算圓柱體積,并打印輸出,主函數(shù)在Yuanzhu類中。但是運(yùn)行后提示空指針異常是怎么回事?double s=circle.getArea();這個(gè)報(bào)錯(cuò)了
查看完整描述

1 回答

已采納
?
慕圣0830664

TA貢獻(xiàn)41條經(jīng)驗(yàn) 獲得超26個(gè)贊

首先你要明白一個(gè)類的初始化順序,先初始化類中的屬性(如果是基礎(chǔ)數(shù)據(jù)類型初始化為0,如果是引用類型,初始化為null。),再執(zhí)行該類的構(gòu)造函數(shù),如果構(gòu)造中有初始化屬性的代碼,會(huì)對(duì)屬性進(jìn)行第二次初始化。


當(dāng)執(zhí)行到 Volume?vol=new?Volume(cir,5);語句時(shí),系統(tǒng)會(huì)最先初始化Volume類中所有的屬性,依次執(zhí)行heigh=0,circle=null, 當(dāng)執(zhí)行到double?s=circle.getArea();時(shí),發(fā)現(xiàn)是一個(gè)賦值的表達(dá)式,這時(shí)候系統(tǒng)會(huì)先執(zhí)行右邊的表達(dá)式,會(huì)調(diào)用circle.getArea(), 問題就出在這里,因?yàn)檫@時(shí)circle=null, 空值的引用是不能調(diào)用任何方法的,只有實(shí)例對(duì)象才能調(diào)用相應(yīng)的方法,所以就拋出了異常。在java中,對(duì)一個(gè)類初始化的時(shí)候,有時(shí)并不是按照代碼的寫書順序來執(zhí)行的,你將double?s=circle.getArea();寫到程序的最后,它還是會(huì)在構(gòu)造方法之前得到執(zhí)行。

知道了為什么出錯(cuò),解決起來就簡(jiǎn)單了,你可以先定義一個(gè)double s; 然后定義一個(gè)方法,在方法中調(diào)用?s=circle.getArea(); ?如下面的代碼:

class?Volume{
????double?heigh;
????Circle?circle;
????double?s;
????
????public?Volume(Circle?c,double?h){
????????circle=c;
????????heigh=h;
????}
????public?double?area(){
????????s?=?circle.getArea();???
????}?
?}

當(dāng)然你也可以在構(gòu)造函數(shù)當(dāng)中對(duì) s 進(jìn)行初始化,如下面的代碼:

class?Volume{
????double?heigh;
????Circle?circle;
????double?s;
????
????public?Volume(Circle?c,double?h){
????????circle=c;?//這里circle已經(jīng)得到正確的初始化
????????heigh=h;
????????s=circle.getArea();//所以這里可以調(diào)用相應(yīng)的方法
????}
?????????
????public?void?getVolume(){
????????double?volume=s*heigh;
????????System.out.println("體積是"+volume);
????}
}

總之一句話,在使用circle之前必須保證circle得到了正確的初始化。

查看完整回答
1 反對(duì) 回復(fù) 2017-07-02
  • 1 回答
  • 0 關(guān)注
  • 3122 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)