1. 程式人生 > >有關this和super的面試題

有關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年面試題]

答案:如果想用super繼承父類構造的方法,但是沒有放在第一行的話,那麼在super之前的語句,肯定是為了滿足自己想要完成某些 行為的語句,但是又用了super繼承父類的構造方法。那麼以前所做的修改就都回到以前了,就是說又成了父類的構造方法了。如下面的程式所示。
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