天天看點

Java面試題記錄第四天Java面試題記錄第四天

Java面試題記錄第四天

1.Java的作用域有哪些?

答:在Java語言中,作用域是由花括号決定的,它決定變量名的可見性與生命周期。(個人看法,他的花括号意思是{},也就是方法中的作用域,一個方法一個作用域,對應的是局部變量,如果聲明在一開始,或者是static子產品中是全局變量)又會涉及到前幾天的知識,在Java語言中,變量類型主要有3中:成員變量,靜态變量,局部變量。

  • 成員變量,在第四天的學習中,可以了解到,成員變量可以是Java語言中任意的基本資料類型或引用資料類型(類,數組等),舉個例子:int i=0;或者是:private User user;**類的成員變量的作用範圍是,是在類中,方法之外。隻有當類被執行個體化後,成員變量才會在記憶體中配置設定空間并初始化,直到這個執行個體化對象的生命周期結束,成員變量的生命周期才結束。

    **

public class Test1 {
    private int a=0;
    public int b=1;
    public static void main(String[] args) {
        Test1 t=new Test1();
        int a=t.a;
        System.out.println(a);
        System.out.println(b);//這裡是IDEA報錯的,紅色
    }
}

分析一下代碼:在一開始,就聲明了private int a=0;public int b=1;兩個成員變量,
然而,沒有去執行個體化對象,直接調用成員變量會報紅,例如代碼中的b,然而,執行個體化一個對象後,比如t1,通過t1去調用a,就會輸出
           

同樣的成員變量由4中作用域:

Java面試題記錄第四天Java面試題記錄第四天

Java語言提供public,protected,private和預設等4種通路權限。其中public修飾的成員變量作用域最廣,允許被任何程式包種的類通路;protected修飾的成員變量允許被本類自身,子類及相同包的類通路;private修飾的成員變量隻能被本類通路,如果成員變量之前沒有顯示聲明通路權限,則該變量為預設通路權限,允許類自身和同一個包内的類通路。

  • 靜态變量是static修飾的成員變量,靜态變量不依賴于特定的執行個體,而是被所有執行個體共享,隻要一個類被加載,JVM就會給靜态變量配置設定空間。
  • 局部變量:作用域是在花括号内。方法内的變量。

    注意:private和protected不能修飾外部類,但可以用來修飾内部類。

2.一個Java檔案中是否可以定義多個類?

答:一個Java檔案中可以定義多個類,但是最多隻有一個類可以被public修飾,并且這個類的類名必須與檔案名相同。需要注意的是,當使用javac指令編譯這個.Java檔案時,他會給每一個類生成一個對應.class檔案,例如:

class TestClassFather{
    public void tellFather(){
        System.out.println("You are my son");
    }
}
public class TestClass extends TestClassFather{
    public static void main(String[] args) {
        TestClassFather testClassFather=new TestClass();//在子類中去執行個體化父類的對象
        testClassFather.tellFather();
    }
}
結果為:
You are my son
分析一下:去繼承父類的方法,用到了extends,注意這句話TestClassFather testClassFather=new TestClass();
會發現,結尾的時候不是TestClassFather,當子類繼承了父類以後,他同樣繼承了方法,這個方法就是指public修飾的,是以結尾使用了子類的類名,當然也可以直接使用子類的類名去建立對象,然後調用父類的方法。TestClass testClass=new TestClass();testClass.tellFather();也可以實作
           

但是如果使用javac TestClass.java指令編譯上述代碼,會生成兩個位元組嗎檔案:TestClass.class 和 TestClassFather.class

檔案。

3.什麼是構造函數?

答:首先了解構造函數是一種特殊的函數,用來在對象執行個體化時,初始化對象的成員變量。也就是說,當你在執行個體化一個對象時,會自動去調用構造方法,這個時候,調用哪一個方法取決于參數的不同,就會選擇不同的方法重載。構造函數有以下特點:

  • 構造函數必須與類的名字相同,并且不能有傳回值
  • 每個類可以有多個構造函數,當程式員沒有提供構造函數時,編譯器會自動加載一個預設的無參構造方法,如果程式員提供了構造方法,編譯器不會自動建立預設的構造方法
  • 構造函數的參數可以有0;1;一個以上,上不封頂,記住參數的形式→類型,參數名
  • 構造函數總是伴随着new操作(執行個體化)一起調用,不能由程式員去操作,而且隻能執行一次(一次執行個體化)
  • 構造方法不能被繼承,是以,它不能被覆寫,但是構造函數能夠重載,可以使用不同的參數的個數或者類型定義多個構造方法
  • 子類可以通過super關鍵字來顯示的調用父類的構造函數。(需要了解super和this關鍵字的用法,以及繼承。把這個疑惑放在後面面試題說。)

    4.什麼是重載?

    答:首先,了解了構造方法以後,直接可以說,構造方法的實作就是重載,但是要記住重載不止局限于構造方法。特點如下:

  • 方法名稱相同。在構造方法中,方法名稱要求必須與類名相同,同時,多個構造方法也就意味着方法名是相同的,但在這,普通的方法也可以名稱相同。
  • 參數清單必須不同。包括個數,類型或者是(參數排列順序不同,一般不用)。以下是代碼分析:
