面試?yán)}1:以下代碼的輸出結(jié)果是下列哪個(gè)選項(xiàng)?[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
解析:這是一個(gè)考查super構(gòu)造函數(shù)的面試?yán)}。子類的構(gòu)造函數(shù)如果要引用super的話,必須把super放在函數(shù)的首位,不然會(huì)出現(xiàn)這樣的報(bào)錯(cuò):
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();
}
}
答案:會(huì)出現(xiàn)編譯報(bào)錯(cuò),選項(xiàng)A
面試?yán)}2:Java里在類中用super調(diào)用父類構(gòu)造函數(shù)時(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ò)展知識(shí)(Java中的super類)
在Java中,有時(shí)還會(huì)遇到子類中的成員變量或方法與超類(有時(shí)也稱父類)中的成員變量或方法同名。因?yàn)樽宇愔械某蓡T變量或方法名優(yōu)先級(jí)高,所以子類中的同名成員變量或方法就隱藏了超類的成員變量或方法,但是我們?nèi)绻胍褂贸愔械倪@個(gè)成員變量或方法,就需要用到super。請(qǐng)看下面的類。
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:給定下面的代碼,哪個(gè)選項(xiàng)在替代"//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;
解析:因?yàn)樽兞縪ak被聲明是靜態(tài)的,如果它存在只能有一個(gè)本體,則它可以通過本類的名字或者通過定義本類的任何一個(gè)實(shí)例被改變。
答案:A、B、C
面試?yán)}4:當(dāng)編譯和運(yùn)行下列代碼時(shí)會(huì)發(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)行會(huì)出現(xiàn)下列出錯(cuò)信息。
"Only constructors can invoke constructors"
Checket作為一個(gè)構(gòu)造方法應(yīng)該在調(diào)用時(shí)從最老的祖先類開始向下調(diào)用,調(diào)用super會(huì)引起程序在編譯和運(yùn)行時(shí)間上的錯(cuò)誤。
Java中的關(guān)鍵字super:調(diào)用父類的屬性,一個(gè)類中如果有int x屬性,如果其子類中也定義了int x屬性的話,在子類中調(diào)用父類的x屬性時(shí)應(yīng)用super.x=6,表示該x是引用的父類的屬性,而要表示子類中的x屬性的話,使用this.x。
this和super:在Java中,this通常指當(dāng)前對(duì)象,super則指父類的對(duì)象。若想要引用當(dāng)前對(duì)象的某種東西,比如當(dāng)前對(duì)象的某個(gè)方法,或當(dāng)前對(duì)象的某個(gè)成員,便可以利用this來實(shí)現(xiàn)這個(gè)目的。當(dāng)然,this的另一個(gè)用途是調(diào)用當(dāng)前對(duì)象的另一個(gè)構(gòu)造函數(shù)。如果想引用父類的某種東西,則非super莫屬。
Java里在子類中用super調(diào)用父類構(gòu)造函數(shù)時(shí),調(diào)用函數(shù)必須放在子類的第一條語句的位置,如果想用super繼承父類構(gòu)造的方法,但是沒有放在第一行的話,那么在super之前的語句,也許是為了滿足自己想要完成某些行為的語句,但是又用了super繼承父類的構(gòu)造方法,以前所做的修改就都回到以前了,也就是說又成了父類的構(gòu)造方法了。
答案:A