有關this和super的面試題
(一)java中的super和this有關的題目
例題1:以下程式碼的輸出結果是下列哪個選項?[Sun公司2005年面試題]
class Base{
Base(){
System.out.println("Base");
}
}
public class Checket extends Base{
Checket(){
System.out.println("Checket");
super();
}
public static void main(String argv[]){
Checket c = new Checket();
// super();
}
}
A.Compile time error
B.Checket followed by Base
C.Base followed by Checket
D.runtime error
解析:這是一個考查super建構函式的面試例題。子類的建構函式如果要引用super的話,必須把super放在函式的首位,不然會出現這樣的報錯:
Checket.java:10: call to super must be first statement in constructor
super();
如果一定要引用super建構函式,則必須把super()放在前面,程式碼如下。
class Base{
Base(){
System.out.println("Base");
}
}
public class Checket extends Base{
Checket(){
super();
System.out.println("Checket");
}
public static void main(String argv[]){
Checket c = new Checket();
// super();
}
}
答案:會出現編譯報錯,選項A
例題2:[]裡在類中用super呼叫父類建構函式時,為什麼呼叫語句必須是子類的第一條語句?[Siemens公司2005年面試題]
class Father
{
public Father()
{
String name=null;
int age=0;
}
}
class Son extends Father
{
public Son()
{String name="學生";
super();
}
}
擴充套件知識(Java中的super類)
在Java中,有時還會遇到子類中的成員變數或方法與超類(有時也稱父類)中的成員變數或方法同名。因為子類中的成員變數或方法名優先順序高,所以子類中的 同名成員變數或方法就隱藏了超類的成員變數或方法,但是我們如果想要使用超類中的這個成員變數或方法,就需要用到super。請看下面的類。
class Country
{
String name;
void value()
{
name="China";
}
}
在下面的子類中,子類的成員變數和方法隱藏了超類的成員變數name和方法value()。
class City extends Country
String name;
void value()
{
name="Hefei";
super.value();
System.out.println(name);
System.out.println(super.name);
}
為了在子類中引用超類中的成員變數name和方法value(),在程式碼中使用了super、super.name和super.value(),所以顯示的結果為:
Hefei
China
如果想要使用超類的建構函式,則應當使用super(引數列表)的形式
面試例題3:給定下面的程式碼,哪個選項在替代"//Here"後可以被編譯並且改變變數oak的值?
class Base{
static int oak=99;
}
public class Doverdale extends Base{
public static void main(String argv[]){
Doverdale d = new Doverdale();
d.amethod();
}
public void amethod(){
//Here
}
}
A.super.oak=1;
B.oak=33;
C.Base.oak=22;
D.oak=50.1;
解析:因為變數oak被宣告是靜態的,如果它存在只能有一個本體,則它可以通過本類的名字或者通過定義本類的任何一個例項被改變。
答案:A、B、C
面試例題4:當編譯和執行下列程式碼時會發生下列哪種情況?
class Base{
Base(){
System.out.println("Base");
}
}
public class Checket extends Base{
public static void main(String argv[]){
Checket c = new Checket();
super();
}
Checket(){
System.out.println("Checket");
}
}
A.Compile time error
B.Checket followed by Base
C.Base followed by Checket
D.runtime error
解析:
用Sun的JDK執行會出現下列出錯資訊。
"Only constructors can invoke constructors"
Checket作為一個構造方法應該在呼叫時從最老的祖先類開始向下呼叫,呼叫super會引起程式在編譯和執行時間上的錯誤。
Java中的關鍵字super:呼叫父類的屬性,一個類中如果有int x屬性,如果其子類中也定義了int x屬性的話,在子類中呼叫父類的x屬性時應用super.x=6,表示該x是引用的父類的屬性,而要表示子類中的x屬性的話,使用this.x。
this和super:在Java中,this通常指當前物件,(super則指父類的物件(有待商榷))。若想要引用當前物件的某種東西,比如當前物件的某個方法,或當 前物件的某個成員,便可以利用this來實現這個目的。當然,this的另一個用途是呼叫當前物件的另一個建構函式。如果想引用父類的某種東西,則非 super莫屬。
Java裡在子類中用super呼叫父類建構函式時,呼叫函式必須放在子類的第一條語句的位置,如果想用super繼承父類構造的方法,但是沒有放在第一 行的話,那麼在super之前的語句,也許是為了滿足自己想要完成某些行為的語句,但是又用了super繼承父類的構造方法,以前所做的修改就都回到以前 了,也就是說又成了父類的構造方法了。
答案:A