public class TestWrite {
    public String name;
    public String student_id;
    private String address;
    public String phone;
    protected String major;
    private float GPA;


    //get一般都是用來擷取某一個值,set一般是用來修改某一個值
    //getGPA()是用來擷取GPA,使用return來将值傳回
    public float getGPA(){
        return GPA;
    }
    //setGPA()是用來修改GPA的,但是這裡,隻要調用該方法,就會将GPA改為固定的值3.5f
    public void setGPA(){      //void不需要傳回值
        GPA=2.5f;
    }
    //該方法是用來設定個人資訊的,将會使用重載,注意檢視
    //對于剛開始學習Java的同學而言,這裡會有些迷茫
    //set剛剛說過是用來修改資訊的,那麼就是将setInfo()方法的參數傳入,
    public void setInfo(String n,String id){
        name=n;
        student_id=id;
    }
    //這裡就是用到了重載
    public void setInfo(String n,String id,String addr){
        name=n;
        student_id=id;
        address=addr;
    }
    //這裡就是用到了重載
    public void setInfo(float gpa,String id){
        GPA=gpa;
        student_id=id;
    }
    //這裡将會使用get方法來擷取資料,其實就是一個習慣,對應英語的翻譯,如果将方法内容與set交換,
    //get就變成了修改資訊了
    //這裡也會用到重載,注意觀察
    public void getInfo(float gpa){     //注意這裡,沒有傳回值類型,是void,因為比較簡單,直接輸出
        System.out.println("學号:"+student_id+"\tGPA"+gpa);
    }
    public void getInfo(String addr){
        System.out.println("學号:"+student_id+"\t姓名"+name+"\t位址"+addr);
    }

    public static void main(String[] args) {
        TestWrite testWrite1=new TestWrite();
        TestWrite testWrite2=new TestWrite();
        //下面是修改資訊,也可以說是設定資訊
        testWrite1.setInfo("段桑","2017006185","嘉力頓");//注意聲明的時候,姓名,id,位址都是字元串形式,需要引号
        testWrite2.setInfo(3.5f,"2017006185");//GPA在聲明的時候是float形式
        //設定完以後,獲得資訊,并且輸出
        testWrite1.getInfo("嘉力頓");
        testWrite2.getInfo(3.5f);
    }
}
結果為:
學号:2017006185	姓名段桑	位址嘉力頓
學号:2017006185	GPA3.5
這裡涉及到get和set的具體知識,暫時先了解這麼多
           

5.switch對于string類型的支援,基于什麼(為什麼switch可以去對字元串支援)?

答:通過對case後面的string對象調用hsahCode()方法,得到一個int類型的hash值,然後利用這個值來辨別這個case,那麼當進行比對時(switch後的表達式與case後面的string類型比較時),首先會調用這個字元串的hashCode()方法,獲得一個hash值,再用這個hash值去比對case,如果比對成功,,在這再調用string.equals()方法去進行比對。(這裡就可以聯想到之前講過的第四點。點我檢視)

6.

  1. 在Java語言中,當參與運算的兩個變量的資料類型不同時,就需要進行隐式的資料類型轉換,轉換規則是:從低精度向高精度轉換。
  2. char類型在轉換時會對應相應的ASCLL碼。在Java中一個漢字是占2個位元組,而一個char也是兩個位元組,是以一個char可以存放一個漢字,當然前提是采用unicode編碼(byte是1個位元組,char是兩個位元組,但是char裡可以存一個漢字,這麼說漢字就占用兩個位元組?String類型裡的漢字,按照編碼格式的不同,分為2-4個位元組的占用,UTF-8占用3個位元組,特别的占用4個位元組。GBK裡漢字确實是占用2個位元組。UTF-16裡漢字一般占2個位元組,特殊的是4個位元組。綜上所述,那要看漢字是以什麼編碼格式來存儲了,以及漢字是否為特殊漢字。)
  3. 關于強制轉換資料類型,從高到低,需要注意long所占位元組比float的位元組數小。在強制轉換資料類型會損失精度。
  4. 在Java語言中,基本資料類型是不能與布爾型資料轉換的。
  5. 例題:
int i=1;
if(i){
		System.out.println("true");
}else{
		System.out.println("false");
}
結果是:報錯,原因是if條件語句中表達式是布爾型的,i的類型是int型,int類型不能被隐式的轉換為boolean型
           
  1. 在Java語句中涉及到byte,short,char類型運算時,首先會把這些類型的白能量強制轉換為int類型(隐式的),然後對int類型的值進行運算,得到的結果也是int型的。首先

    short s1=1;s1=s1+1;

    由于在運作時,s1先轉換為int型,是以s1+1會報錯,正确的寫法是:

    short s1=1;s1=(short)s1+1;

  2. 特殊情況:使用到+=時,Java編譯器會對其進行特殊處理,

    short s1=1;s1+=1;

    會通過編譯。

7.包的作用:第一:提供多層命名空間,每個包裡面可以出現名字相同的類;第二:對類進行按功能劃分,是組織更清晰一點。(在Java基礎裡面使用不到的,在項目中會有dao層,service層,controller層)