Java必背100條
1、編寫:編寫的Java程式碼儲存在以“.java”結尾的原始檔中。
2、編譯:使用javac.exe命令編譯java原始檔,生成位元組碼檔案。格式:javac 原始檔名.java
3、執行:使用java.exe命令解釋執行位元組碼檔案。格式:java 類名
4、在一個java原始檔中可以宣告多個class,但是隻能最多有一個類宣告為public,而且被宣告為public的類的類名必須與原始檔名相同。
5、java關鍵字中所有字母都為小寫
6、Java中的名稱命名規範:
包名:多單片語成時所有字母都小寫:xxxyyyzzz 類名、介面名:多單片語成時,所有單詞的首字母大寫:XxxYyyZzz
變數名、方法名:多單片語成時,第一個單詞首字母小寫,第二個單詞開始每個 單詞首字母大寫:xxxYyyZzz
常量名:所有字母都大寫。多單詞時每個單詞用下劃線連線:XXX_YYY_ZZZ
7、字串是屬於一個類,屬於引用資料型別
8、在類體內,在方法體外宣告的變數稱為成員變數。
9、在方法體內部宣告的變數稱為區域性變數。區域性變數除形參外,需顯式初始化才能使用。(形參也是區域性變數)
10、java的整型常量預設為 int 型,宣告long型常量須後加‘l’或‘L’。
11、Java 的浮點型常量預設為double型,宣告float型常量,須後加‘f’或‘F’。
12、Java中的所有字元都使用Unicode編碼,一個字元可以儲存一個字母,一個漢字,所以java中char型別是兩個位元組。
13、boolean型別資料只允許取值true和false,無null。不可以使用0或非 0 的整數替代false和true。Java虛擬機器中沒有任何供boolean值專用的位元組碼指令,Java語言表達所操作的 boolean值,在編譯之後都使用java虛擬機器中的int資料型別來代替:true用1表示,false 用0表示。
14、雖然long型別是8個位元組,float是4個位元組,但是float型別採用科學計數法儲存,所以float型別的儲存範圍比long型別更大。
19、自動型別轉換:容量小的型別自動轉換為容量大的資料型別。byte,short,char之間不會相互轉換,他們三者在計算時首先轉換為int型別。
20、強制型別轉換:將容量大的資料型別轉換為容量小的資料型別,但可能造成精度降低或溢位。
21、字串不能直接轉換為基本型別,但透過基本型別對應的包裝類則可以實現把字串轉換成基本型別。
22、計算機底層都以二進位制補碼的方式來儲存資料。
23、正數(最高位是0)的原碼、反碼、補碼都相同,負數(最高位是1)的補碼是其反碼+1。
24、賦值運算子:= += -= *= /= %=,運算的結果不會改變變數本身的資料型別。short i = i + 1;由於常量“1”預設是int型的,所以編譯會報錯,使用short i += 1,則做到了+1的作用,也沒有改變資料型別。
25、&與&&、| 與 | | 的區別:&&、| | 具備短路功能,左邊的條件成立或者不成立,右邊的條件不用再判斷,&、| 不管什麼情況,都要把所有條件判斷完。
26、位運算:位運算子操作的都是整型的資料。
(左移運算子)<< :在一定範圍內,每向左移1位,相當於 * 2
(右移運算子)>> : 在一定範圍內,每向右移1位,相當於 / 2
27、流程控制:
順序結構:程式從上到下執行。
分支結構:if-else if - else、switch-case
迴圈結構:for、while、do-while
28、陣列屬於引用資料型別變數,但是陣列的元素既可以是基本資料型別,也可以是引用資料型別。
29、陣列的長度一旦確定就不能修改,初始化完成,長度就定了。
30、陣列靜態初始化:陣列元素的初始化和陣列元素的賦值同時進行。
例如:int a[ ] = new int [ ] { 1,2,3 };
31、陣列動態初始化:陣列元素的初始化和陣列元素的賦值分開進行。
例如:int b[ ] = new int [5]; b[0] = 1 ;
32、陣列元素的預設初始化值:
整型:0
浮點型:0.0
字元型:0或者’\u0000’,而非’0’
布林型別:false
引用資料型別:null
33、關鍵字 break、continue 可以帶標籤使用(類似於C語言的goto語句)
break label;//結束指定標識的一層迴圈結構。
continue label;//結束指定標識的一層迴圈結構當次迴圈。
34、面向物件vs面向過程
面向過程:強調的是功能行為,以函式為最小單位,考慮怎麼做。
面向物件:強調具備了功能的物件,以類/物件為最小單位,考慮誰來做。
35、面向物件中兩個重要的概念:
類:對一類事物的描述,是抽象的、概念上的定義
物件:是實際存在的該類事物的每個個體,因而也稱為例項(instance)
36、虛擬機器棧,即為平時提到的棧結構。區域性變數儲存在棧結構中;new出來的結構(比如:陣列、物件)載入在堆空間中。補充:物件的屬性(非static的成員變數)也是載入在堆空間中。int arr [ ] = new arr [ ],以等號“=”為界,左邊是區域性變數存放在棧,右邊是new 的機構,存放在堆中。
方法區:類的載入資訊、常量池、靜態域
37、“屬性”與“變數”的區別:
① 在類中宣告的位置的不同
屬性:直接定義在類的一對{}內
.
區域性變數:宣告在方法內、方法形參、程式碼塊內、構造器形參、構造器內部的變數
② 關於許可權修飾符的不同
屬性:可以在宣告屬性時,指明其許可權,使用許可權修飾符。常用的許可權修飾符:private、public、預設、protected —>體現為封裝性。
區域性變數:不可以使用許可權修飾符。
屬性:類的屬性,根據其型別,都預設初始化值。
整型(byte、short、int、long:0)
浮點型(float、double:0.0)
字元型(char:0 (或’\u0000’))
布林型(boolean:false)
引用資料型別(類、陣列、介面:null)
區域性變數:沒預設初始化值。意味著,我們在呼叫區域性變數之前,一定要顯式賦值。特別地:形參在呼叫時,我們賦值即可。
2.4 在記憶體中載入的位置:
屬性:載入到堆空間中 (非static)
區域性變數:載入到棧空間
38、 如果方法沒返回值,“return;”表示結束此方法的意思。
39、封裝性思想具體的程式碼體現:
封裝性思想具體的程式碼體現:
體現一 將類的屬性xxx私化(private),同時,提供公共的(public)方法來獲取(getXxx)和設定(setXxx)此屬性的值
體現二 不對外暴露的私有的方法
體現三 單例模式(將構造器私有化)
體現四 如果不希望類在包外被呼叫,可以將類設定為預設的。
40、許可權修飾符的範圍:
41、4種許可權都可以用來修飾類的內部結構:屬性、方法、構造器、內部類。修飾類的話,只能使用:預設、public。
42、如果沒顯式的定義類的構造器的話,則系統預設提供一個空參的構造器。
43、一個類中定義的多個構造器,彼此構成過載。
44、一旦我們顯式的定義了類的構造器之後,系統就不再提供預設的空參構造器。
45、一個類中,至少會有一個構造器。
46、this可以理解為:當前物件 或 當前正在建立的物件。
47、可以顯式的使用"this(形參列表)"方式,呼叫本類中指定的其他構造器,但是構造器中不能透過"this(形參列表)"方式呼叫自己(死迴圈)。
48、規定:"this(形參列表)“必須宣告在當前構造器的首行,可以推出構造器內部,最多隻能宣告一個"this(形參列表)”,用來呼叫其他的構造器。
49、如果使用的類或介面是java.lang包下定義的,則可以省略import結構。
50、使用"xxx.*"方式表明可以呼叫xxx包下的所結構。但是如果使用的是xxx子包下的結構,則仍需要顯式匯入。
51、一個類可以被多個子類繼承(一個爸爸可以有多個兒子),但是一個類只能有一個父類(一個兒子只能有一個親生爸爸)
52、子類繼承父類以後有哪些不同?
一旦子類A繼承父類B以後,子類A中就獲取了父類B中宣告的所有的屬性和方法。特別的,父類中宣告為private的屬性或方法,子類繼承父類以後,仍然是獲取了父類中私的結構,只因為封裝性(private許可權修飾符)的影響,使得子類不能直接呼叫父類的結構而已。
子類繼承父類以後,還可以宣告自己特有的屬性或方法:實現功能的拓展。
53、子類直接繼承的父類,稱為:直接父類。間接繼承的父類稱為:間接父類。子類繼承父類以後,就獲取了直接父類以及所有間接父類中宣告的屬性和方法。
54、如果沒沒有顯式的宣告一個類的父類的話,則此類繼承於java.lang.Object類。
55、什麼是方法的重寫(override 或 overwrite)?
答:子類繼承父類以後,可以對父類中同名同參數的方法,進行覆蓋操作。
56、重寫的規則:
子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同 。
②子類重寫的方法的許可權修飾符不小於父類被重寫的方法的許可權修飾符 特殊情況:子類不能重寫父類中宣告為private許可權的方法。
父類被重寫的方法的返回值型別是A型別,則子類重寫的方法的返回值型別可以是A類或A類的子類。
父類被重寫的方法的返回值型別是基本資料型別(比如:double),則子類重寫的方法的返回值型別必須是相同的基本資料型別(必須也是double)。
④ 子類重寫的方法丟擲的異常型別不大於父類被重寫的方法丟擲的異常型別。
57、什麼是重寫和什麼是過載?
概念 說明
重 載 是指允許存在多個同名方法,而這些方法的引數不同。編譯器根據方法不同的引數表,對同名方法的名稱做修飾。對於編譯器而言,這些同名方法就成了不同的方法。它們的呼叫地址在編譯期就綁定了。Java的過載是可以包括父類和子類的,即子類可以過載父類的同名不同引數的方法。所以,對於過載而言,在方法呼叫之前,編譯器就已經確定了所要呼叫的方法,這稱為“早繫結”或“靜態繫結” 。
重寫 方法重寫的前提是發生在具有繼承關係的兩個類之間,只等到方法呼叫的那一刻,解釋執行器才會確定所要呼叫的具體方法,這稱為“晚繫結”或“動態繫結”。
58、super呼叫屬性、方法:
①在子類的方法或構造器中,透過使用"super.屬性"或"super.方法"的方式,顯式的呼叫父類中宣告的屬性或方法,通常情況下,習慣省略"super."。
②特殊情況:當子類和父類中定義了同名的屬性時,要想在子類中呼叫父類中宣告的屬性,則必須顯式的使用"super.屬性"的方式,表明呼叫的是父類中宣告的屬性。
59、super呼叫構造器:
1 我們可以在子類的構造器中顯式的使用"super(形參列表)"的方式,呼叫父類中宣告的指定的構造器。
2 "super(形參列表)"的使用,必須宣告在子類構造器的首行!
3 我們在類的構造器中,針對於"this(形參列表)"或"super(形參列表)"只能二一,不能同時出現。
4 在構造器的首行,沒顯式的宣告"this(形參列表)“或"super(形參列表)”,則預設呼叫的是父類中空參的構造器:super() 。
5 在類的多個構造器中,至少一個類的構造器中使用了"super(形參列表)",呼叫父類中的構造器。
60、子類物件例項化過程:
從結果上看:子類繼承父類以後,就獲取了父類中宣告的屬性或方法,建立子類的物件,就會在堆空間中載入父類中宣告的屬性。
從過程上看:透過子類的構造器建立子類物件時,一定會直接或間接的呼叫其父 類的構造器,進而呼叫父類的父類的構造器,…直到呼叫了java.lang.Object類中空參的構造器為止。正因為載入過所的父類的結構,所以才可以看到記憶體中父類中的結構,子類物件才可以考慮進行呼叫。
61、多型性:可以理解為一個事物的多種形態。物件的多型性:父類的引用指向子類的物件(或子類的物件賦給父類的引用),Person p = new Man(); 。有了物件的多型性以後,我們在編譯期,只能呼叫父類中宣告的方法,但在執行期,我們實際執行的是子類重寫父類的方法。總結:編譯,看左邊;執行,看右邊。多型執行時行為,不是編譯時行為。
62、物件的多型性,只適用於方法,不適用於屬性(編譯和執行都看左邊)。
63、Object類中定義的equals()和==的作用是相同的:比較兩個物件的地址值是否相同.即兩個引用是否指向同一個物件實體。
64、String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以後,比較的不是兩個引用的地址是否相同,而是比較兩個物件的"實體內容"是否相同。
65、“==”如果比較的是基本資料型別變數:比較兩個變數儲存的資料是否相等。(不一定型別要相同,有自動型別提升)如果比較的是引用資料型別變數:比較兩個物件的地址值是否相同.即兩個引用是否指向同一個物件實體。
66、當我們輸出一個物件的引用時,實際上就是呼叫當前物件的toString()。
67、Object類中toString()的定義:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
68、像String、Date、File、包裝類等都重寫了Object類中的toString()方法,使得在呼叫物件的toString()時,返回"實體內容"資訊。
69、基本資料型別與對應的包裝類:
70、自動裝箱和自動拆箱(JDK 5.0之後)
71、static關鍵字可以用來修飾屬性、方法、程式碼塊、內部類。
72、靜態變數 vs 例項變數
靜態變數:建立了類的多個物件,多個物件共享同一個靜態變數。當透過某一個物件修改靜態變數時,會導致其他物件呼叫此靜態變數時,變數的值是修改過了的。
例項變數:建立了類的多個物件,每個物件都獨立的擁有一套類中的非靜態屬性。當修改其中一個物件中的非靜態屬性時,不會導致其他物件中同樣的屬性值的修改。
73、static修飾屬性的說明:
① 靜態變數隨著類的載入而載入,可以透過"類.靜態變數"的方式進行呼叫。
② 靜態變數的載入要早於物件的建立。
74、static修飾方法的說明:
①隨著類的載入而載入,可以透過"類.靜態方法"的方式進行呼叫。
②靜態方法中,只能呼叫靜態的方法或屬性。非靜態方法中,既可以呼叫非靜態的方法或屬性,也可以呼叫靜態的方法或屬性。
75、在靜態的方法內,不能使用this關鍵字、super關鍵字(生命週期)。靜態屬性和靜態方法的使用,都可以從生命週期的角度去理解。
76、單例設計模式:就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在一個物件例項。
程式碼實現一:
class Bank{
//1.私化類的構造器
private Bank(){
//2.內部建立類的物件
//4.要求此物件也必須宣告為靜態的
private static Bank instance = new Bank();
//3.提供公共的靜態的方法,返回類的物件
public static Bank getInstance(){
return instance;
壞處:物件載入時間過長。
好處:執行緒安全的。
程式碼實現二:
class Order{
private Order(){
//2.聲明當前類物件,沒初始化
//4.此物件也必須宣告為static的
private static Order instance = null;
//3.宣告public、static的返回當前類物件的方法
public static Order getInstance(){
if(instance == null){
instance = new Order();
好處:延遲物件的建立。
壞處:執行緒不安全。
77、靜態程式碼塊使用說明:
①內部可以輸出語句
②隨著類的載入而執行,而且只執行一次
④如果一個類中定義了多個靜態程式碼塊,則按照宣告的先後順序執行
⑤靜態程式碼塊的執行要優先於非靜態程式碼塊的執行
⑥靜態程式碼塊內只能呼叫靜態的屬性、靜態的方法,不能呼叫非靜態的結構
78、非靜態程式碼塊使用說明:
內部可以輸出語句
隨著物件的建立而執行
每建立一個物件,就執行一次非靜態程式碼塊
作用:可以在建立物件時,對物件的屬性等進行初始化
如果一個類中定義了多個非靜態程式碼塊,則按照宣告的先後順序執行
非靜態程式碼塊內可以呼叫靜態的屬性、靜態的方法,或非靜態的屬性、非靜態的方法
79、例項化子類物件時,涉及到父類、子類中靜態程式碼塊、非靜態程式碼塊、構造器的載入順序:由父及子,靜態先行。
80、屬性的賦值順序:
①預設初始化
②顯式初始化/⑤在程式碼塊中賦值
④有了物件以後,可以透過"物件.屬性"或"物件.方法"的方式,進行賦值
81、final的使用說明:
final可以用來修飾的結構:類、方法、變數
final 用來修飾一個類:此類不能被其他類所繼承。比如:String類、System類、StringBuffer類
final 用來修飾方法:表明此方法不可以被重寫比如:Object類中getClass();
final 用來修飾變數:此時的"變數"就稱為是一個常量
final修飾屬性:可以考慮賦值的位置有:顯式初始化、程式碼塊中初始化、構造器中初始化
final修飾區域性變數:尤其是使用final修飾形參時,表明此形參是一個常量。當我們呼叫此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。
static final 用來修飾屬性:全域性常量
82、abstract可以用來修飾:類、方法。
1.abstract修飾類:抽象類
①此類不能例項化。
②抽象類中一定有構造器,便於子類例項化時呼叫(涉及:子類物件例項化的全過程)。
2.abstract修飾方法:抽象方法
①抽象方法只有方法的宣告,沒方法體。
②包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象方法的。
④若子類沒重寫父類中的所的抽象方法,則此子類也是一個抽象類,需要使用abstract修飾
3.注意點:
abstract不能用來修飾:屬性、構造器等結構
abstract不能用來修飾私方法、靜態方法、final的方法、final的類
83、介面使用interface來定義,Java中,介面和類是並列的兩個結構。
JDK7及以前:只能定義全域性常量和抽象方法
全域性常量:public static final的.但是書寫時,可以省略不寫
抽象方法:public abstract的
JDK8:除了定義全域性常量和抽象方法之外,還可以定義靜態方法、預設方法。
84、介面中不能定義構造器的!意味著介面不可以例項化。
85、Java開發中,介面透過讓類去實現(implements)的方式來使用。如果實現類覆蓋了介面中的所抽象方法,則此實現類就可以例項化。如果實現類沒覆蓋介面中所的抽象方法,則此實現類仍為一個抽象類。
86、Java類可以實現多個介面 —>彌補了Java單繼承性的侷限性格式:class AA extends BB implements CC,DD,EE。
87、介面與介面之間可以繼承,而且可以多繼承。如下:
interface AA{
void method1();
interface BB{
void method2();
interface CC extends AA,BB{
88、介面使用上也滿足多型性,介面,實際上就是定義了一種規範,下面這個例子可以幫你深刻理解並記住介面!
class Computer{
public void transferData(USB usb){//USB usb = new Flash();
usb.start();
System.out.println("具體傳輸資料的細節");
usb.stop();
interface USB{
//常量:定義了長、寬、最大最小的傳輸速度等
void start();
void stop();
class Flash implements USB{
@Override
public void start() {
System.out.println("隨身碟開啟工作");
public void stop() {
System.out.println("隨身碟結束工作");
class Printer implements USB{
System.out.println("印表機開啟工作");
System.out.println("印表機結束工作");
89、Java8中關於介面的新規範
①介面中定義的靜態方法,只能透過介面來呼叫。
②透過實現類的物件,可以呼叫介面中的預設方法。如果實現類重寫了介面中的預設方法,呼叫時,仍然呼叫的是重寫以後的方法。
④如果實現類實現了多個介面,而這多個介面中定義了同名同參數的預設方法,那麼在實現類沒重寫此方法的情況下,報錯。–>介面衝突。這就需要我們必須在實現類中重寫此方法。
⑤如何在子類(或實現類)的方法中呼叫父類、介面中被重寫的方法。
public void myMethod(){
method3();//呼叫自己定義的重寫的方法
super.method3();//呼叫的是父類中宣告的
//呼叫介面中的預設方法
CompareA.super.method3();
CompareB.super.method3();
90、內部類的分類:成員內部類(靜態、非靜態 )、區域性內部類(方法內、程式碼塊內、構造器內)。
91、成員內部類的理解:
一方面,作為外部類的成員
呼叫外部類的結構
可以被static修飾
可以被4種不同的許可權修飾
另一方面,作為一個類:
類內可以定義屬性、方法、構造器等
可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
可以被abstract修飾
92、如何在外部類建立成員內部類的物件?(靜態的,非靜態的)
//建立靜態的Dog內部類的例項(靜態的成員內部類):
Person.Dog dog = new Person.Dog();
//建立非靜態的Bird內部類的例項(非靜態的成員內部類):
Person p = new Person();
Person.Bird bird = p.new Bird();
93、如何在成員內部類中呼叫外部類的結構?
class Person{
String name = "小明";
public void eat(){
//非靜態成員內部類
class Bird{
String name = "杜鵑";
public void display(String name){
System.out.println(name);//方法的形參
System.out.println(this.name);//內部類的屬性
System.out.println(Person.this.name);//外部類的屬性
Person.this.eat();
94、
在區域性內部類的方法中(比如:show如果呼叫區域性內部類所宣告的方法(比如:method)中的區域性變數(比如:num)的話,要求此區域性變數宣告為final的。
jdk 7及之前版本:要求此區域性變數顯式的宣告為final的
jdk 8及之後的版本:可以省略final的宣告
public void method1() {
// 區域性變數
int num = 10;//jdk7 之前是要顯式寫上final,jdk8之後可以省略,
class AA {
public void show() {
// num = 20;//不能再次修改
System.out.println(num);
95、java異常處理的抓拋模型
“拋”:程式在正常執行的過程中,一旦出現異常,就會在異常程式碼處生成一個對應異常類的物件,並將此物件丟擲。 一旦丟擲物件以後,其後的程式碼就不再執行。
關於異常物件的產生:
① 系統自動生成的異常物件
② 手動的生成一個異常物件,並丟擲(throw)
“抓”:可以理解為異常的處理方式:
① try-catch-finally
② throws
96、異常處理模版:
try{
//可能出現異常的程式碼
}catch(異常型別1 變數名1){
//處理異常的方式1
}catch(異常型別2 變數名2){
//處理異常的方式2
}catch(異常型別3 變數名3){
//處理異常的方式3
....
finally{
//一定會執行的程式碼
注意點:
finally是可選的。
使用try將可能出現異常程式碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的物件,根據此物件的型別,去catch中進行匹配。
一旦try中的異常物件匹配到某一個catch時,就進入catch中進行異常的處理。一旦處理完成,就跳出當前的try-catch結構(在沒寫finally的情況。繼續執行其後的程式碼。
catch中的異常型別如果沒子父類關係,則誰宣告在上,誰宣告在下無所謂。
catch中的異常型別如果滿足子父類關係,則要求子類一定宣告在父類的上面。否則,報錯。
常用的異常物件處理的方式: ① String getMessage() ② printStackTrace()
在try結構中宣告的變數,再出了try結構以後,就不能再被呼叫。
try-catch-finally結構可以巢狀。
finally中宣告的是一定會被執行的程式碼。即使catch中又出現了異常,try中出現了return語句,catch中出現了return語句等情況。
97、"throws + 異常型別"寫在方法的宣告處。指明此方法執行時,可能會丟擲的異常型別。throws的方式只是將異常拋給了方法的呼叫者。並沒真正將異常處理掉。
98、如果父類中被重寫的方法沒throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中異常,必須使用try-catch-finally方式處理。
99、子類重寫的方法丟擲的異常型別不大於父類被重寫的方法丟擲的異常型別。
100、在程式執行中,除了自動丟擲異常物件的情況之外,我們還可以手動的throw一個異常類的物件。
1、throw 和 throws區別:
throw 表示丟擲一個異常類的物件,生成異常物件的過程。宣告在方法體內。
throws 屬於異常處理的一種方式,宣告在方法的宣告處。
2.典型例題
class Student{
private int id;
public void regist(int id) throws Exception {
if(id > 0){
this.id = id;
}else{
//手動丟擲異常物件
// throw new RuntimeException("您輸入的資料非法!");
// throw new Exception("您輸入的資料非法!");
throw new MyException("不能輸入負數");
return "Student [id=" + id + "]";
102、如何自定義一個異常類?
/*
* 1. 繼承於現的異常結構:RuntimeException 、Exception
* 2. 提供全域性常量:serialVersionUID
* 3. 提供過載的構造器
*/
public class MyException extends Exception{
static final long serialVersionUID = -7034897193246939L;
public MyException(){
public MyException(String msg){
super(msg);
Java必背100條
1、編寫:編寫的Java程式碼儲存在以“.java”結尾的原始檔中。
2、編譯:使用javac.exe命令編譯java原始檔,生成位元組碼檔案。格式:javac 原始檔名.java
3、執行:使用java.exe命令解釋執行位元組碼檔案。格式:java 類名
4、在一個java原始檔中可以宣告多個class,但是隻能最多有一個類宣告為public,而且被宣告為public的類的類名必須與原始檔名相同。
5、java關鍵字中所有字母都為小寫
6、Java中的名稱命名規範:
包名:多單片語成時所有字母都小寫:xxxyyyzzz 類名、介面名:多單片語成時,所有單詞的首字母大寫:XxxYyyZzz
變數名、方法名:多單片語成時,第一個單詞首字母小寫,第二個單詞開始每個 單詞首字母大寫:xxxYyyZzz
常量名:所有字母都大寫。多單詞時每個單詞用下劃線連線:XXX_YYY_ZZZ
7、字串是屬於一個類,屬於引用資料型別
8、在類體內,在方法體外宣告的變數稱為成員變數。
9、在方法體內部宣告的變數稱為區域性變數。區域性變數除形參外,需顯式初始化才能使用。(形參也是區域性變數)
10、java的整型常量預設為 int 型,宣告long型常量須後加‘l’或‘L’。
11、Java 的浮點型常量預設為double型,宣告float型常量,須後加‘f’或‘F’。
12、Java中的所有字元都使用Unicode編碼,一個字元可以儲存一個字母,一個漢字,所以java中char型別是兩個位元組。
13、boolean型別資料只允許取值true和false,無null。不可以使用0或非 0 的整數替代false和true。Java虛擬機器中沒有任何供boolean值專用的位元組碼指令,Java語言表達所操作的 boolean值,在編譯之後都使用java虛擬機器中的int資料型別來代替:true用1表示,false 用0表示。
14、雖然long型別是8個位元組,float是4個位元組,但是float型別採用科學計數法儲存,所以float型別的儲存範圍比long型別更大。
19、自動型別轉換:容量小的型別自動轉換為容量大的資料型別。byte,short,char之間不會相互轉換,他們三者在計算時首先轉換為int型別。
20、強制型別轉換:將容量大的資料型別轉換為容量小的資料型別,但可能造成精度降低或溢位。
21、字串不能直接轉換為基本型別,但透過基本型別對應的包裝類則可以實現把字串轉換成基本型別。
22、計算機底層都以二進位制補碼的方式來儲存資料。
23、正數(最高位是0)的原碼、反碼、補碼都相同,負數(最高位是1)的補碼是其反碼+1。
24、賦值運算子:= += -= *= /= %=,運算的結果不會改變變數本身的資料型別。short i = i + 1;由於常量“1”預設是int型的,所以編譯會報錯,使用short i += 1,則做到了+1的作用,也沒有改變資料型別。
25、&與&&、| 與 | | 的區別:&&、| | 具備短路功能,左邊的條件成立或者不成立,右邊的條件不用再判斷,&、| 不管什麼情況,都要把所有條件判斷完。
26、位運算:位運算子操作的都是整型的資料。
(左移運算子)<< :在一定範圍內,每向左移1位,相當於 * 2
(右移運算子)>> : 在一定範圍內,每向右移1位,相當於 / 2
27、流程控制:
順序結構:程式從上到下執行。
分支結構:if-else if - else、switch-case
迴圈結構:for、while、do-while
28、陣列屬於引用資料型別變數,但是陣列的元素既可以是基本資料型別,也可以是引用資料型別。
29、陣列的長度一旦確定就不能修改,初始化完成,長度就定了。
30、陣列靜態初始化:陣列元素的初始化和陣列元素的賦值同時進行。
例如:int a[ ] = new int [ ] { 1,2,3 };
31、陣列動態初始化:陣列元素的初始化和陣列元素的賦值分開進行。
例如:int b[ ] = new int [5]; b[0] = 1 ;
32、陣列元素的預設初始化值:
整型:0
浮點型:0.0
字元型:0或者’\u0000’,而非’0’
布林型別:false
引用資料型別:null
33、關鍵字 break、continue 可以帶標籤使用(類似於C語言的goto語句)
break label;//結束指定標識的一層迴圈結構。
continue label;//結束指定標識的一層迴圈結構當次迴圈。
34、面向物件vs面向過程
面向過程:強調的是功能行為,以函式為最小單位,考慮怎麼做。
面向物件:強調具備了功能的物件,以類/物件為最小單位,考慮誰來做。
35、面向物件中兩個重要的概念:
類:對一類事物的描述,是抽象的、概念上的定義
物件:是實際存在的該類事物的每個個體,因而也稱為例項(instance)
36、虛擬機器棧,即為平時提到的棧結構。區域性變數儲存在棧結構中;new出來的結構(比如:陣列、物件)載入在堆空間中。補充:物件的屬性(非static的成員變數)也是載入在堆空間中。int arr [ ] = new arr [ ],以等號“=”為界,左邊是區域性變數存放在棧,右邊是new 的機構,存放在堆中。
方法區:類的載入資訊、常量池、靜態域
37、“屬性”與“變數”的區別:
① 在類中宣告的位置的不同
屬性:直接定義在類的一對{}內
.
區域性變數:宣告在方法內、方法形參、程式碼塊內、構造器形參、構造器內部的變數
② 關於許可權修飾符的不同
屬性:可以在宣告屬性時,指明其許可權,使用許可權修飾符。常用的許可權修飾符:private、public、預設、protected —>體現為封裝性。
.
區域性變數:不可以使用許可權修飾符。
屬性:類的屬性,根據其型別,都預設初始化值。
.
整型(byte、short、int、long:0)
浮點型(float、double:0.0)
字元型(char:0 (或’\u0000’))
布林型(boolean:false)
引用資料型別(類、陣列、介面:null)
.
區域性變數:沒預設初始化值。意味著,我們在呼叫區域性變數之前,一定要顯式賦值。特別地:形參在呼叫時,我們賦值即可。
2.4 在記憶體中載入的位置:
屬性:載入到堆空間中 (非static)
區域性變數:載入到棧空間
38、 如果方法沒返回值,“return;”表示結束此方法的意思。
39、封裝性思想具體的程式碼體現:
封裝性思想具體的程式碼體現:
體現一 將類的屬性xxx私化(private),同時,提供公共的(public)方法來獲取(getXxx)和設定(setXxx)此屬性的值
體現二 不對外暴露的私有的方法
體現三 單例模式(將構造器私有化)
體現四 如果不希望類在包外被呼叫,可以將類設定為預設的。
40、許可權修飾符的範圍:
41、4種許可權都可以用來修飾類的內部結構:屬性、方法、構造器、內部類。修飾類的話,只能使用:預設、public。
42、如果沒顯式的定義類的構造器的話,則系統預設提供一個空參的構造器。
43、一個類中定義的多個構造器,彼此構成過載。
44、一旦我們顯式的定義了類的構造器之後,系統就不再提供預設的空參構造器。
45、一個類中,至少會有一個構造器。
46、this可以理解為:當前物件 或 當前正在建立的物件。
47、可以顯式的使用"this(形參列表)"方式,呼叫本類中指定的其他構造器,但是構造器中不能透過"this(形參列表)"方式呼叫自己(死迴圈)。
48、規定:"this(形參列表)“必須宣告在當前構造器的首行,可以推出構造器內部,最多隻能宣告一個"this(形參列表)”,用來呼叫其他的構造器。
49、如果使用的類或介面是java.lang包下定義的,則可以省略import結構。
50、使用"xxx.*"方式表明可以呼叫xxx包下的所結構。但是如果使用的是xxx子包下的結構,則仍需要顯式匯入。
51、一個類可以被多個子類繼承(一個爸爸可以有多個兒子),但是一個類只能有一個父類(一個兒子只能有一個親生爸爸)
52、子類繼承父類以後有哪些不同?
一旦子類A繼承父類B以後,子類A中就獲取了父類B中宣告的所有的屬性和方法。特別的,父類中宣告為private的屬性或方法,子類繼承父類以後,仍然是獲取了父類中私的結構,只因為封裝性(private許可權修飾符)的影響,使得子類不能直接呼叫父類的結構而已。
子類繼承父類以後,還可以宣告自己特有的屬性或方法:實現功能的拓展。
53、子類直接繼承的父類,稱為:直接父類。間接繼承的父類稱為:間接父類。子類繼承父類以後,就獲取了直接父類以及所有間接父類中宣告的屬性和方法。
54、如果沒沒有顯式的宣告一個類的父類的話,則此類繼承於java.lang.Object類。
55、什麼是方法的重寫(override 或 overwrite)?
答:子類繼承父類以後,可以對父類中同名同參數的方法,進行覆蓋操作。
56、重寫的規則:
子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同 。
②子類重寫的方法的許可權修飾符不小於父類被重寫的方法的許可權修飾符 特殊情況:子類不能重寫父類中宣告為private許可權的方法。
父類被重寫的方法的返回值型別是A型別,則子類重寫的方法的返回值型別可以是A類或A類的子類。
父類被重寫的方法的返回值型別是基本資料型別(比如:double),則子類重寫的方法的返回值型別必須是相同的基本資料型別(必須也是double)。
④ 子類重寫的方法丟擲的異常型別不大於父類被重寫的方法丟擲的異常型別。
57、什麼是重寫和什麼是過載?
概念 說明
重 載 是指允許存在多個同名方法,而這些方法的引數不同。編譯器根據方法不同的引數表,對同名方法的名稱做修飾。對於編譯器而言,這些同名方法就成了不同的方法。它們的呼叫地址在編譯期就綁定了。Java的過載是可以包括父類和子類的,即子類可以過載父類的同名不同引數的方法。所以,對於過載而言,在方法呼叫之前,編譯器就已經確定了所要呼叫的方法,這稱為“早繫結”或“靜態繫結” 。
重寫 方法重寫的前提是發生在具有繼承關係的兩個類之間,只等到方法呼叫的那一刻,解釋執行器才會確定所要呼叫的具體方法,這稱為“晚繫結”或“動態繫結”。
58、super呼叫屬性、方法:
①在子類的方法或構造器中,透過使用"super.屬性"或"super.方法"的方式,顯式的呼叫父類中宣告的屬性或方法,通常情況下,習慣省略"super."。
②特殊情況:當子類和父類中定義了同名的屬性時,要想在子類中呼叫父類中宣告的屬性,則必須顯式的使用"super.屬性"的方式,表明呼叫的是父類中宣告的屬性。
59、super呼叫構造器:
1 我們可以在子類的構造器中顯式的使用"super(形參列表)"的方式,呼叫父類中宣告的指定的構造器。
2 "super(形參列表)"的使用,必須宣告在子類構造器的首行!
3 我們在類的構造器中,針對於"this(形參列表)"或"super(形參列表)"只能二一,不能同時出現。
4 在構造器的首行,沒顯式的宣告"this(形參列表)“或"super(形參列表)”,則預設呼叫的是父類中空參的構造器:super() 。
5 在類的多個構造器中,至少一個類的構造器中使用了"super(形參列表)",呼叫父類中的構造器。
60、子類物件例項化過程:
從結果上看:子類繼承父類以後,就獲取了父類中宣告的屬性或方法,建立子類的物件,就會在堆空間中載入父類中宣告的屬性。
從過程上看:透過子類的構造器建立子類物件時,一定會直接或間接的呼叫其父 類的構造器,進而呼叫父類的父類的構造器,…直到呼叫了java.lang.Object類中空參的構造器為止。正因為載入過所的父類的結構,所以才可以看到記憶體中父類中的結構,子類物件才可以考慮進行呼叫。
61、多型性:可以理解為一個事物的多種形態。物件的多型性:父類的引用指向子類的物件(或子類的物件賦給父類的引用),Person p = new Man(); 。有了物件的多型性以後,我們在編譯期,只能呼叫父類中宣告的方法,但在執行期,我們實際執行的是子類重寫父類的方法。總結:編譯,看左邊;執行,看右邊。多型執行時行為,不是編譯時行為。
62、物件的多型性,只適用於方法,不適用於屬性(編譯和執行都看左邊)。
63、Object類中定義的equals()和==的作用是相同的:比較兩個物件的地址值是否相同.即兩個引用是否指向同一個物件實體。
64、String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以後,比較的不是兩個引用的地址是否相同,而是比較兩個物件的"實體內容"是否相同。
65、“==”如果比較的是基本資料型別變數:比較兩個變數儲存的資料是否相等。(不一定型別要相同,有自動型別提升)如果比較的是引用資料型別變數:比較兩個物件的地址值是否相同.即兩個引用是否指向同一個物件實體。
66、當我們輸出一個物件的引用時,實際上就是呼叫當前物件的toString()。
67、Object類中toString()的定義:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
68、像String、Date、File、包裝類等都重寫了Object類中的toString()方法,使得在呼叫物件的toString()時,返回"實體內容"資訊。
69、基本資料型別與對應的包裝類:
70、自動裝箱和自動拆箱(JDK 5.0之後)
71、static關鍵字可以用來修飾屬性、方法、程式碼塊、內部類。
72、靜態變數 vs 例項變數
靜態變數:建立了類的多個物件,多個物件共享同一個靜態變數。當透過某一個物件修改靜態變數時,會導致其他物件呼叫此靜態變數時,變數的值是修改過了的。
例項變數:建立了類的多個物件,每個物件都獨立的擁有一套類中的非靜態屬性。當修改其中一個物件中的非靜態屬性時,不會導致其他物件中同樣的屬性值的修改。
73、static修飾屬性的說明:
① 靜態變數隨著類的載入而載入,可以透過"類.靜態變數"的方式進行呼叫。
② 靜態變數的載入要早於物件的建立。
74、static修飾方法的說明:
①隨著類的載入而載入,可以透過"類.靜態方法"的方式進行呼叫。
②靜態方法中,只能呼叫靜態的方法或屬性。非靜態方法中,既可以呼叫非靜態的方法或屬性,也可以呼叫靜態的方法或屬性。
75、在靜態的方法內,不能使用this關鍵字、super關鍵字(生命週期)。靜態屬性和靜態方法的使用,都可以從生命週期的角度去理解。
76、單例設計模式:就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在一個物件例項。
程式碼實現一:
class Bank{
//1.私化類的構造器
private Bank(){
}
//2.內部建立類的物件
//4.要求此物件也必須宣告為靜態的
private static Bank instance = new Bank();
//3.提供公共的靜態的方法,返回類的物件
public static Bank getInstance(){
return instance;
}
}
壞處:物件載入時間過長。
好處:執行緒安全的。
程式碼實現二:
class Order{
//1.私化類的構造器
private Order(){
}
//2.聲明當前類物件,沒初始化
//4.此物件也必須宣告為static的
private static Order instance = null;
//3.宣告public、static的返回當前類物件的方法
public static Order getInstance(){
if(instance == null){
instance = new Order();
}
return instance;
}
}
好處:延遲物件的建立。
壞處:執行緒不安全。
77、靜態程式碼塊使用說明:
①內部可以輸出語句
②隨著類的載入而執行,而且只執行一次
④如果一個類中定義了多個靜態程式碼塊,則按照宣告的先後順序執行
⑤靜態程式碼塊的執行要優先於非靜態程式碼塊的執行
⑥靜態程式碼塊內只能呼叫靜態的屬性、靜態的方法,不能呼叫非靜態的結構
78、非靜態程式碼塊使用說明:
內部可以輸出語句
隨著物件的建立而執行
每建立一個物件,就執行一次非靜態程式碼塊
作用:可以在建立物件時,對物件的屬性等進行初始化
如果一個類中定義了多個非靜態程式碼塊,則按照宣告的先後順序執行
非靜態程式碼塊內可以呼叫靜態的屬性、靜態的方法,或非靜態的屬性、非靜態的方法
79、例項化子類物件時,涉及到父類、子類中靜態程式碼塊、非靜態程式碼塊、構造器的載入順序:由父及子,靜態先行。
80、屬性的賦值順序:
①預設初始化
②顯式初始化/⑤在程式碼塊中賦值
④有了物件以後,可以透過"物件.屬性"或"物件.方法"的方式,進行賦值
81、final的使用說明:
final可以用來修飾的結構:類、方法、變數
final 用來修飾一個類:此類不能被其他類所繼承。比如:String類、System類、StringBuffer類
final 用來修飾方法:表明此方法不可以被重寫比如:Object類中getClass();
final 用來修飾變數:此時的"變數"就稱為是一個常量
final修飾屬性:可以考慮賦值的位置有:顯式初始化、程式碼塊中初始化、構造器中初始化
final修飾區域性變數:尤其是使用final修飾形參時,表明此形參是一個常量。當我們呼叫此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。
static final 用來修飾屬性:全域性常量
82、abstract可以用來修飾:類、方法。
1.abstract修飾類:抽象類
①此類不能例項化。
②抽象類中一定有構造器,便於子類例項化時呼叫(涉及:子類物件例項化的全過程)。
2.abstract修飾方法:抽象方法
①抽象方法只有方法的宣告,沒方法體。
②包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象方法的。
④若子類沒重寫父類中的所的抽象方法,則此子類也是一個抽象類,需要使用abstract修飾
3.注意點:
abstract不能用來修飾:屬性、構造器等結構
abstract不能用來修飾私方法、靜態方法、final的方法、final的類
83、介面使用interface來定義,Java中,介面和類是並列的兩個結構。
JDK7及以前:只能定義全域性常量和抽象方法
全域性常量:public static final的.但是書寫時,可以省略不寫
抽象方法:public abstract的
JDK8:除了定義全域性常量和抽象方法之外,還可以定義靜態方法、預設方法。
84、介面中不能定義構造器的!意味著介面不可以例項化。
85、Java開發中,介面透過讓類去實現(implements)的方式來使用。如果實現類覆蓋了介面中的所抽象方法,則此實現類就可以例項化。如果實現類沒覆蓋介面中所的抽象方法,則此實現類仍為一個抽象類。
86、Java類可以實現多個介面 —>彌補了Java單繼承性的侷限性格式:class AA extends BB implements CC,DD,EE。
87、介面與介面之間可以繼承,而且可以多繼承。如下:
interface AA{
void method1();
}
interface BB{
void method2();
}
interface CC extends AA,BB{
}
88、介面使用上也滿足多型性,介面,實際上就是定義了一種規範,下面這個例子可以幫你深刻理解並記住介面!
class Computer{
public void transferData(USB usb){//USB usb = new Flash();
usb.start();
System.out.println("具體傳輸資料的細節");
usb.stop();
}
}
interface USB{
//常量:定義了長、寬、最大最小的傳輸速度等
void start();
void stop();
}
class Flash implements USB{
@Override
public void start() {
System.out.println("隨身碟開啟工作");
}
@Override
public void stop() {
System.out.println("隨身碟結束工作");
}
}
class Printer implements USB{
@Override
public void start() {
System.out.println("印表機開啟工作");
}
@Override
public void stop() {
System.out.println("印表機結束工作");
}
}
89、Java8中關於介面的新規範
①介面中定義的靜態方法,只能透過介面來呼叫。
②透過實現類的物件,可以呼叫介面中的預設方法。如果實現類重寫了介面中的預設方法,呼叫時,仍然呼叫的是重寫以後的方法。
④如果實現類實現了多個介面,而這多個介面中定義了同名同參數的預設方法,那麼在實現類沒重寫此方法的情況下,報錯。–>介面衝突。這就需要我們必須在實現類中重寫此方法。
⑤如何在子類(或實現類)的方法中呼叫父類、介面中被重寫的方法。
public void myMethod(){
method3();//呼叫自己定義的重寫的方法
super.method3();//呼叫的是父類中宣告的
//呼叫介面中的預設方法
CompareA.super.method3();
CompareB.super.method3();
}
90、內部類的分類:成員內部類(靜態、非靜態 )、區域性內部類(方法內、程式碼塊內、構造器內)。
91、成員內部類的理解:
一方面,作為外部類的成員
呼叫外部類的結構
可以被static修飾
可以被4種不同的許可權修飾
另一方面,作為一個類:
類內可以定義屬性、方法、構造器等
可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
可以被abstract修飾
92、如何在外部類建立成員內部類的物件?(靜態的,非靜態的)
//建立靜態的Dog內部類的例項(靜態的成員內部類):
Person.Dog dog = new Person.Dog();
//建立非靜態的Bird內部類的例項(非靜態的成員內部類):
Person p = new Person();
Person.Bird bird = p.new Bird();
93、如何在成員內部類中呼叫外部類的結構?
class Person{
String name = "小明";
public void eat(){
}
//非靜態成員內部類
class Bird{
String name = "杜鵑";
public void display(String name){
System.out.println(name);//方法的形參
System.out.println(this.name);//內部類的屬性
System.out.println(Person.this.name);//外部類的屬性
Person.this.eat();
}
}
}
94、
在區域性內部類的方法中(比如:show如果呼叫區域性內部類所宣告的方法(比如:method)中的區域性變數(比如:num)的話,要求此區域性變數宣告為final的。
jdk 7及之前版本:要求此區域性變數顯式的宣告為final的
jdk 8及之後的版本:可以省略final的宣告
public void method1() {
// 區域性變數
int num = 10;//jdk7 之前是要顯式寫上final,jdk8之後可以省略,
class AA {
public void show() {
// num = 20;//不能再次修改
System.out.println(num);
}
}
}
95、java異常處理的抓拋模型
“拋”:程式在正常執行的過程中,一旦出現異常,就會在異常程式碼處生成一個對應異常類的物件,並將此物件丟擲。 一旦丟擲物件以後,其後的程式碼就不再執行。
關於異常物件的產生:
① 系統自動生成的異常物件
② 手動的生成一個異常物件,並丟擲(throw)
“抓”:可以理解為異常的處理方式:
① try-catch-finally
② throws
96、異常處理模版:
try{
//可能出現異常的程式碼
}catch(異常型別1 變數名1){
//處理異常的方式1
}catch(異常型別2 變數名2){
//處理異常的方式2
}catch(異常型別3 變數名3){
//處理異常的方式3
}
....
finally{
//一定會執行的程式碼
}
注意點:
finally是可選的。
使用try將可能出現異常程式碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的物件,根據此物件的型別,去catch中進行匹配。
一旦try中的異常物件匹配到某一個catch時,就進入catch中進行異常的處理。一旦處理完成,就跳出當前的try-catch結構(在沒寫finally的情況。繼續執行其後的程式碼。
catch中的異常型別如果沒子父類關係,則誰宣告在上,誰宣告在下無所謂。
catch中的異常型別如果滿足子父類關係,則要求子類一定宣告在父類的上面。否則,報錯。
常用的異常物件處理的方式: ① String getMessage() ② printStackTrace()
在try結構中宣告的變數,再出了try結構以後,就不能再被呼叫。
try-catch-finally結構可以巢狀。
finally中宣告的是一定會被執行的程式碼。即使catch中又出現了異常,try中出現了return語句,catch中出現了return語句等情況。
97、"throws + 異常型別"寫在方法的宣告處。指明此方法執行時,可能會丟擲的異常型別。throws的方式只是將異常拋給了方法的呼叫者。並沒真正將異常處理掉。
98、如果父類中被重寫的方法沒throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中異常,必須使用try-catch-finally方式處理。
99、子類重寫的方法丟擲的異常型別不大於父類被重寫的方法丟擲的異常型別。
100、在程式執行中,除了自動丟擲異常物件的情況之外,我們還可以手動的throw一個異常類的物件。
1、throw 和 throws區別:
throw 表示丟擲一個異常類的物件,生成異常物件的過程。宣告在方法體內。
throws 屬於異常處理的一種方式,宣告在方法的宣告處。
2.典型例題
class Student{
private int id;
public void regist(int id) throws Exception {
if(id > 0){
this.id = id;
}else{
//手動丟擲異常物件
// throw new RuntimeException("您輸入的資料非法!");
// throw new Exception("您輸入的資料非法!");
throw new MyException("不能輸入負數");
}
}
@Override
public String toString() {
return "Student [id=" + id + "]";
}
}
102、如何自定義一個異常類?
/*
* 1. 繼承於現的異常結構:RuntimeException 、Exception
* 2. 提供全域性常量:serialVersionUID
* 3. 提供過載的構造器
*/
public class MyException extends Exception{
static final long serialVersionUID = -7034897193246939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}