Java程序员面试宝典--this
面試例題1:下面程序的結果是什么?[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
擴展知識(變量的內存分配情況)
在Java中有兩個非常特殊的變量:this和super,這兩個變量在使用前都是不需要聲明的。this變量使用在一個成員函數的內部,指向當前 對象,當前對象指的是調用當前正在執行方法的那個對象。super變量是直接指向超類的構造函數,用來引用超類中的變量和方法。因此它們都是非常有用的變 量。下面介紹一下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()函數中這個對象的方法提示可以直接訪問對象的成員變量,而且在同一個范圍中,定義兩個相同的名字的局部變 量是不允許的。如果確實想使類的成員變量與方法的參數或方法自己定義的局部變量同名的話,就需要想一種方法使成員變量與跟它同名的方法參數或局部變量區分 開來,這就要使用到this變量。下面改寫一下上面的代碼,使PersonInformation類的構造函數的每個參數都有與對象成員變量相同的名字, 而成員變量的初值由參數給出。
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;
}
}
從上例中可以看出,該構造函數中必須使用this。this在方法體中用來指向引用當前正在執行方法的那個對象實例。this變量的類型總是為包含 前執行方法的類。在上例中,我們要區別參數name和成員變量name,寫成name=name顯然是不允許的。在參數或局部變量名與類成員變量名相同的 時候,由于參數或局部變量的優先級高,這樣在方法體中參數名或局部變量名將隱藏同名的成員變量,因此,為了指明成員變量,必須使用this顯式地指明當前 對象。
有時候會遇到這種情況,全面地訪問當前對象,而不是訪問某一個個別的實例對象,此時也可以使用this,并利用Java中的toString()方 法(它能夠返回一個描述這個對象的字符串)。如果把任何一個對象傳遞到System.out.println方法中,這個方法調用這個對象的 toString方法,并打印出結果字符串,所以,可以用System.out.println(this)方法來打印出固有參數的當前狀態。
this還有一個用法,就是構造函數的第一個語句,它的形式是this(參數表),這個構造函數就會調用同一個類的另一個相對的構造函數。請看下面的例子。
class UserInfo
{
public UserInfo(String name)
{
this(name,aNewSerialNumber);
}
public Userinfo(String name,int number)
{
userName=name;
userNumber=number;
}
}
如果調用UserInfor newinfotable = new UserInfo("Wayne Zheng"),就會自動調用UserInfo(String name,int number)構造函數。
可見,熟練掌握this在Java程序設計過程中是非常重要的。
面試例題2:以下代碼的運行結果是???? 。[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
解析:
程序流程是這樣的:在主函數中,首先執行new MyBase(),在這個過程中,子類會首先調用父類的構造函數;在父類的構造函數Base()中執行add()方法。這里需要注意,這個add方法由于 是在新建MyBase對象時調用的,將會首先查找MyBase類中是否有此方法。所以,Base()函數中的add(1)實際上是:
void add(int v)
?????? {
???? i+=v*2;
???? System.out.println(i);
?? }
此時i的值即為2。在打印兩個2之后,父類構造函數執行完畢,執行子類的構造函數,即MyBase(),這里的add(2)當然也是子類的。i的值就變為了6。
最后執行go函數,i即為22。
答案:C
轉載于:https://www.cnblogs.com/homezzm/archive/2009/11/25/1610021.html
總結
以上是生活随笔為你收集整理的Java程序员面试宝典--this的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单元测试之道一:NUnit基础
- 下一篇: [转]十天学习PHP之第一天(PHP)-