父類的靜態方法可以被子類的靜態方法覆蓋
父類的非靜態不能被子類的靜態方法覆蓋‘
父類的靜態方法不能被子類的非靜態方法覆蓋
覆蓋是用於父類 和子類之間
關鍵點是在聲明對象引用時:son m=new Son(); math m=new Son();
final關鍵字修飾類時,說明此類不能有子類,即不能被繼承。
final修飾方法的時候,說明這個方法不能被重寫
類裏可以有final修飾的方法
final修飾的成員變量的對象引用不能被修改
final關鍵字修飾的類裏的方法默認被修飾爲final
abstract 和final含義完全相反
如果是抽象類的子類就必須實現抽象類的抽象方法。對於接口就好比是一個功能的模型
抽象類是不能實例化的,只能去實現所有的抽象方法,否則就只能還是一個抽象類
抽象類與普通繼承類的區別就是,使用父類的方法、重寫父類的方法或通過父類與子類相互引用來完成功能
如果繼承了抽象類就必須實現該抽象類的方法
如果抽象類的子類沒有實現父類的抽象方法,就必須爲抽象類
抽象類和繼承一樣,都必須是單繼承,或是多層繼承
多態,就好比一個物品在一個時期有兩種狀態一樣,在繼承中無法實現,但是多態也是基於繼承的
static修飾的方法和final修飾的方法是在編譯期綁定的;而其他的方法是在運行期間綁定的,動態地判斷是什麼類型
多態是基於繼承的,是類和接口相結合來實現的。
枚舉類: 一組連續的基本類型的數值
public enum Grade{ A, B, C,D,F,G};
例如:enum colors{ green,yellow}
public class racing_cycle
{
public colors color;
.........
public static void main(String args[])
{
racing_cycle rc=new racing_cycle(colors.green,..);
反射機制:起到放大鏡的效果,使用反射機制可以在程序的運行中對程序進行動態的控制。
泛型:將類型作爲一種參數來進行指定
沒有使用泛型的例子:
import Java.util.ArrayList;
public class racing_cycle
{
public String n="100”;
public static void main(String args[])
{
racing_cycle rc=new racing_cycle();
ArrayList al=new ArrayList();
al.add(rc.n);//向al裏添加n
String s=(String)al.get(0);// 因爲al.get()方法返回的類型爲object類型的,而要 賦值的對象引用爲String類型,所以要轉型。
system.out.println(s);
}
}
使用泛型時:將ArrayList al=new ArrayList();替換成ArrayList<String> al=new ArrayList<String>();在後面的取值時候就不用轉換了。
java 接口
用關鍵字interface聲明
接口修飾符和類的修飾符是一樣的,也可以是public或者是不寫修飾符
接口裏的成員變量默認爲public static final 類型的
接口類的修飾不能爲final的,因爲final類型的必須要實現的
類不能多繼承,但是可以通過接口來實現多層繼承
接口既可以多層繼承,也可以多繼承
接口的定義:
package a;
public interface aaa
{
int i=2;
public int getMax();
public String getMes();
}
在定義接口的時候,接口裏的方法是沒有方法體的,接口裏的定義的方法需要在其子類去實現。接口的變量默認被修飾public static final類型,不能對接口裏的變量值進行修改,如i的值不能被修改,否則編譯出錯。
接口就是一個特殊的抽象類,抽象類裏有抽象的方法和普通的方法,而接口裏的方法完全爲抽象的,需要在其子類進行具體的方法實現。類就是一個產品的詳細功能說明,而接口就是這些功能的簡要說明。
接口裏的方法,誒有具體的方法體,但是方法不可以用final和static來修飾,不能用除public之外的其他訪問限制修飾符進行修飾。
接口的使用 類名+implements +接口名 類中對接口類中聲明的方法進行具體方法體的編寫。
抽象類 abstract class aaa和接口不同的地方是,在抽象類中可以有抽象方法也可以有其他形式存在,而接口中都只能爲抽象的。
抽象類與接口區別:
接口裏的方法必須要全部實現
接口裏沒有成員變量
接口裏的方法全部都是public,即公共類型
instanceof 是java中一個二元操作符, 對象的引用 instanceof 類或接口 返回結果是boolean類型的。
使用:if(o instanceof ora){ system.out.println("對象引用o指向的類爲ora");}
instanceof 關鍵字不能比較基本類型的數據,可以對 對象和接口使用
左右兩邊比較的類型只能爲類和接口
第10章 構造器
1.構造器可以使用的修飾符有public , protected, defalut, private, 不寫即爲defalut類型的。
2. 構造器的名稱必須要和類的名稱相同。
3. 不能有任何類型的返回值 甚至是void
4. 構造器的參數可有可無,可有有一個也可以有多個參數
被修飾爲public類型的構造器是最常見的構造器,此時的構造器能讓所有的類訪問到。如果要讓所有類都能訪問到此類,構造器要修飾爲public類型,而類的修飾符也要爲public類型的。
如果構造器被修飾爲private類型後,除本類外其他類是訪問不到的。需要聲明一個public類型的方法來返回其對象引用。通過取得方法返回的對象引用,再執行並打印結果。
創建test類的對象實例,引用爲a
apple a= apple.getTest(); getTest()函數爲public用來返回一個 return new apple()
如何實例化一個對象:
new 構造器的名稱(參數列表)
構造器的名稱要和類的名稱相同
通過調用構造器方法來對這個對象進行一些必要的初始化
用new關鍵字實例化對象後返回對象的引用 test a=new test(); a即爲對象的引用。
構造器的使用有兩種方式:1,,在本類裏調用或在同包下的另一個類調用,另一種情況是子類調用父類的構造器的。
在發生繼承關係時,子類的構造器方法默認調用父類的構造器方法,調用完後再調用子類的構造器方法。父類中要有無餐構造器。
構造器重載:
1.構造器重載的方法名稱相同,但參數列表不相同,如參數個數和參數類型等。
2.構造器重載的方法是沒有返回值的
3.構造器不能被繼承,這和方法有所區別
4.構造器重載的修飾符只有public 、private、protected這三個。
super()方法能顯示地指定調用哪兒個構造器來創建對象。(在父類中,因爲一般是自動先調用無參數的構造器)
在自定義有參數構造器之後,在生成對象引用時,必須按照參數來顯示聲明。因爲此時一個無參數構造器沒有定義。
單子模式:就是某一個類在同一時刻只允許有一個對象。單子模式就是把構造器修飾爲private類型的,用一個public類型的方法返回類引用。單子模式下生成的兩個對象是一樣的。
構造器在程序中何時運行的
1. 加載要創建該對象的父類,以及成員變量和其他繼承關係
2,加載該類的靜態塊和靜態成員變量,並對其進行初始化等操作‘
3.執行構造器裏的方法體,完成後該類的對象創建完畢
4.父類的運行順序和該類的順序是一樣的
第11章 異常處理
Try語句塊主要用於可能會出現異常的區域,在try的後面會跟有一個或者多個catch語句塊,在catch語句塊中主要編寫相應的處理方法。try-catch語句的基本語法如下所示
try
{ //此處可能出現異常的代碼
}
catch( Exception e)
{
//此處可能是發生異常的處理代碼
}
在try語句中放可能出現異常的代碼;在catch語句中需要給出一個異常的類型和該類型的引用,並在catch語句中放當出現該異常類型時需要執行的代碼。如果程序沒有發生異常,就不會執行catch裏面的語句。如果不適用try-catch語句,則當程序發生異常的時候,會自動退出程序的運行;而使用後,會執行catch裏面的語句。可以有多個catch語句,但是要注意將範圍相對小的異常放在前面,將範圍相對大的異常放在後面。
finally語句中就是肯定會被執行的語句。可能會中斷finally語句執行的情況,首先是finally語句中本身就產生異常;再者就是執行finally語句的線程死亡,還有就是程序執行到finally語句時停電了。
注意點:當不存在catch語句時,finally語句必須存在且緊跟在try語句後面。二者可以有一個不存在,但是不可以同時不存在。如果try後面什麼都不跟,就不會通過編譯。三者之間不能有語句。
自定義異常
創建和使用自定義異常類需要繼承Exception類。在自定義的異常類中通過具有一個無參
class MyException extends Exception
{
public MyException()
{
}
public MyException(String s)
{
super(s);
}
}
第12章 內部類
內部類:定義在類內部的類,它允許程序員將一些邏輯相關的類進行組織,並且可以控制內部類的可見性,當一個類作爲另一個類的非靜態成員時,則這個類就是一個非靜態內部類。
class Wai
{
class Nei
{
//內部類的成員
}
//外部類成員
}
正因爲內部類在外部看來是一個成員,所以能使用修飾成員的private修飾符來修改內部類,這對於一個正常的類是不可能做到的。
外部類調用內部類是很容易,創建該類的對象,使用對象來調用內部類中的成員即可。
在外部類外訪問內部類
Wai.Nei wn=new Wai().new Nei();
等價於 Wai w=new Wai();
Wai.Nei wn=w.new Nei();
首先創建一個外部類的對象,然後讓該外部類對象調用創建一個內部類對象。
在內部類中訪問外部類,就像所有同一個類中成員相互訪問一樣,好比是一個類中的不同方法之間的相互調用,包括將成員聲明爲private私有的。
class wai
{
int i=8;
class nei
{
public void myvoid()
{
system.out.println("外部類中的成員變量值爲:“+i);
}
}
局部內部類的作用範圍和局部變量的作用範圍相同,只在局部中起作用,所以對局部內部類進行訪問時,只能在該局部內部類的作用範圍內。對該內部類進行訪問必須在該內部類所在的方法中創建內部類對象進行訪問。這是因爲這裏的內部類是作爲局部成員的形式出現的,只能在它所在的方法中進行調用。
在局部內部類中訪問外部成員變量很容易實現,並不需要進行過多操作。
局部內部類中訪問外部類的局部變量。從局部內部類中能夠正常地訪問外部類的局部變量了,是由於局部變量被聲明爲final類型。普通的局部變量在所在的方法中執行結束後消失,所以在內部類訪問該普通局部變量時將不能正常訪問。但是將局部變量用final修飾,這樣該局部變量就不會在方法結束時消失,從而能夠正常的訪問。
靜態方法中的局部內部類,局部內部類可以訪問外部類的成員,包括私有成員,但在靜態方法中定義的局部內部類要想訪問外部類中的成員,該程序必須是靜態成員。靜態成員和非靜態成員之間的訪問是不變。
靜態內部類。由於靜態內部類時外部類的靜態成員,所以不能直接訪問外部類的非靜態成員。
在外部類中訪問靜態內部類,在下面的程序中,應該新疆兩個類,爲方便就不在建
在外部類中訪問靜態內部類時同樣需要,首先創建內部類對象,然後使用內部類對象調用內部類成員。
在外部類外訪問靜態內部類,不需要創建外部類對象,如下
從上面可以看出,訪問靜態內部類是不需要創建外部類的,可以直接創建內部類對象。需要注意的是,創建內部類對象也是需要指明該內部類是那兒一個外部類的內部類。
多線程也就是讓程序具有多個併發的執行線索,類似於團隊合作,多人合作完成一個任務,定義線程有兩種方法,一種是繼承thread類,另一種是實現runnable接口。
定義一個線程可以通過繼承thread類來實現,但要重寫run方法,可以定義該線程所要執行的語句。當線程啓動時,run方法中的程序就成爲一條獨立的執行線程。線程啓動通過star()方法,一個線程只能啓動一次,啓動之後它是一個和main方法並列執行的線程。
在同時運行多個線程時,運算結果不唯一,因爲很多不確定因素,首先執行哪兒個線程是不確定的,線程交替也是不確定的。
線程的生命週期:新建狀態,準備狀態,運行狀態,等待/阻塞狀態,死亡狀態。
線程調度,sleep方法
還可以給線程設計優先級
第一個swing程序
創建窗體有直接調用JFrame類的構造器和繼承JFrame的方法,在開發中都用到後者繼承的方法來創建窗體。以下程序可以來改變窗口的圖標。
Swing中的控件可以分爲三類,頂層容器、非頂層容器和普通控件。從後向前依次放到頂層容器中,有利於程序維護。以下程序爲將按鈕這個控件放到非頂層容器中
按鈕動作事件,即按下按鈕之後,發生的響應
在上面程序中爲按鈕註冊了一個事件監聽器,該程序中的動作事件監聽器是通過匿名內部類來定義的,這裏的匿名內部類使得該程序非常簡單。在動作事件監聽器中重寫了ActionListener監聽接口的actionPerformed方法。在該方法中將表示按下按鈕會發生的事件的程序。
同一個按鈕可以註冊多個監聽器,當同一個事件源註冊多個監聽器,監聽器執行順序並不是先註冊先執行的順序,而是先註冊後執行的順序來執行的。
創建一個密碼框程序
創建一個複選框架