面試例題1:下面程序的結(jié)果是什么?[Trend公司面試題]
class Tester
{
int var;
Tester(double var)
{
this.var = (int)var;
}
Tester(int var)
{
this("hello");
}
Tester(String s)
{
this();
System.out.println(s);
}
Tester()
{
System.out.println("good-bye");
}
public static void main(String[] args)
{
Tester t = new Tester(5);
}
}
答案:
good-bye
hello
擴展知識(變量的內(nèi)存分配情況)
在Java中有兩個非常特殊的變量:this和super,這兩個變量在使用前都是不需要聲明的。this變量使用在一個成員函數(shù)的內(nèi)部,指向當前對象,當前對象指的是調(diào)用當前正在執(zhí)行方法的那個對象。super變量是直接指向超類的構(gòu)造函數(shù),用來引用超類中的變量和方法。因此它們都是非常有用的變量。下面介紹一下this的使用方法。
先看下面的一段代碼。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String p_name,String p_gender,String
p_nationality,String p_address,int p_age)
{
name=p_name;
gender=p_gender;
nationality=p_nationality;
address=p_address;
age=p_age;
}
}
在PersonInformation()函數(shù)中這個對象的方法提示可以直接訪問對象的成員變量,而且在同一個范圍中,定義兩個相同的名字的局部變量是不允許的。如果確實想使類的成員變量與方法的參數(shù)或方法自己定義的局部變量同名的話,就需要想一種方法使成員變量與跟它同名的方法參數(shù)或局部變量區(qū)分開來,這就要使用到this變量。下面改寫一下上面的代碼,使PersonInformation類的構(gòu)造函數(shù)的每個參數(shù)都有與對象成員變量相同的名字,而成員變量的初值由參數(shù)給出。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String name,String gender,String
nationality,String address,int age)
{
this.name=name;
this.gender=gender;
this.nationality=nationality;
this.address=address;
this.age=age;
}
}
從上例中可以看出,該構(gòu)造函數(shù)中必須使用this。this在方法體中用來指向引用當前正在執(zhí)行方法的那個對象實例。this變量的類型總是為包含前執(zhí)行方法的類。在上例中,我們要區(qū)別參數(shù)name和成員變量name,寫成name=name顯然是不允許的。在參數(shù)或局部變量名與類成員變量名相同的時候,由于參數(shù)或局部變量的優(yōu)先級高,這樣在方法體中參數(shù)名或局部變量名將隱藏同名的成員變量,因此,為了指明成員變量,必須使用this顯式地指明當前對象。
有時候會遇到這種情況,全面地訪問當前對象,而不是訪問某一個個別的實例對象,此時也可以使用this,并利用Java中的toString()方法(它能夠返回一個描述這個對象的字符串)。如果把任何一個對象傳遞到System.out.println方法中,這個方法調(diào)用這個對象的toString方法,并打印出結(jié)果字符串,所以,可以用System.out.println(this)方法來打印出固有參數(shù)的當前狀態(tài)。
this還有一個用法,就是構(gòu)造函數(shù)的第一個語句,它的形式是this(參數(shù)表),這個構(gòu)造函數(shù)就會調(diào)用同一個類的另一個相對的構(gòu)造函數(shù)。請看下面的例子。
class UserInfo
{
public UserInfo(String name)
{
this(name,aNewSerialNumber);
}
public Userinfo(String name,int number)
{
userName=name;
userNumber=number;
}}
如果調(diào)用UserInfor newinfotable = new UserInfo("Wayne Zheng"),就會自動調(diào)用UserInfo(String name,int number)構(gòu)造函數(shù)。
可見,熟練掌握this在Java程序設(shè)計過程中是非常重要的。
面試例題2:以下代碼的運行結(jié)果是 。[Advantech公司2005年12月面試題]
class Base{
int i;
Base(){
add(1);
System.out.println(i);
}
void add(int v){
i+=v;
System.out.println(i);
}
void print(){
System.out.println(i);
}}class MyBase extends Base{
MyBase(){
add(2);
}
void add(int v){
i+=v*2;
System.out.println(i);
}}public class TestClu {
public static void main(String[] args) {
go(new MyBase());
//System.out.println();
}
static void go(Base b){
b.add(8);
//b.print();
}}
A.12 B.11 C.22 D.21
解析:
程序流程是這樣的:在主函數(shù)中,首先執(zhí)行new MyBase(),在這個過程中,子類會首先調(diào)用父類的構(gòu)造函數(shù);在父類的構(gòu)造函數(shù)Base()中執(zhí)行add()方法。這里需要注意,這個add方法由于是在新建MyBase對象時調(diào)用的,將會首先查找MyBase類中是否有此方法。所以,Base()函數(shù)中的add(1)實際上是:
void add(int v)
{
i+=v*2; System.out.println(i);
}
此時i的值即為2。在打印兩個2之后,父類構(gòu)造函數(shù)執(zhí)行完畢,執(zhí)行子類的構(gòu)造函數(shù),即MyBase(),這里的add(2)當然也是子類的。i的值就變?yōu)榱?。
最后執(zhí)行g(shù)o函數(shù),i即為22。
答案:C