&和&&的區別?
& 無論左邊運算式執行結果如何,都會執行右邊
&& 左邊執行不符合條件時,右邊不執行
1 public static void main(String[] args) { 2 int i = 1; 3 int j = 2; 4 5 // & 6 if(++i==10 & ++j==10) { //false 7 System.out.println(i); 8 System.out.println(j); 9 } 10 System.out.println(i); //2 11 System.out.println(j); //3 12 13 // & 14 if(++i==10 && ++j==10) { //false 15 System.out.println(i); 16 System.out.println(j); 17 } 18 System.out.println(i); //3 19 System.out.println(j); //3 20 }
int 和 Integer 有什么區別?(基本資料型別有哪些?)(String不是基本資料型別)
Java 為每個基本型別都提供了包裝類,int 的包裝類就是 Integer,并且從 jdk1.5 引入了自動拆箱、裝箱機制,使得二者可以相互轉換,
原始型別:boolean,char,byte,short,int,long,float,double
包裝型別: Boolean,Character,Byte,Short,Integer,Long,Float,Double
String、StringBuffer、 StringBuilder 的區別?
String 用于字串操作,不可改變型別,每次值發生改變,都會創建一個新的物件,底層使用 char 陣列實作,因為 使用 final,所以 String 不可以被繼承
StringBuffer 用于字串操作,可變型別,對方法增加了同步鎖,執行緒安全
StringBuilder 和 StringBuffer 類似,都是字串緩沖區,執行緒不安全
執行效率:StringBuilder(執行緒不安全)>StringBuffer(執行緒安全)>String
String 類的常用方法都有那些?
indexOf():回傳指定字符得索引
charAt():回傳指定索引處得字符
repalce():字串替換
trim():去除字串兩端的空白
split():分割字串 回傳分割后的字串陣列
getBytes():回傳字串的 byte 型別陣列
length():回傳字串的長度
toLowerCase():字串轉小寫
toUpperCase():字串轉大寫
substring():截取字串
equals():字串比較
final 修飾 StringBuffer 后還可以 append 嗎?
可以,final 修飾的是一個參考變數,那么這個參考始終指向這個物件,但這個物件內部的屬性是可以改變的,
1 public static void main(String[] args) { 2 final StringBuffer sb = new StringBuffer(); 3 sb.append("a"); 4 sb.append("b"); 5 sb.append("c"); 6 7 System.out.println(sb); //abc 8 9 }
String 字串修改實作的原理?
當 String 修改字串的時候會創建一個 StringBuilder 物件,接下來呼叫 append 方法,最后通過 toString 方法回傳,
什么是值傳遞和參考傳遞?
值傳遞:基本型別的一個概念,傳遞的是該變數的一個副本,改變副本不影響原變數
參考傳遞:物件型變數而言,傳遞的是該物件地址的一個副本,所以對參考物件操作影響原變數
== 比較的是什么?
== 比較兩個物件基本記憶體參考,如果兩個物件的參考完全相同,回傳 true,否則回傳 false,如果兩個物件是基本資料型別,則比較值是否相等,
1 public static void main(String[] args) { 2 int i = 10; 3 int j = 10; 4 System.out.println(i==j); 5 6 String a = new String("hello"); 7 String b = new String("hello"); 8 System.out.println(a==b); 9 }
兩個物件的 hashCode() 相同,則 equals() 也一定為 true 嗎?
如果兩個物件相等,則 hashCode 一定也是相同的;反之不成立,
1 public static void main(String[] args) { 2 String str1 = "通話"; 3 String str2 = "重地"; 4 System.out.println(str1.hashCode());//1179395 5 System.out.println(str2.hashCode());//1179395 6 7 System.out.println(str1.equals(str2));//false 8 }
Java 里面的 final 關鍵字是怎么用的?
final關鍵字修飾的變數,只能進行一次賦值操作,并且在生存期內不可以改變它的值,
final關鍵字修飾的引數,在此方法中,不可更改該引數的值,
final關鍵字修飾的方法,該方法不能被重寫,
final關鍵字修飾的類,該類不能被繼承,
解釋下什么是面向物件?面向物件和面向程序的區別?
面向物件的程式是由物件組成的,每個物件包含用戶公開的特定功能部分和隱藏的實作部分, 結構清晰,程式便于模塊化,結構化,抽象化,更加符合人類的思維方式,
面向程序的程式通過設計一系列的程序來解決問題, 面向程序側重整個問題的解決步驟,著眼區域或者具體,
面向物件的三大特性?分別解釋下?
封裝:通常認為封裝是把資料和操作資料的方法封裝起來,對資料的訪問只能通過已定義的介面,
繼承:繼承是從已有類得到繼承資訊創建新類的程序,提供繼承資訊的類被稱為父類(超類/基類),得到繼承資訊的被稱為子類(派生類),
多型:分為編譯時多型(方法多載)和運行時多型(方法重寫),
要實作多型需要做兩件事:一是子類繼承父類并重寫父類中的方法,二是用父型別參考子型別物件,這樣同樣的參考呼叫同樣的方法就會根據子類物件的不同而表現出不同的行為,主要由以下三種方式實作:
通過子類對父類的覆寫實作
通過在一個類中對方法的多載來實作
通過將子類物件作為父類物件使用來實作
Java 類初始化采用什么順序呢?
初始化父類中的靜態成員變數和靜態代碼塊
初始化子類中的靜態成員變數和靜態代碼塊
初始化父類中的普通成員變數和代碼塊,再執行父類的構造方法
初始化子類中的普通成員變數和代碼塊,再執行父子類的構造方法
Java 是否支持多繼承?
Java不支持多繼承,但Java可以實作多個介面,從而達到類似多繼承的目的,
什么是建構式?什么是建構式多載?
新物件被創建的時候會呼叫建構式,每個類都有建構式,如果沒有顯式的創建建構式,Java 編譯器會自動為該類創建一個默認的建構式,
若該類已經創建非空參建構式,默認的無參建構式就會失效,
建構式多載和方法多載類似,可以為一個類創建多個建構式,但是要保證每個建構式都有唯一的引數串列,
多載和重寫的區別?
多載,編譯時多型,在一個類里面,方法名字相同,而引數不同,回傳型別可以相同也可以不同,
重寫,也叫覆寫,運行時多型,重寫發生在子類與父類之間,重寫要求子類與父類具有相同的引數串列和回傳型別,重寫的方法呼叫時會覆寫父類的方法,
請說明 Comparable 和 Comparator 介面的作用以及它們的區別?
Comparable:
它是一個排序介面,只包含一個函式 compareTo()
一個類實作了 Comparable 介面,就意味著該類本身支持排序,它可以直接通過 Arrays.sort() 或 Collections.sort() 進行排序
1 public class Human implements Comparable<Human> { 2 public Integer id; 3 public Integer age; 4 5 @Override 6 public int compareTo(Human o) { 7 if(this.age > o.age) { 8 return 1; 9 }else if(this.age < o.age) { 10 return -1; 11 }else{ 12 return 0; 13 } 14 } 15 16 }
Comparator:
它是一個比較器介面,包括兩個函式:compare() 和 equals()
一個類實作了Comparator介面,那么它就是一個比較器,其它的類,可以根據該比較器去排序
綜上所述:Comparable 是內部比較器,而 Comparator 是外部比較器,
public class Man implements Comparator<Man>{ public Integer id; public Integer age; @Override public int compare(Man o1, Man o2) { if(o1.age > o2.age) { return 1; }else if(o1.age < o2.age) { return -1; }else{ return 0; } } }
抽象類和介面有什么區別?
抽象類中可以定義建構式,介面不能定義建構式;
抽象類中可以有抽象方法和具體方法,而介面中只能有抽象方法(public abstract);
抽象類中的成員權限可以是 public、默認、protected(抽象類中抽象方法就是為了重寫,所以不能被 private 修飾),而介面中的成員只可以是 public(方法默認:public abstrat、成員變數默認:public static final);
抽象類中可以包含靜態方法,而介面中不可以包含靜態方法,
static 關鍵字的作用?Java 中是否可以重寫一個 private 或者是 static 的方法?
static 關鍵字表明一個成員變數或成員方法可以在沒有所屬類的情況下被訪問,
重寫是基于運行時動態系結的,而 static 方法是編譯時靜態系結的,static 方法與任何實體都不相關,所以不能重寫一個 static 方法
成員變數和區域變數的區別?
生命周期不同
成員變數:
類成員變數是從該類的準備階段開始,直到系統完全銷毀這個類,類變數的作用域與這個類的生存范圍相同
實體變數是從該類的實體被創建開始存在,直到系統完全銷毀這個實體,實體變數的作用域與對應實體的生存范圍相同
區域變數根據定義形式的不同,又可以分為如下三種:
形參,形參的作用域在整個方法中都有效
方法區域變數,作用域從定義這個變數的位置到方法結束時都有效
代碼塊區域變數,作用域從定義這個變數的位置到代碼塊結束時都有效
super 關鍵字的作用?
super 關鍵字可以在子類構造方法中顯式呼叫父類構造,但是必要處于第一行,
super 關鍵字可以在子類中顯式呼叫父類方法或變數,
有時候可以使用這個關鍵字擴展從父類繼承過來的方法,
請說明類和物件的區別?
類是對某一類事物的描述,是抽象的;而物件是表示的一個具體的個體,是類的一個實體,
物件是函式、變數的集合體,而類是一組函式、變數的集合體, 即類是一組具有相同屬性的物件集合體,
(class修飾的是類,new出來的是物件)
finally 塊中的代碼什么時候被執行?
在 Java 語言的例外處理中,finally 塊的作用就是為了保證無論出現什么情況,finally 塊里的代碼一定會被執行,由于程式執行 return 就意味著結束對當前函式的呼叫并跳出這個函式體,因此任何陳述句要執行都只能在 return 前執行(除非碰到 exit 函式),因此 finally 塊里的代碼也是在 return 之前執行的,
此外,如果 try-finally 或者 catch-finally 中都有 return,那么 finally 塊中的 return 將會覆寫別處的 return 陳述句,最侄訓傳到呼叫者那里的是 finally 中 return 的值,
finally 是不是一定會被執行到?
不一定,下面列舉兩種執行不到的情況:
當程式進入 try 塊之前就出現例外時,會直接結束,不會執行 finally 塊中的代碼;
當程式在 try 塊中強制退出時也不會去執行 finally 塊中的代碼,比如在 try 塊中執行 exit 方法,
try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?
會,程式在執行到 return 時會首先將回傳值存盤在一個指定的位置,其次去執行 finally 塊,最后再回傳,因此,對基本資料型別,在 finally 塊中改變 return 的值沒有任何影響,直接覆寫掉;而對參考型別是有影響的,回傳的是在 finally 對 前面 return 陳述句回傳物件的修改值,
throw 和 throws 的區別?
throw:在方法體內部,表示拋出例外,由方法體內部的陳述句處理;throw 是具體向外拋出例外的動作,所以它拋出的是一個例外實體;
throws:在方法宣告后面,表示如果拋出例外,由該方法的呼叫者來進行例外的處理;表示出現例外的可能性,并不一定會發生這種例外,
常見的例外類有哪些?
ArithmeticExecption
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
FileNotFoundException
NumberFormatException
SQLException
IOException
NoSuchMethodException
IndexOutOfBoundsExecption
IllegalArgumentException
Java 的泛型是如何作業的 ? 什么是型別擦除 ?
泛型使得資料的型別可以通過引數傳遞過來,它提供了一種擴展能力,更符合面向物件思想,
當具體的型別確定之后,泛型還提供了型別檢測機制,不符合的型別不允許賦值,否則編譯不通過,
所以型別擦除就是在進入 JVM 之前,與泛型相關的資訊會被擦除掉,這些資訊被擦除后,相應的型別就會被替換成泛型型別引數的上限,如果沒有指定,則替換成 Object,
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符包括兩種:
表示型別的上界,格式為:<? extends T>,即型別必須為 T 型別或者 T 子類
表示型別的下界,格式為:<? super T>,即型別必須為 T 型別或者 T 的父類
非限定通配符:型別為 ,可以用任意型別替代,
List<? extends T> 和 List <? super T> 之間有什么區別 ?
List<? extends T>,即型別必須為 T 型別或者 T 子類
List <? super T>,即型別必須為 T 型別或者 T 的父類
Java 中的 IO 流的分類?
按功能來分:輸入流(input)、輸出流(output),
按型別來分:位元組流 和 字符流,
位元組流和字符流有什么區別?
位元組流按 8 位傳輸,以位元組為單位輸入輸出資料,字符流按 16 位傳輸,以字符為單位輸入輸出資料,
但是不管檔案讀寫還是網路發送接收,資訊的最小存盤單元都是位元組,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189218.html
標籤:Java
