?? 07_java_advanced_speciality.txt
字號:
內部類
反射
集合
三個修飾符:
static final abstract
static:它用來修飾類中的成員屬性和方法.
修飾屬性:靜態屬性
在animal類name和age屬性,
這樣的屬性又叫做實例屬性.
和它對應的是靜態屬性或叫類屬性.
屬性:
1.實例屬性
用來描述某個實例的.
這些屬性一定和某個對象相關系.他們就是用來描述對象的.沒有對象這些屬性就沒有意義.
2.靜態屬性
用來描述類的特征.
這些屬性是用來描述整個這個類的特征的.它不合具體的個體/實例/對象相關系.
例子:
動物園:
每個動物脖子上掛描述當前這個動物的牌子
真個動物園動物的數量
差別:
1,訪問方式
實例屬性:必須要通過對象去訪問.a1.name
靜態屬性:直接通過類名去訪問.
2,空間分配的時機的方式不一樣.
實例屬性:生成對象的時候,每個對象都有一份獨立的空間.
靜態屬性:在類加載的時候分配空間,并且整個類只有一份.
修飾方法:靜態方法
1.實例方法.
它用來描述具體某個對象的特征.
2.靜態方法.
它用來描述整個類的行為特征.
差別:
訪問方式
實例方法,用對象訪問.
靜態方法,用類名去訪問.可以在沒有對象之前就可以訪問.
限制:
靜態方法只能訪問靜態成員.當然也不能直接去使用this.
為什么:
因為靜態方法有可能在沒有對象之前就可以調用,那么它的實例成員,在方法中是沒有意義的.
那么:在非靜態方法訪問靜態成員.
main()方法為什么一定是靜態,因為它是整個程序的入口,那么在調用它之間沒有可能做任何事情,所以不能創建任何對象.
靜態方法的特點:
靜態方法不滿足多態的特性.
靜態方法是不能被覆蓋.
因為:
靜態方法是類的描述,它和對象沒有關系,然而多態是針對于對象來說的.測試的例子來測試一下.
理解:
一般出現這樣的情況是你的代碼不符合規范.對于靜態方法應當使用類名來調用,而不應當是用對象名來調用.這些屬性和方法都用類名去掉不用對象去調用,那么就不會出現這種靜態和多態的混亂.
靜態方法:描述類的行為的不是描述對象的行為的
修飾代碼塊:
在類的方法外部用static{....}定義,靜態代碼塊.
在段代碼里面能夠出現靜態成員,非靜態成員不能訪問.
類被加載完成之后,讓系統自動執行.
可以認為靜態代碼塊是類的初始化代碼.
類在何時被加載:
1,生成該類的對象的時候.new 該類的對象的時候,會加載這個類以及他的父類.
2,訪問類的靜態成員的時候.
3,反射內的方法.
如果在程序重要加載這個類,一旦加載后,會直接的去調用靜態代碼塊
Animal a1;這個不會加載類,jvm不用知道你的類型,只用給你分配一個存放引用的空間.
順序:
1.當的一次發生以下情況之一時jvm要加載類.
1.生成對象
2.訪問靜態成員
3.Class.forName("");
2.為靜態的屬性分配空間.(實例化);
3.去執行靜態代碼塊.
這是類加載的時候要做的一些工作.
public class ABC{
static ABC abc=new ABC();
static a=10;//如果把這條語句拿到上面結果就會有變化.
static b;
public ABC(){
a=20;
b=10;
}
public static void main(){
System.out.println(ABC.a);
System.out.println(ABC.b);
}
}
//結果時10,20
//在創建abc對象的時候給變量傳值了,之后初始化屬性a的時候又一次賦了初值.
final:它能夠修飾類,屬性,方法,方法中的局部變量.
修飾類:表示這個類不能被繼承.
修飾屬性:該屬性不能改變.只能賦一次值
修飾方法:該方法不能被覆蓋
修飾局部變量:一點定義下來,不能被改變.
修飾屬性和方法的特征:
final int n=10;//屬性.
n是常量,如果這樣,我哪怕在程序中生成100個1000個對象,每個對象都有一個n的空間.由于他們都相同.到不如怎么變化一下n在每個類里面都只保留一份.
static final經常合起來使用.
又一種情況例外:
final int s;
//可以在構造方法里面去賦值.
這是說:在不同對象中,對象的該常量的值不同.
只不過這個對象定下來,這個對象就不可以改了.
static final 在定義的時候賦值.
final 可以在構造方法里面賦值.
abstract:用來修飾一個類或者方法.
修飾類,抽象類.
修飾方法,抽象方法.
例子:動物..移動的方法..抽象的.
把它的方法做成一個抽象方法.在方法后面不要{}直接要;,在前面加上abstract關鍵字.
無法確定具體行為,那么就做成抽象方法.
意義:
抽象方法,實際上是留給子類去實現的.
規則:
如果類里面有抽象方法了必須定義成抽象類.
反過來,如果某個類沒有任何抽象方法,它繼承自抽象類,它也是抽象類.
抽象類不能夠實例化,但是可以聲明引用,所以可以去利用多態引用到子類.
抽象類實際上是個抽象的概念.
抽象類和普通的類的唯一差別是不能實例化.
其他的所有內容都父類子類的關系一樣.
子類繼承自一個抽象類,那么如果你的子類不是抽象類,那么它就要實現父類里面的方法.方法的實現等同方法的覆蓋.給出實現體.不論你的大括號里面有沒有語句.
final和abstract不可以同時使用,如果用了abstract那么就是個抽象類,抽象類就是希望去被覆蓋,如果聲明了final那么就不可以完成.
接口
特殊的抽象類.
1.接口中的所有方法都是公開抽象方法.
2.接口所有屬性都是final static
3.接口沒有構造方法.接口不僅不能實例化,并且沒有構造方法.
為什么抽象類有構造方法,因為抽象類有子類.接口沒有子類只有實現類
4.一個類可以同時實現多個接口.
類去實現接口的關系,可以認為是變相的繼承關系.
5.一個接口也可以同時繼承自多個接口.
類繼承父類,實現接口的差別:
所有類都有個父類.
一個類可以繼承父類,也可以實現接口,沒有沖突.
以前的對象就是個單面體.你可以去定義這個坦克能干什么.
現在如果有了接口,那么我們就可以不同的方式看待坦克,從移動的角度看待,它就是個交通工具.如果把它當作武器來看它就是一個可以攻擊的武器.移動和武器都是接口.
行看成嶺側成峰,各個角度都不同.
不識坦克真面目,只因你在用接口.
接口給編程帶來的好處
1.實際上接口是將服務的提供者和服務的使用者分離.
也就是說:
接口相當于指定一個標準.對于服務的使用者只需要關心服務的使用.不用關心具體的實現
最終這樣做的好處就是能夠降低耦合度.
一個良好的軟件設計的六字箴言,
高內聚,
類獨立萬稱工作的能力全面.執行的時候只需要做很少的通信.
低耦合.
相互之間依賴很少.
為了的是提高我們軟件的可擴展性和可維護性.
擴展性:
只需要了解和我要使用的模塊的幾個功能.
維護性:
為什么說面向接口編程降低了我們程序的耦合度.
JDBC sun定義的一套接口.
把服務的提供者和訪問者,中間的接口把兩者隔離開.
上層應用和底層實現的關聯關系的耦合度降低了.
2.不要面向對象編程要針對接口,針對抽象編程.
盡量不要出現那個具體的實現類.
在程序中本來就要,不用具體的類型,而用一個抽象的類型.
你的實現變了,我的抽象不用變.
是不是我整個的代碼都要改變.
接口定的細
1.減少實現類的負擔
2.給用我的接口人提供個性化的服務.
我們希望制做一個用戶管理系統.可以為是軟件中的模塊.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -