3 回答

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 不能是私有的(否則無法從類外部訪問它們),并且它們不能是靜態的(否則它們是類的一部分,而不是該類的任何實例。)

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
}
}

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;
}
}
添加回答
舉報