第12章 繼承與接口

12.2 Super

Java程序員面試寶典 作者:歐立奇、朱梅、段韜 編著


  面試?yán)}1:以下代碼的輸出結(jié)果是下列哪個選項?[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構(gòu)造函數(shù)的面試?yán)}。子類的構(gòu)造函數(shù)如果要引用super的話,必須把super放在函數(shù)的首位,不然會出現(xiàn)這樣的報錯:

  Checket.java:10: call to super must be first statement in constructor

  super();

  如果一定要引用super構(gòu)造函數(shù),則必須把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();

  }

  } 

  答案:會出現(xiàn)編譯報錯,選項A

  面試?yán)}2:Java里在類中用super調(diào)用父類構(gòu)造函數(shù)時,為什么調(diào)用語句必須是子類的第一條語句?[Siemens公司2005年面試題]

  答案:如果想用super繼承父類構(gòu)造的方法,但是沒有放在第一行的話,那么在super之前的語句,肯定是為了滿足自己想要完成某些行為的語句,但是又用了super繼承父類的構(gòu)造方法。那么以前所做的修改就都回到以前了,就是說又成了父類的構(gòu)造方法了。如下面的程序所示。

class Father

{

public Father()

{String name=null;

int age=0;}

}

class Son extends Father

{

public Son()

{String name="學(xué)生";

super();

}

}   

  擴(kuò)展知識(Java中的super類)

  在Java中,有時還會遇到子類中的成員變量或方法與超類(有時也稱父類)中的成員變量或方法同名。因為子類中的成員變量或方法名優(yōu)先級高,所以子類中的同名成員變量或方法就隱藏了超類的成員變量或方法,但是我們?nèi)绻胍褂贸愔械倪@個成員變量或方法,就需要用到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(),所以顯示的結(jié)果為:

  Hefei
  China

  如果想要使用超類的構(gòu)造函數(shù),則應(yīng)當(dāng)使用super(參數(shù)列表)的形式。

  面試?yán)}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被聲明是靜態(tài)的,如果它存在只能有一個本體,則它可以通過本類的名字或者通過定義本類的任何一個實例被改變。

  答案:A、B、C

  面試?yán)}4:當(dāng)編譯和運(yùn)行下列代碼時會發(fā)生下列哪種情況?

   

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運(yùn)行會出現(xiàn)下列出錯信息。

  "Only constructors can invoke constructors"

  Checket作為一個構(gòu)造方法應(yīng)該在調(diào)用時從最老的祖先類開始向下調(diào)用,調(diào)用super會引起程序在編譯和運(yùn)行時間上的錯誤。

  Java中的關(guān)鍵字super:調(diào)用父類的屬性,一個類中如果有int x屬性,如果其子類中也定義了int x屬性的話,在子類中調(diào)用父類的x屬性時應(yīng)用super.x=6,表示該x是引用的父類的屬性,而要表示子類中的x屬性的話,使用this.x。

  this和super:在Java中,this通常指當(dāng)前對象,super則指父類的對象。若想要引用當(dāng)前對象的某種東西,比如當(dāng)前對象的某個方法,或當(dāng)前對象的某個成員,便可以利用this來實現(xiàn)這個目的。當(dāng)然,this的另一個用途是調(diào)用當(dāng)前對象的另一個構(gòu)造函數(shù)。如果想引用父類的某種東西,則非super莫屬。

  Java里在子類中用super調(diào)用父類構(gòu)造函數(shù)時,調(diào)用函數(shù)必須放在子類的第一條語句的位置,如果想用super繼承父類構(gòu)造的方法,但是沒有放在第一行的話,那么在super之前的語句,也許是為了滿足自己想要完成某些行為的語句,但是又用了super繼承父類的構(gòu)造方法,以前所做的修改就都回到以前了,也就是說又成了父類的構(gòu)造方法了。

  答案:A


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號