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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法從超類訪問子類元素?

有沒有辦法從超類訪問子類元素?

慕娘9325324 2023-03-23 14:23:32
我需要一個將在子類中使用的類中的方法,盡管此方法使用在子類中更改的屬性。有沒有一種方法可以訪問子類的屬性而不必重寫方法?我試過為該屬性使用吸氣劑,但得到了相同的結果。public class SuperClass {    private static final String a = "Super";    public void superMethod(){        System.out.println("SuperMethod: " + a);    }}public class ChildClass extends SuperClass {    private static final String a = "Child";}public class Main {    public static void main(String[] args) {        SuperClass s = new SuperClass();        ChildClass c = new ChildClass();        s.superMethod();        c.superMethod();    }}控制臺顯示:超級方法:超級超級方法:超級預期結果是:超級方法:超級超級方法:孩子
查看完整描述

3 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊

我試過為該屬性使用吸氣劑,但得到了相同的結果。


你確定嗎?以下應該正是您所追求的:


class SuperClass {


    private String a = "Super";


    public void superMethod() {

        System.out.println("SuperMethod: " + getA());

    }


    public String getA() {

        return this.a;

    }


}


class ChildClass extends SuperClass {


    private String a = "Child";


    @Override

    public String getA() {

        return this.a;

    }


}


public class Main {


    public static void main(String[] args) {

        SuperClass s = new SuperClass();

        ChildClass c = new ChildClass();

        s.superMethod();

        c.superMethod();

    }

}

請注意,getter 不能是私有的(否則無法從類外部訪問它們),并且它們不能是靜態的(否則它們是類的一部分,而不是該類的任何實例。)


查看完整回答
反對 回復 2023-03-23
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

目前尚不清楚你在做什么,但你的String a成員是private static班級的成員,而不是個別對象的成員。


如果您創建了String a對象的成員,而不是類的成員,則可以在創建子類期間覆蓋該值:


U:\>jshell

|  Welcome to JShell -- Version 12

|  For an introduction type: /help intro


jshell> class SuperClass {

   ...>    protected final String a;

   ...>

   ...>    protected SuperClass(String _a) {

   ...>       a = _a;

   ...>    }

   ...>

   ...>    public SuperClass() {

   ...>       this("Super");

   ...>    }

   ...>

   ...>    public void superMethod() {

   ...>       System.out.println("SuperMethod: "+a);

   ...>    }

   ...> }

|  created class SuperClass


jshell> class ChildClass extends SuperClass {

   ...>    public ChildClass() {

   ...>      super("Child");

   ...>    }

   ...> }

|  created class ChildClass


jshell> var s = new SuperClass();

s ==> SuperClass@4566e5bd


jshell> var c = new ChildClass();

c ==> ChildClass@ff5b51f


jshell> s.superMethod();

SuperMethod: Super


jshell> c.superMethod();

SuperMethod: Child

更新


現在我們知道了您的實際用例(來自下面的評論),您想要實現的內容非常簡單:


class SuperClass {

    private final static Logger LOG = Logger.getLogger(SuperClass.class);


    protected Logger getLogger() { return LOG; }


    public void superMethod(){

        getLogger().info("superMethod() called.");

    }

}


class ChildClass extends SuperClass {

    private final static Logger LOG = Logger.getLogger(ChildClass.class);


    @Override

    protected Logger getLogger() { return LOG; }

}


public class Main {

    public static void main(String[] args) {

        SuperClass s = new SuperClass();

        ChildClass c = new ChildClass();

        s.superMethod();                 // Message logged to SuperClass.LOG

        c.superMethod();                 // Message logged to ChildClass.LOG

    }

}



查看完整回答
反對 回復 2023-03-23
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

簡短回答:Java 無法按照您想要的方式執行此操作,因為編譯器會將 String 文字與最終值合并,因此"SuperMethod: " + a將在生成的字節碼中進行轉換"SuperMethod: Super"。


唯一的解決方案是使用反射(如果必須的話):


import java.lang.reflect.Field;


public class Main {

  public static void main(String[] args) {

      SuperClass s = new SuperClass();

      ChildClass c = new ChildClass();

      s.superMethod();

      c.superMethod();

  }

}


class SuperClass {

    private static final String a = "Super";


    public void superMethod(){

      try{

        final Class<?> clazz = this.getClass();

        final Field fieldA = clazz.getDeclaredField("a");

        fieldA.setAccessible(true);


        final String value = (String)fieldA.get(null);


        System.out.println("SuperMethod: " + value);

      } catch (final NoSuchFieldException | IllegalAccessException ex){

        // Because reflection

        ex.printStackTrace();

      }

    }

}


class ChildClass extends SuperClass {

    private static final String a = "Child";

}

輸出是:


SuperMethod: Super

SuperMethod: Child

但是,老實說,我仍然喜歡使用經典覆蓋:


public class Main {

  public static void main(String[] args) {

      SuperClass s = new SuperClass();

      ChildClass c = new ChildClass();

      s.superMethod();

      c.superMethod();

  }

}


class SuperClass {

    private static final String a = "Super";


    public void superMethod(){

        System.out.println("SuperMethod: " + getA());

    }


    public String getA() {

      return a;

    }


}


class ChildClass extends SuperClass {


    private static final String a = "Child";


    @Override

    public String getA() {

      return a;

    }

}


查看完整回答
反對 回復 2023-03-23
  • 3 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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