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

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

為什么這個(gè)()和超級()必須是構(gòu)造函數(shù)中的第一個(gè)語句?

為什么這個(gè)()和超級()必須是構(gòu)造函數(shù)中的第一個(gè)語句?

狐的傳說 2019-06-12 16:03:06
為什么這個(gè)()和超級()必須是構(gòu)造函數(shù)中的第一個(gè)語句?Java要求,如果在構(gòu)造函數(shù)中調(diào)用了這個(gè)()或超級(),那么它必須是第一個(gè)語句。為什么?例如:public class MyClass {     public MyClass(int x) {}}public class MySubClass extends MyClass {     public MySubClass(int a, int b) {         int c = a + b;         super(c);  // COMPILE ERROR     }}Sun編譯器說:“調(diào)用超級必須是構(gòu)造函數(shù)中的第一條語句”。Eclipse編譯器說“構(gòu)造器調(diào)用必須是構(gòu)造函數(shù)中的第一個(gè)語句”。但是,您可以通過稍微重新排列代碼來解決這個(gè)問題:public class MySubClass extends MyClass {     public MySubClass(int a, int b) {         super(a + b);  // OK     }}下面是另一個(gè)例子:public class MyClass {     public MyClass(List list) {}}public class MySubClassA extends MyClass {     public MySubClassA(Object item) {         // Create a list that contains the item, and pass the list to super         List list = new ArrayList();         list.add(item);         super(list);  // COMPILE ERROR     }}public class MySubClassB extends MyClass {     public MySubClassB(Object item) {         // Create a list that contains the item, and pass the list to super         super(Arrays.asList(new Object[] { item }));  // OK     }}所以,它是不阻止您執(zhí)行邏輯在打電話給超級英雄之前。它只是阻止您執(zhí)行邏輯,您不能適應(yīng)一個(gè)單一的表達(dá)式。對于調(diào)用,也有類似的規(guī)則。this()..編譯器說“調(diào)用這必須是構(gòu)造函數(shù)中的第一個(gè)語句”。為什么編譯器有這些限制?您能給出一個(gè)代碼示例,如果編譯器沒有這個(gè)限制,那么會(huì)發(fā)生一些不好的事情嗎?
查看完整描述

3 回答

?
RISEBY

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

通過鏈接構(gòu)造函數(shù)和靜態(tài)方法,我找到了解決這一問題的方法。我想做的事情看起來是這樣的:

public class Foo extends Baz {
  private final Bar myBar;

  public Foo(String arg1, String arg2) {
    // ...
    // ... Some other stuff needed to construct a 'Bar'...
    // ...
    final Bar b = new Bar(arg1, arg2);
    super(b.baz()):
    myBar = b;
  }}

因此,基本上是基于構(gòu)造函數(shù)參數(shù)構(gòu)造一個(gè)對象,將對象存儲(chǔ)在一個(gè)成員中,并將該對象上的一個(gè)方法的結(jié)果傳遞給超級構(gòu)造函數(shù)。使成員成為最終成員也是相當(dāng)重要的,因?yàn)轭惖谋举|(zhì)是它是不可變的。注意,實(shí)際上構(gòu)建Bar需要幾個(gè)中間對象,所以在我的實(shí)際用例中,它是不可還原為一行的。

最后我做了這樣的事情:

public class Foo extends Baz {
  private final Bar myBar;

  private static Bar makeBar(String arg1,  String arg2) {
    // My more complicated setup routine to actually make 'Bar' goes here...
    return new Bar(arg1, arg2);
  }

  public Foo(String arg1, String arg2) {
    this(makeBar(arg1, arg2));
  }

  private Foo(Bar bar) {
    super(bar.baz());
    myBar = bar;
  }}

它完成了在調(diào)用超級構(gòu)造函數(shù)之前執(zhí)行多個(gè)語句的任務(wù)。


查看完整回答
反對 回復(fù) 2019-06-12
?
慕村225694

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

因?yàn)镴LS這么說。是否可以兼容的方式更改JLS以使其允許? 是啊。

然而,這將使語言規(guī)范復(fù)雜化,因?yàn)檎Z言規(guī)范已經(jīng)足夠復(fù)雜了。這不是一件非常有用的事情,而且有一些方法可以繞過它(用靜態(tài)方法或lambda表達(dá)式的結(jié)果調(diào)用另一個(gè)構(gòu)造函數(shù))this(fn())-方法是在其他構(gòu)造函數(shù)之前調(diào)用的,因此也是超級構(gòu)造函數(shù))。因此,做這種改變的權(quán)力與重量之比是不利的。

請注意,僅此規(guī)則并不阻止在超類完成構(gòu)造之前使用字段。

考慮一下這些非法的例子。

super(this.x = 5);super(this.fn());super(fn());super(x);super(this instanceof SubClass);// this.getClass() would be /really/ useful sometimes.

這個(gè)例子是合法的,但“錯(cuò)了”。

class MyBase {
    MyBase() {
        fn();
    }
    abstract void fn();}class MyDerived extends MyBase {
    void fn() {
       // ???
    }}

在上面的示例中,如果MyDerived.fn所需的參數(shù)MyDerived構(gòu)造函數(shù),它們需要使用ThreadLocal. ;(

順便說一句,自Java1.4以來,包含外部的合成字段this在調(diào)用內(nèi)部類超級構(gòu)造函數(shù)之前分配。這引起了NullPointerException編譯為針對早期版本的代碼中的事件。

還請注意,在不安全發(fā)布的情況下,除非采取了預(yù)防措施,否則其他線程可以重新查看構(gòu)造。

2018年3月編輯:在訊息中記錄:建造和驗(yàn)證Oracle建議取消這一限制(但與C#不同的是,this將是絕對沒有分配(Du)構(gòu)造函數(shù)鏈接之前)。

在歷史上,這個(gè)()或超級()必須是構(gòu)造函數(shù)中的第一個(gè)。這種限制從來不受歡迎,被認(rèn)為是武斷的。有一些微妙的原因,包括特別是對請求的核查,促成了這一限制。多年來,我們已經(jīng)在VM級別解決了這些問題,以至于考慮取消這個(gè)限制變得非常實(shí)際,不僅對記錄,而且對所有構(gòu)造函數(shù)都是如此。


查看完整回答
反對 回復(fù) 2019-06-12
  • 3 回答
  • 0 關(guān)注
  • 525 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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