2012-12-19 80 views
-1

我有一個名爲A的類,並且在其中聲明瞭一個字符串。我有另2班B and C這是從A繼承類中的字符串連接

public abstract class A { 
    protected String ss=""; 

    public abstract String someMethod(); 
} 

public class B extends A{ 
    public String someMethod(){ 
     int i=8; 
     return ss+="$"+i; 
    } 
} 

public class C extends A { 
    public String someMethod() { 
     int i=9; 
     return ss+="$"+i; 
    } 
} 

測試代碼繼承:

A aa = new B(); 
aa.someMethod(); 

A aaa = new C();  
aaa.someMethod(); 

當我打印aaa.someMethod(); - 爲什麼我沒有從B類和C字符串被追加?我希望他們被追加。我怎樣才能做到這一點 ?

+0

@RohitJain錯字 –

+0

請發表[SSCCE(HTTP: //sscce.org) –

+2

請發佈真實的代碼。在java中沒有'inherit'關鍵字 – hqt

回答

2

/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/javac A.java B.java C.java Test.java

/usr/lib中/ JVM/Java的1.7.0-的OpenJDK,AMD64 /斌/ Java測試

$8 
$9 

這裏沒有什麼奇怪,B方法的someMethod()調用B法,C法的someMethod()調用C方法...

文件A.java:

public abstract class A 
{ 
    protected String ss=""; 
    public abstract String someMethod(); 
} 

文件B.java

public class B extends A 
{ 
    public String someMethod() 
    { 
     int i=8; 
     return ss+="$"+i; 
    } 
} 

文件C.java

public class C extends A 
{ 
    public String someMethod() 
    { 
     int i=9; 
     return ss+="$"+i; 
    } 
} 

文件Test.java

public class Test 
{ 
    public static void main(String pArgs[]) 
    { 
     A aa = new B(); 
     System.out.println(aa.someMethod()); 
     A aaa = new C(); 
     System.out.println(aaa.someMethod()); 
    } 
} 
2

在Java中重寫的方法做不是自動調用它們的父類父類。因此,在您的C子類中,調用someMethod不會從其父代A調用該方法,除非您的明確地調用超類型的

public class C extends A 
    public String someMethod(){ 
     int i=9; 
     return ss+= super.someMethod()+"$"+i; 
    } 
} 

我假設你這樣做是爲了學習,否則這是管理你的繼承類和它們的屬性的一種非常糟糕的方式。

+0

但是,在C代碼中'C'的父類是'A'類。你誤解了嗎? –

+0

@RohitJain - 是的,謝謝你的收穫。 – Perception

+0

現在你正在調用一個抽象方法。請注意,調用超類方法在這裏不是問題。OP不會打印'someMethod()'返回的結果,所以它不會執行任何操作。所以,他可能會認爲它打印的是A類中聲明的空字符串,並且不會在類C和B中追加值「'$」+ i'。有趣的問題是。 –