面試?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