Unsupported major.minor version 51.0解決辦法
具體步驟
解決:項目------>右鍵------>屬性------>JavaCompiler------>Compiler ComplianceLevel------>選擇你使用的JDK版本------>應(yīng)用
myeclipse出現(xiàn)Could not find the main class原因分析
做如下檢查:
編譯環(huán)境檢查 window->preferences->installed JREs
編譯級別檢查 右擊工程名->properties->java compiler
編譯路徑檢查 右擊工程名->build path->coufiguration build path
執(zhí)行clean???? project->clean
運行環(huán)境大于等于編譯器版本
用JAVA寫一個單例類:
餓漢式單例:
public class Singleton{
? ? ? ? ?private Singleton(){
? ? ? ? ?private static Singleton instance = new Singleton();
? ? ? ? ?public static ?Singleton getInstance(){
? ? ? ? ? ? ? ? ? return instance;
? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
}
懶漢式單例:
public ?class Singleton{
? ? ? ? private static Singleton instance = null;
? ? ? ? private Singleton(){}
? ? ? ? public static synchronized Singleton getInstance(){
? ? ? ? ? ? ? ? ? if(instance == null) {
? ? ? ? ? ? ? ? ? ? ? ? ?instance = new Singleton();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? return instance;
? ? ? ? ? ? ? }
? ? ? ? }
注意:實現(xiàn)一個單例有兩點注意事項,(1)將構(gòu)造器私有叹阔,不允許外界通過構(gòu)造器創(chuàng)建對象阔涉;(2)通過公開的靜態(tài)方法向外界返回類的唯一實例缎岗。
spring的IoC容器可以為普通的類創(chuàng)建單例哈打,它是怎么做到的呢?
DAO設(shè)計模式:
DAO(Data Access Object)【數(shù)據(jù)訪問對象】是一個為數(shù)據(jù)庫或者其他持久化機制提供了抽象接口的對象挖炬,在不暴露底層持久化方案實現(xiàn)細節(jié)的前提下提供了各種數(shù)據(jù)的訪問操作揽浙。在實際的開發(fā)中,應(yīng)該將所有對數(shù)據(jù)源的訪問操作進行抽象化后封裝在一個公共API中意敛。用程序設(shè)計語言來說馅巷,就是建立一個接口,接口中定義了此應(yīng)用程序中將會用到的所有事務(wù)方法空闲。在這個應(yīng)用程序中令杈,當(dāng)需要和數(shù)據(jù)源進行交互的時候則使用這個接口,并且編寫一個單獨的類來實現(xiàn)這個接口碴倾,在邏輯上該類對應(yīng)一個特定的數(shù)據(jù)存儲逗噩。DAO模式實際上包含了兩個模式,一是Data Accessor(數(shù)據(jù)訪問器)跌榔,二是Data Object(數(shù)據(jù)對象)异雁,前者要解決如何訪問數(shù)據(jù)的問題,而后者要解決的是如何用對象封裝數(shù)據(jù)僧须。
DAO 模式被用來分離低層次數(shù)據(jù)訪問和高級業(yè)務(wù)邏輯操作
DAO模式中包含的元素:
1.Data Access Object Interface )— 定義了一個model類上標(biāo)準的操作方法的接口
2.Data? Access Object concrete class — 實現(xiàn)了上面接口的類纲刀。這個類負責(zé)從數(shù)據(jù)存儲區(qū)(數(shù)據(jù)庫、xml)中取得數(shù)據(jù)
3.Model? Object or Value Object? — 這是一個簡單地POJO(plain OldJavaObject)包含了getter和setter方法担平。由DAO類進行存取
實現(xiàn):
創(chuàng)建一個Student類代表了Model或value對象示绊。StudentDao是一個Dao接口。StudentDaoImpl是一個實現(xiàn)StudentDao的類暂论。
public interface StudentDao{
? ? ? ? ? ?public List<Student> get AllStudents();
? ? ? ? ? ?public Student ?getStudent(int ?id);
? ? ? ? ? ?public void updateStudent(Student student);
? ? ? ? ? ?public void deleteStudent(Student student);
}
選擇排序:
public ?static void selectSort (int [ ] arr){
?for(int ?x = 0; x <arr.length-1;x++){
? ? ? ? ?for(int ?y = x+1; y< arr.length;y++){
? ? ? ? ? ? ? ?if(arr[x]>arr[y]){
? ? ? ? ? ? ? ? ? ? ? ? int temp ?= arr[x];
? ? ? ? ? ? ? ? ? ? ? ? ? ? arr[x] = arr[y];
? ? ? ? ? ? ? ? ? ? ? ? ? arr[y] = temp;
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
? ? ? ?}
}
public static void main(String[] args){
? ? ? ?int ?[ ] arr = [1,5,4,2,9,6];
? ? ? ? printArray(arr);
? ? ? ? selectSort(arr);
? ? ? ? printArray(arr)
}
public static void printArray( int [ ] arr){
? ? ? ? ? ? for(int x = 0; x<arr.length;x++){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(x!=arr.length-1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(arr[x]+",");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(arr[x]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ?}
}
冒泡排序:相鄰的兩個元素進行比較面褐,如果符合條件就進行換位
public static ?void bubleSort(int ?[ ] arr){
? ? ? ? for(int ?x = 0 ; x < arr.length -1 ; x ++){
? ? ? ? ? ? ? ? for(int ?y = 0 ; y < arr.length -x -1 ; y++){
? ? ? ? ? ? ? ? ? ? ? ? if( arr[y] > arr[y+1]){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int temp = arr[y];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr[y] = arr[y+1];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr[y+1] = temp;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
}
//-x:讓每一次比比較的元素減少;-1:避免角標(biāo)越界
public static void printArray( int [ ] arr){
? ? ? ? for(int x = 0; x<arr.length;x++){
? ? ? ? ? ? ? ? ? ?if(x!=arr.length-1){
? ? ? ? ? ? ? ? ? ? ? System.out.println(arr[x]+",");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? System.out.println(arr[x]);
? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
? ?}
public static void main(String[] args){
? ? ? ?int ?[ ] arr = [1,5,4,2,9,6];
? ? ? ? printArray(arr);
? ? ? ? ? bubleSort(arr);
? ? ? ? ?printArray(arr)
? ?}
無論什么排序取胎,都需要對滿足條件的位置進行置換展哭,所以可以把這部分相同的代碼提取出來湃窍,單獨封裝成一個函數(shù)
public static void swap( int [] arr ,int a, int b){
? ? ?int temp = arr[a];
? ? ?arr[a] = arr [b] ;
? ? ? arr[b] = temp;
? }
折半查找:提高效率,但是必須要保證該數(shù)組是有序的數(shù)組
public static int halfsearch( int [ ] arr,int key ){
? ? ? ? ? ? int max,min,mid;
? ? ? ? ? ? min = 0;
? ? ? ? ? ? max = arr.length - 1;
? ? ? ? ? ? mid = (min + max)/2;
? ? ? ? ? ? while(key!=arr[mid]){
? ? ? ? ? ? ? if(key>arr[mid]){
? ? ? ? ? ? ? ? ? ? min = mid + 1;
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?else if(key < arr[mid]){
? ? ? ? ? ? ? ? ? ? ? ? ?max = mid -1;
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?if(mix>max)
? ? ? ? ? ? ? ? ? ?return -1;?
? ? ? ? ? ? ?mid = (max+min)/2;
? ? ? ? ? ? }
return mid;
}
折半查找的第二種方式:
public ?static int ?halfsearch(int arr[ ] ,int key){
? ? ? ? ? int min = 0 , max = arr.length-1, mid;
? ? ? ? ?while(min < =max){
? ? ? ? ? ? ? ? ?mid = (max + min)>>1;
? ? ? ? ? ? ? ? if(key>arr[mid])
? ? ? ? ? ? ? ? ? ? ? ?min = mid +1;l
? ? ? ? ? ? ? ? else if(key<arr[mid]){
? ? ? ? ? ? ? ? ? ? ? ? max = mid -1 ;
? ? ? ? ? ? ? else?
? ? ? ? ? ? ? ? ? ? ? ? return ?mid;
? ? ? ? ? ? ? }
? ? ? ?}
}
十進制轉(zhuǎn)為二進制:
public static void toBin(int num){
? ? ?while(num>0){
? ? ? ? ? ? System.out.println(num%2);
? ? ? ? ? ? ? num = num /2;
? ? ? ? }
}
十進制轉(zhuǎn)為十六進制:
public static void toHex(int num){
? ? ? ? ? ? ?StringBuffer sb = new StringBuffer();
? ? ? ? ? ? ?for( int ?x= 0; x < 8; x++){
int temp = num &15;
? ? ? ? ? ? ? ? ? ?if(temp>9){
? ? ? ? ? ? ? ? ? ? ? ?sb.append((char)(temp -10+'A'));
? ? ? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? ? ? ? sb.append(temp);
? ? ? ? ? ? ? ? num = num >>>4;
? ? ? ? ? }
? ? ? System.out.println(sb.reverse());
? ? ? ?}
}
S2SH在一些實體類的例子里匪傍,有的沒有寫構(gòu)造方法您市,有的有寫構(gòu)造方法,有參數(shù)和無參數(shù)都有役衡,是因為:(1)創(chuàng)建java時會提供一個默認的無參構(gòu)造方法茵休,但是不會顯示出來;(2)根據(jù)業(yè)務(wù)的需求用戶可以自己定義帶參數(shù)的構(gòu)造方法映挂;(3)至于參數(shù)幾個泽篮,可以根據(jù)對應(yīng)的業(yè)務(wù)需求,制定加上相應(yīng)的參數(shù)柑船。
構(gòu)造函數(shù)是一種特殊的函數(shù)帽撑,主要功能是用來創(chuàng)建對象時初始化帝鄉(xiāng),即為對象成員變量賦初始值鞍时,總與bew運算符一起使用在創(chuàng)建對象的語句中亏拉,構(gòu)造函數(shù)與類名相同,可重載多個不同的構(gòu)造函數(shù)逆巍。
Integer.parseInt(String)就是將String字符類型數(shù)據(jù)轉(zhuǎn)換為Integer整型數(shù)據(jù)及塘。
Integer.parseInt(String)遇到一些不能被轉(zhuǎn)換為整型的字符時,會拋出異常锐极。
一個例子
str=bf.readLine() ;//bf是一個Buffer流笙僚,str是一個字符串
num=Integer.parseInt(str) ;//此處將str字符串轉(zhuǎn)換為整型并存儲到int類型的num中
其作用在于,若讀取的str不為整型灵再,則會報錯肋层,可以拋出異常解決此問題
try{
str=brd.readLine() ;
num=Integer.parseInt(str) ;
}
catch(Exception e)
{
System.out.println("對不起,只能輸入整數(shù)翎迁,請重新輸入栋猖。") ;
}
如此,再次輸入h汪榔,a等非整型字符時蒲拉,則會提示你輸入整數(shù)
查表法:將所有的元素臨時存儲起來,建立對應(yīng)關(guān)系痴腌。每一次&15后的值作為索引去查建立好的表雌团,都可以找對應(yīng)的元素
類和對象的關(guān)系:
類:對現(xiàn)實生活中事物的描述;對象:就是這類事物士聪,實實在在存在的個體
屬性對應(yīng)類中變量辱姨,行為對應(yīng)類中的函數(shù)(方法)
其實定義類就是在描述事物,就是在定義屬性和行為戚嗅。屬性和行為共同成為類中的成員(成員變量和方法)
堆內(nèi)存中的變量默認初始化值----null
成員變量和局部變量:成員變量作用于整個類中,局部變量作用于函數(shù)中,或者語句中懦胞;在內(nèi)存中的位置替久,成員變量在堆內(nèi)存中,因為對象的存在才在內(nèi)存總存在躏尉,而局部變量存在于棧內(nèi)存中
匿名對象使用方式一:當(dāng)對象的方法只調(diào)用一次時可以用匿名對象來完成蚯根,這樣寫比較簡化;如果對一個對象進行多個成員調(diào)用胀糜,必須給這個對象起個名字
匿名對象的使用方式二:可以將匿名對象作為實際參數(shù)進行傳遞
封裝:指隱藏對象的屬性和實現(xiàn)細節(jié)颅拦,僅對外提供公共訪問方式;好處:將變化隔離教藻、便于使用距帅、提高重用性、提高安全性括堤;封裝原則:將不需要對外提供的內(nèi)容都隱藏起來碌秸;把屬性都隱藏,提供公共方法對其訪問
private:私有悄窃,權(quán)限修飾符讥电;用于修飾類中的成員(成員變量,成員函數(shù))轧抗,私有只在本類中有效恩敌,類以外即使建立了對象也不能直接訪問
私有僅僅是封裝的一種表現(xiàn)形式;之所以對外提供訪問方式横媚,就因為可以在訪問方式中加入邏輯判斷等語句纠炮,對方問的數(shù)據(jù)進行操作,提高代碼的健壯性
構(gòu)造函數(shù):
特點:函數(shù)名與類名相同分唾;不同定義返回值類型抗碰;不可以寫return語句;
作用:給對象進行初始化绽乔;
注意:默認構(gòu)造函數(shù)的特點弧蝇;多個構(gòu)造函數(shù)是以重載的形式存在的;當(dāng)一個類中沒有定義構(gòu)造函數(shù)時折砸,系統(tǒng)會默認給該類加入一個空參數(shù)的構(gòu)造函數(shù)看疗;當(dāng)在類中自定義了構(gòu)造函數(shù)后,默認的構(gòu)造函數(shù)就沒有了
重載:函數(shù)名相同睦授,但是參數(shù)列表不同
構(gòu)造函數(shù)和一般函數(shù)在寫法上有不同两芳,在運行上也有不同;構(gòu)造函數(shù)是在對象一建立就運行去枷,給對象初始化怖辆,一般方法是對象調(diào)用才執(zhí)行是复,是給對象添加對象具備的功能;一個對象建立竖螃,構(gòu)造函數(shù)只運行一次淑廊;而一般方法可以被該對象調(diào)用多次
構(gòu)造代碼塊
作用:給對象進行初始化;對象一建立就運行特咆,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行季惩;
與構(gòu)造函數(shù)的區(qū)別:構(gòu)造代碼塊是給所有對象進行統(tǒng)一初始化;而構(gòu)造函數(shù)是給對應(yīng)的對象進行初始化
構(gòu)造代碼塊中定義的是不同對象的共性的初始化內(nèi)容
this:用于區(qū)分局部變量和成員變量同名的情況腻格;
特點:代表本類的對象画拾;代表它所在函數(shù)所屬對象的引用;簡單說菜职,哪個對象在調(diào)用this所在的函數(shù)青抛,this就代表哪個對象
this的應(yīng)用:當(dāng)定義類中功能時,給函數(shù)內(nèi)部要用到調(diào)用該函數(shù)的額對象時些楣,這時用this來表示這個對象脂凶。但凡本類功能內(nèi)部使用了本類對象,都用this表示
this語句:用于構(gòu)造函數(shù)之間進行互相調(diào)用愁茁;只能定義在構(gòu)造函數(shù)的第一行(第一個語句)蚕钦,因為初始化動作要先執(zhí)行。
static(靜態(tài))關(guān)鍵字:用于修飾成員(成員變量和成員函數(shù))鹅很;被修飾后的成員具備以下特點:隨著類的加載而加載嘶居;優(yōu)先于對象存在;可以直接被類名所調(diào)用促煮;被所有對象共享邮屁;當(dāng)成員被靜態(tài)修飾后,就多了一個調(diào)用方式菠齿,除了可以被對象調(diào)用外佑吝,還可以直接被類名調(diào)用:類名.靜態(tài)成員
實例變量和類變量的區(qū)別:
1.存放位置:類變量隨著類的加載而存在于方法區(qū)中;實例變量隨著對象的建立而存在于堆內(nèi)存中
2.生命周期:類變量生命周期最長绳匀,隨著類的消失而消失芋忿;實例變量生命周期隨著對象的消失而消失
靜態(tài)的使用注意事項:1.靜態(tài)方法只能訪問靜態(tài)成員;非靜態(tài)方法既可以訪問靜態(tài)也可以訪問非靜態(tài)疾棵;2.靜態(tài)方法中不可以定義this.super關(guān)鍵字戈钢,因為靜態(tài)優(yōu)先于對象存在,所以靜態(tài)方法總不可以出現(xiàn)this是尔;3.主函數(shù)是靜態(tài)的
靜態(tài)的利與弊:
利:對對象的共享數(shù)據(jù)進行單獨空間的存儲殉了,節(jié)省空間,沒有必要每一個對象總都存儲一份拟枚,可以直接被類名調(diào)用
弊:生命周期過長薪铜,訪問出現(xiàn)局限性(靜態(tài)雖好众弓,只能訪問靜態(tài))
主函數(shù)是一個特殊的函數(shù),可以被jvm調(diào)用隔箍,作為程序的入口田轧;
主函數(shù):
public:代表著該函數(shù)的訪問權(quán)限是最大的
static:代表著主函數(shù)隨著類的加載就已經(jīng)存在了
void:主函數(shù)沒有具體的返回值
main:不是關(guān)鍵字,但是是一個特殊的單詞鞍恢,可以被jvm識別
函數(shù)的參數(shù):(String[]args):函數(shù)的參數(shù),參數(shù)的類型是一個數(shù)組每窖,該數(shù)組中的元素是字符串帮掉。字符串類型的數(shù)組
主函數(shù)是固定格式的:jvm識別
jvm在調(diào)用主函數(shù)時,傳入的是new String[0];
因為靜態(tài)修飾的內(nèi)容有成員變量和函數(shù)窒典。
當(dāng)對象中出現(xiàn)共享數(shù)據(jù)時蟆炊,該數(shù)據(jù)被靜態(tài)所修飾。
對象中的特有數(shù)據(jù)要定義成非靜態(tài)存在于堆內(nèi)存中
當(dāng)功能內(nèi)部沒有訪問到非靜態(tài)數(shù)據(jù)(對象的特有數(shù)據(jù))該功能可以定義成靜態(tài)的
靜態(tài)的應(yīng)用:
每一個應(yīng)用程序中都有共性的功能瀑志,可以將這些功能進行抽取涩搓,獨立封裝,以便復(fù)用
雖然可以通過建立ArrayTool的對象使用這些工具方法劈猪,對數(shù)組進行操作昧甘,但是發(fā)現(xiàn)了下面這些問題:
1.對象是用于封裝數(shù)據(jù)的,可是ArrayTool對象并未封裝特有數(shù)據(jù)
2.操作數(shù)組的每一個方法都沒有用到ArrayTool對象中的特有數(shù)據(jù)
所以這是不需要對象的战得,因此可以將ArrayTool中的方法都定義成static充边,直接通過類名調(diào)用即可
將方法都靜態(tài)后,可以方便于使用常侦,但是該類還是可以被其他程序建立對象的浇冰,為了更為嚴謹,強制讓該類不能建立對象聋亡,可以通過將構(gòu)造函數(shù)私有化完成
class ArrayTool{
? ? ? ? private? ArrayTool(){}
? ? ? ? ? ?...........(方法集合)
}
默認打的構(gòu)造函數(shù)的權(quán)限是隨著類的變化而變化
靜態(tài)代碼塊:
特點:隨著類的加載而執(zhí)行肘习,只執(zhí)行一次,用于給類進行初始化
格式:
static
{
? ?靜態(tài)代碼塊中的執(zhí)行語句
}
省略前面一些代碼
Person p = new Person("zhangsan",20);
該句話執(zhí)行的內(nèi)容:
1.因為new用到了Person.calss坡倔,所以會先找到Person.class文件并加載到內(nèi)存中漂佩;
2.執(zhí)行該類中的static代碼塊,如果有的話致讥,給Person.class類進行初始化
3.在堆內(nèi)存中開辟空間仅仆,分配內(nèi)存地址
4.在堆內(nèi)存中建立對象的特有屬性,并進行默認初始化
5.對屬性進行顯示初始化
6.對對象進行構(gòu)造代碼塊初始化
7.對對象進行對應(yīng)的構(gòu)造函數(shù)初始化
8.將內(nèi)存地址賦給內(nèi)存中的p變量
設(shè)計模式:
解決某一類問題最行之有效的方法垢袱;
單例設(shè)計模式:解決一個類在內(nèi)存中只存在一個對象墓拜;想要保證對象唯一,1.為了避免其他程序過多建立該對象请契,先控制禁止其他程序建立該對象咳榜;2.為了讓其他程序可以訪問到該對象夏醉,只好在本類中自定義一個對象;3涌韩。為了方便其他程序?qū)ψ远x對象的訪問畔柔,可以對外提供一些訪問方式,實現(xiàn)方式:
1.將構(gòu)造函數(shù)私有化
2.在類中創(chuàng)建一個本類對象
3.提供一個方法可以獲取到該對象
餓漢模式:single類一進內(nèi)存臣樱,就已經(jīng)創(chuàng)建好了對象
class Single{
? ? ? ? ?private ?Single(){?}
? ? ? ? ?private? static? Single? s = new Single();?
? ? ? ? ? public ?static ? Single getInstance()
? ? ? ? ? {
? ? ? ? ? ? ? ? ? ?return ?s;
? ? ? ? ? ?}
}
class SingleDemo{
public static void main(String[]args){
? ? ? ? ?Single ss = Single.getInstance();
? ? ? ? ? }
}
對于事物該怎么描述還是怎么描述靶擦,當(dāng)需要將該事物的對象保證在內(nèi)存中唯一時,就將以上的三步加上即可
下面這個為
懶漢模式:對象是方法被調(diào)用時雇毫,才初始化玄捕,也叫做對象的延時加載;single類進內(nèi)存棚放,對象還沒有存在枚粘,只有調(diào)用了getInstance方法,才建立對象
class Single{
private ?Single(){?}
private? static? Single? s = null;
public ?static ? Single getInstance()
{
? ? if(s==null){
? ? ? ? synchronized(Single.class)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? if(s==null)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s=new Single();
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? return s;
? ? ? ? ? }
}
原則:定義單例時飘蚯,使用餓漢式
繼承:
1.提高代碼的復(fù)用性
2.繼承讓類與類之間產(chǎn)生了關(guān)系馍迄,有了這個關(guān)系,才有了多態(tài)的特性剪壞
注意:千萬不要為了獲取其他類的功能局骤,簡化代碼而繼承攀圈。必須是類與類之間有所屬關(guān)系才可以繼承。所屬關(guān)系 ?is ?a.
java只支持單繼承庄涡,不支持多繼承量承,因為多繼承容易帶來安全隱患,當(dāng)多個父類中定義了相同功能穴店,但是功能內(nèi)容不同時撕捍,不確定運行哪一個,但是java保留了這種機制泣洞,并用另一種體現(xiàn)形式來完成表示忧风,多實現(xiàn)
java支持多層繼承,也就是一個繼承體系球凰,想要使用體系狮腿,先查閱體系中父類的描述,因為父類中定義的是該體系中共性功能呕诉。通過了解共性功能缘厢,就可以知道該體系的基本功能,那么這個體系已經(jīng)可以基本使用了甩挫。 在具體調(diào)用時贴硫,要創(chuàng)建最子類的對象,因為(1)有可能父類不能創(chuàng)建對象,(2)創(chuàng)建子類對象可以使用更多的功能英遭,包括基本的间护,也包括特有的
查閱父類功能,創(chuàng)建子類對象使用功能
聚集:has a
聚合挖诸,組合:
當(dāng)子類繼承父類汁尺,沿襲了父類的功能,到子類中多律,但是子類雖然有這個功能痴突,但是功能的內(nèi)容卻和父類不一致,這時狼荞,沒有必要定義新功能苞也,而是使用覆蓋保護扛点,保留父類的功能定義丈秩,并重寫功能內(nèi)容
覆蓋:
子類覆蓋父類特幔,必須保證子類權(quán)限大于等于父類權(quán)限,才可以覆蓋攻走,否則編譯失敗
靜態(tài)只能覆蓋靜態(tài)
記住:重載只看同名函數(shù)的參數(shù)列表此再,重寫看字符類方法樣一模一樣昔搂,返回值類型也要一樣
final可以修飾類,方法输拇,變量
final修飾的類不可以被繼承
final修飾的方法不可以覆蓋
final修飾的變量是一個常量摘符,只能被賦值一次
內(nèi)部類只能訪問被final修飾的局部變量
抽象的特點:
1.抽象方法一定在抽象類中
2.抽象方法和抽象類都必須被abstract關(guān)鍵字修飾
3.抽象類中不可以用new創(chuàng)建對象,因為調(diào)用抽象方法沒意義
4.抽象類中的方法要被使用策吠,必須由子類復(fù)寫其所有的抽象方法后逛裤,建立子類對象調(diào)用。如果子類只覆蓋了部分抽象方法猴抹,那么該子類還是一個抽象類
抽象類和一般類沒有太大的不同带族,該如何描述失誤,就如何描述事物蟀给,只不過蝙砌,該事物出現(xiàn)了一些看不懂的東西,這些不確定的部分也是該事物的功能跋理,需要明確出來择克,無法定義主體,通過抽象方法來表示
抽象類比一般類多了抽象函數(shù)前普;抽象類不可以實例化肚邢,就是在類中可以定義抽象方法
抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象
接口中的成員修飾符是固定的:
成員常量:public static final
成員函數(shù):public abstract
接口的出現(xiàn)汁政,將“多繼承”通過另一種形式體現(xiàn)出來道偷,即“多實現(xiàn)”
接口(interface):初期理解缀旁,可以認為是一個特殊的抽象類;當(dāng)抽象 類中的方法都是抽象的勺鸦,那么該類可以通過接口的形式來表示
class用于定義類并巍;interface用于定義接口;接口中的成員都是public的
接口是不可以創(chuàng)建對象的换途,因為有抽象方法懊渡,需要被子類實現(xiàn),子類對接口中的抽象方法全都覆蓋后军拟,子類才可以實例化剃执,否則子類是一個抽象類
接口是對外暴漏的規(guī)則;是程序的功能擴展懈息;可以用來多實現(xiàn)肾档;類與接口之間是實現(xiàn)關(guān)系,而且類可以繼承一個類的同時實現(xiàn)多個接口辫继;接口與接口之間可以有繼承關(guān)系
多態(tài):可以理解為事物存在的多種體現(xiàn)形態(tài)
1.多態(tài)的體現(xiàn):父類的引用指向了自己的子類對象怒见;父類的引用也可以接收自己的子類對象。
2.多態(tài)的前提
必須是類與類之間有關(guān)系姑宽,要么繼承遣耍,要么實現(xiàn);通常還有一個前提炮车,就是覆蓋
3.多態(tài)的好處
多態(tài)的出現(xiàn)大大的提高了程序的擴展性
弊端:只能使用父類的引用訪問父類的成員
4.多態(tài)的應(yīng)用
5.多態(tài)使用的注意事項
我們能轉(zhuǎn)換的是父類引用指向了自己的子類對象舵变,該應(yīng)用可以被提升,也可以被強制轉(zhuǎn)換
在多態(tài)中成員函數(shù)的特點:
在編譯時期:參閱引用型變量所屬的類中是否有調(diào)用的方法瘦穆。如果有纪隙,編譯通過,如果沒有編譯失敗
在運行時期:參閱對象所屬的類中是否有調(diào)用的方法扛或。
簡單總結(jié):成員函數(shù)在多態(tài)調(diào)用時瘫拣,編譯看左邊,運行看右邊
在多態(tài)中告喊,成員變量的特點麸拄,無論編譯和運行,都參考左邊(引用型變量所屬的類型)
在多態(tài)中黔姜,靜態(tài)成員函數(shù)的特點:無論編譯和運行拢切,都參考左邊
主板案例:
Interface PCI
{
? ? ? ? ?public void open();
? ? ? ? ?public void close();
}
class MainBoard
{
? ? ? ? ? ? public void run()
? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ?System.out.println("MainBoard ? run");?
? ? ? ? ? ? ?} ?
? ? ? ? ? ? public void usePCI(PCI p)
? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? p.open();
? ? ? ? ? ? ? ? ? ? ? ? p.close();
? ? ? ? ? }
}
class NetCard implements PCI
? ?{
? ? ? ? ? ? ?public void open()
? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? System.out.println("run");
? ? ? ? ? ? }
? ? ? ? ? ? ? public void close()
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? System.out.println("close");
? ? ? ? ? ? ? ?}
?}
?class ZhuBan
? ?{
? ? ? ? ? ?public static void ?main(String[] args)
? ? ? ? ?{
? ? ? ? ? ? ? ? ? MainBoard mb = new MainBoard();
? ? ? ? ? ? ? ? ?mb.run();
? ? ? ? ? ? ? ? ?mb.usePCI(NetCard);
? ? ? ? ?}
}
Object是所有對象的直接或者間接父類,傳說中的上帝秆吵;該類中定義的是所有對象都具備的功能淮椰。
Object類中已經(jīng)提供了對對象是否相同的比較方法,如果自定義類中也有比較相同的功能,沒有必要重新定義主穗,紫瑤演戲父類中的功能泻拦,建立自己特有的內(nèi)容即可,這就是覆蓋
內(nèi)部類可以直接訪問外部類中的成員忽媒,包括私有成員(之所以可以直接訪問外部類中的成員争拐,是因為內(nèi)部類中持有了一個外部類的引用,格式:外部類名.this)晦雨;而外部類要訪問內(nèi)部類中的成員必須要建立內(nèi)部類的對象
訪問格式:
1.當(dāng)內(nèi)部類定義在外部類的成員位置上架曹,而且非私有,可以在外部其他類中闹瞧,直接建立內(nèi)部類對象:
格式:
? ? ?外部類名.內(nèi)部類名 ?變量名 = 外部類對象.內(nèi)部類對象;
2.當(dāng)內(nèi)部類在成員位置上绑雄,就可以被成員修飾符所修飾
? ?比如:private:將內(nèi)部類在外部類中進行封裝;static:內(nèi)部類就具備static的特性
? ?當(dāng)內(nèi)部類被static修飾后奥邮,只能訪問外部類中的static成員万牺,出現(xiàn)了訪問局限
? 在外部其他類中,直接訪問static內(nèi)部類的非靜態(tài)成員:
? ?new ? Outer.Inner().function();
在外部其他類中洽腺,直接訪問static內(nèi)部類的靜態(tài)成員:
? Outer.Inner.function();
注意:當(dāng)內(nèi)部類中定義了靜態(tài)成員杏愤,該內(nèi)部類必須是靜態(tài)的;當(dāng)外部類中的靜態(tài)方法訪問內(nèi)部類時已脓,內(nèi)部類也必須是static的
當(dāng)描述事物時,事物的內(nèi)部還有事物通殃,該事物用內(nèi)部類來描述度液。
因為內(nèi)部事務(wù)在使用外部事物的內(nèi)容
內(nèi)部類定義在局部時:1.不可以被成員修飾符修飾;2.可以直接訪問外部類中的成員画舌,因為還持有外部類中的引用堕担。但是不可以訪問它所在的局部中的變量。只能訪問被final修飾的局部變量
匿名內(nèi)部類:
1.匿名內(nèi)部類就是內(nèi)部類的簡寫格式
2.定義匿名內(nèi)部類的前提:內(nèi)部類必須繼承一個類或者實現(xiàn)接口
3.匿名內(nèi)部類的格式:new ?父類或者接口(){定義子類的內(nèi)容}
4.其實匿名內(nèi)部類就是一個匿名子類對象曲聂。而且這個對象有點胖霹购,可以理解為帶內(nèi)容的對象
5.匿名內(nèi)部類中定義的方法最好不要超過3個
異常
異常的體系:
Throwable
Error :通常出現(xiàn)重大問題如:運行的類不存在或者內(nèi)存溢出等;不編寫針對代碼對其處理
Exception:在運行時運行出現(xiàn)的一些情況朋腋,可以通過try catch finally
Exception和Error的子類名都是以父類名作為后綴
異常就是程序在運行時出現(xiàn)的不正常情況
異常的由來:問題也是現(xiàn)實生活中一個具體的事物齐疙,也可以通過java的類的形式進行描述,并封裝成對象旭咽,其實就是java對不正常情況進行描述后的對象體現(xiàn)
對于問題的劃分贞奋,分為:一種是嚴重的問題,一種是非嚴重的問題
try
{ 需要被檢測的代碼}
catch(異常類 變量)
{處理異常的代碼穷绵;(處理方式)}
finally{一定會執(zhí)行的語句}
對捕獲到的異常對象進行常見方法操作:
其實jvm默認的異常處理機制轿塔,就是在調(diào)用printStackTrace方法,打印異常的堆棧的跟蹤信息。
在功能上通過throws的關(guān)鍵字聲明了該功能有可能出現(xiàn)的問題
對捕獲到的異常對象進行常見方法操作勾缭; String getMessage():獲取異常信息
在函數(shù)上聲明異常:便于提高安全性揍障,讓調(diào)用出進行處理,不處理編譯失敗
對多異常的處理:
1.聲明異常時俩由,建議聲明更為具體的異常毒嫡,這樣處理的可以更具體
2.對方聲明幾個異常,就對應(yīng)有幾個catch塊采驻;如果多個catch中的異常出現(xiàn)繼承關(guān)系审胚,父類異常catch塊 放在最下面,不要定義多余的catch塊
3.建議在進行catch處理時礼旅,catch中一定要定義具體處理方式膳叨,不要簡單定義一句e.printStackTrace(),也不要簡單的就書寫一條輸出語句
因為項目中會出現(xiàn)特有 的問題,而這些問題并未被java鎖描述并封裝對象痘系,所以對于這些特有的問題可以按照java對問題封裝的思想對特有的問題菲嘴,進行自定義的異常封裝
自定義異常:必須繼承Exception;繼承exception的原因汰翠,異常體系的特點龄坪,因為異常對象和異常類都會被拋出,因為他們都具備可拋性复唤,這個可拋性是Throwable這個體系中的獨有特點健田,只有這個體系中的類和對象才可以被throws和throw操作,
當(dāng)在函數(shù)內(nèi)部出現(xiàn)了throw拋出異常對象佛纫,那么就必須要給對應(yīng)的處理動作:
1.要么在內(nèi)部try ncatch處理
2.要么在函數(shù)上聲明讓調(diào)用者處理
一般情況下妓局,函數(shù)內(nèi)出現(xiàn)異常,函數(shù)上需要聲明
throw和throws的區(qū)別:throws使用在函數(shù)上呈宇,throw使用在函數(shù)內(nèi)好爬;throws后面跟的是函數(shù)類,可以跟多個甥啄,用逗號隔開存炮;throw后面跟的是函數(shù)對象
Exception中有一個特殊的子類異常RuntimeException運行時異常;如果在函數(shù)內(nèi)拋出該異常蜈漓,函數(shù)上可以不用聲明穆桂,編譯一樣通過,如果在函數(shù)上聲明了該異常融虽,調(diào)用者可以不用進行處理充尉,編譯一樣通過
自定義異常時,如果該異常的發(fā)生衣形,無法再繼續(xù)進行運算驼侠,就讓自定義異常繼承RuntimeException
對于異常分為兩種:
1.編譯時被檢測的異常姿鸿;
2.編譯時不被檢測的異常(運行時異常,RuntimeException以及其子類)
finally代碼塊:一定執(zhí)行的代碼塊倒源,通常用于關(guān)閉資源苛预;finally只有一種情況不會執(zhí)行,當(dāng)執(zhí)行到System.exit(0);finally不會執(zhí)行
catch是用于處理異常笋熬,如果沒有catch就代表異常沒有被處理過热某,如果該異常是檢測時異常,那么必須聲明胳螟。
1.子類在覆蓋父類時昔馋,如果父類的方法拋出異常,那么子類的覆蓋方法糖耸,只能拋出父類的異趁囟簦或者該異常的子類
2.如果父類方法拋出多個異常,那么子類在覆蓋該方法時嘉竟,只能拋出父類異常的子集
3.如果父類或者接口的方法中沒有異常拋出邦危,那么子類在覆蓋方法時也不可以拋出異常,如果子類方法發(fā)生了異常就必須要進行try處理舍扰,絕對不能拋
異常的好處:
1.將問題進行封裝
2.將正常流程代碼和問題處理代碼相分離倦蚪,方便于閱讀
異常的處理原則:
1.兩種:try或者拋
2.調(diào)用到配偶出異常的功能時,拋出幾個边苹,就處理幾個
3.多個catch陵且,父類的catch放到最下面
4.catch內(nèi)需要定義針對性的處理方式,不要簡單的定義printstacktrace,或者輸出語句个束,也不要不寫慕购;當(dāng)捕獲到的異常,本功能處理不了的時候播急,可以繼續(xù)在catch中拋出;如果該異常處理不了售睹,但并不屬于該功能出現(xiàn)的異常桩警,可以將異常轉(zhuǎn)化后再拋出和該功能相關(guān)的異常或者異巢茫可以處理但需要將異常產(chǎn)生后和本功能相關(guān)的問題提供出去捶枢,讓調(diào)用者知道并進行處理,也可以將捕獲異常處理后轉(zhuǎn)換新的異常