1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。
-------------------------------------------------------------------------------
5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一個整數表示式或者列舉常量(更大字型),整
數表示式可以是int基本型別或Integer包裝型別,由於,byte,short,char都可以隱含轉換
為int,所以,這些型別以及這些型別的包裝型別也是可以的。顯然,long和String型別都
不符合switch的語法規定,並且不能被隱式轉換成int型別,所以,它們不能作用於swtich
語句中。
補充:面試題
switch語句的表示式可以是byte嗎?可以是long嗎?可以是String嗎?
可以,不可以,JDK7以後可以
-------------------------------------------------------------------------------
6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
對於short s1 = 1; s1 = s1 + 1;
由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,
編譯器將報告需要強制轉換型別的錯誤。
對於short s1 = 1; s1 += 1;由於+=是java語言規定的運算子,
java編譯器會對它進行特殊處理,因此可以正確編譯。
-------------------------------------------------------------------------------
7、char型變數中能不能存貯一箇中文漢字?為什麼?
char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,所
以,char型變數中當然可以儲存漢字啦。
-------------------------------------------------------------------------------
10、使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?
使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的
內容還是可以改變的。例如,對於如下語句:
final StringBuffer a=new StringBuffer("immutable");
執行如下語句將報告編譯期錯誤:
a=new StringBuffer("");
但是,執行如下語句則可以通過編譯:
a.append(" broken!");
-------------------------------------------------------------------------------
11、"=="和equals方法究竟有什麼區別?
==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中
所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==
操作符。
記住,字串的比較基本上都是使用equals方法。
補充:面試題
/* ==:
* 基本型別:比較的就是值是否相同
* 引用型別:比較的就是地址值是否相同
* equals:
* 引用型別:預設情況下,比較的是地址值。
* 不過,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較物件的成員變數值是否相同
*/
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("林青霞", 27);
System.out.println(s1 == s2); // false
Student s3 = s1;
System.out.println(s1 == s3);// true
System.out.println("---------------");
System.out.println(s1.equals(s2)); // obj = s2; //false
System.out.println(s1.equals(s1)); // true
System.out.println(s1.equals(s3)); // true
Student s4 = new Student("風清揚",30);
System.out.println(s1.equals(s4)); //false
Demo d = new Demo();
System.out.println(s1.equals(d)); //ClassCastException
}
}
class Demo {}
-------------------------------------------------------------------------------
補充:面試題
兩個思考題(理解)
/*
思考題1:看程式寫結果,然後分析為什麼是這個樣子的。並畫圖講解。最後總結Java中引數傳遞規律。
Java中的引數傳遞問題:
基本型別:形式引數的改變對實際引數沒有影響。
引用型別:形式引數的改變直接影響實際引數。
*/
class ArgsDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b); //a:10,b:20
change(a,b);
System.out.println("a:"+a+",b:"+b); //*** a:10,b:20
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]); //*** 4
}
public static void change(int a,int b) { //a:10,b:20
System.out.println("a:"+a+",b:"+b); //a:10,b:20
a = b; //a=20
b = a + b; //b=40
System.out.println("a:"+a+",b:"+b); //a:20,b:40
}
public static void change(int[] arr) { //arr={1,2,3,4,5};
for(int x=0; x<arr.length; x++) {
if(arr[x]%2==0) {
arr[x]*=2;
}
}
//arr={1,4,3,8,5};
}
}
Java中的引數傳遞問題:
Java中只有值傳遞(基本型別傳遞的是值,引用型別傳遞的是地址值,都叫值傳遞)。
一定要記住!!!
基本型別傳遞的是值,別人拿這個值怎麼變我這個變數儲存的值不變,
相當於把值複製了一份給你,你怎麼變與我無關,我不變。
引用型別傳遞的是地址值,兩個拿的都是同一塊堆記憶體,改變的都是同一塊地址值,
兩個引用指向同一個堆記憶體。
基本型別:形式引數的改變不影響實際引數
引用型別:形式引數的改變直接影響實際參(兩個拿的都是同一塊堆記憶體地址)
-------------------------------------------------------------------------------
補充:面試題
final關鍵字(掌握)
(1)是最終的意思,可以修飾類,方法,變數。
/*
繼承的程式碼體現
由於繼承中方法有一個現象:方法重寫。
所以,父類的功能,就會被子類給覆蓋調。
有些時候,我們不想讓子類去覆蓋掉父類的功能,只能讓他使用。
這個時候,針對這種情況,Java就提供了一個關鍵字:final
final:最終的意思。常見的是它可以修飾類,方法,變數。
*/
class Fu {
public final void show() {
System.out.println("這裡是絕密資源,任何人都不能修改");
}
}
class Zi extends Fu {
// Zi中的show()無法覆蓋Fu中的show()
public void show() {
System.out.println("這是一堆垃圾");
}
}
class ZiDemo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
(2)特點:
A:它修飾的類,該類不能被繼承(這個類叫最終類,沒有子類)。
B:它修飾的方法,該方法不能被重寫。
C:它修飾的變數,該變數只能被賦值一次,不能被重新賦值,因為這個變數變成了一個常量。
常量: A:字面值常量"hello",10,true
B: 自定義常量final int x = 10;
(3)面試相關:final修飾區域性變數的問題
A:區域性變數
a:基本型別: 基本型別的值不能發生改變
b:引用型別: 引用型別的地址值不能發生改變,但是,該物件的堆記憶體的值是可以改變的。
/*
面試題:final修飾區域性變數的問題
基本型別:基本型別的值不能發生改變。
引用型別:引用型別的地址值不能發生改變,但是,該物件的堆記憶體的值是可以改變的。
*/
class Student {
int age = 10;
}
class FinalTest {
public static void main(String[] args) {
//區域性變數是基本資料型別
int x = 10;
x = 100;
System.out.println(x);
final int y = 10;
//無法為最終變數y分配值
//y = 100;
System.out.println(y);
System.out.println("--------------");
//區域性變數是引用資料型別
Student s = new Student();
System.out.println(s.age);
s.age = 100;
System.out.println(s.age);
System.out.println("--------------");
final Student ss = new Student();
System.out.println(ss.age);
ss.age = 100;
System.out.println(ss.age);
//重新分配記憶體空間
//無法為最終變數ss分配值
ss = new Student();
}
}
B:初始化時機
a:只能初始化一次。
b:常見的給值
定義的時候。(推薦)
構造方法中。
/*
final修飾變數的初始化時機
A:被final修飾的變數只能賦值一次。
B:在構造方法完畢前。(僅僅針對非靜態的常量,靜態的早就載入了)
*/
class Demo {
//int num = 10;
//final int num2 = 20;
int num;
final int num2;
{
//num2 = 10;
}
public Demo() {
num = 100;
//無法為最終變數num2分配值
num2 = 200;
}
}
class FinalTest2 {
public static void main(String[] args) {
Demo d = new Demo();
System.out.println(d.num);
System.out.println(d.num2);
}
}