面試題4

ZHOU_VIP發表於2017-03-13

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);
			}
		}


相關文章