本文的主要內容如下
1.標識符合關鍵字
2.Java中的關鍵字
3.static關鍵 字
4.static方法
5.靜態代碼塊
6.static修飾符綜述
7.final關鍵字
8.final修飾符綜述
9.抽象類abstract class
10.abstract綜述
11.抽象類和接口的區別(j精講)
1.標識符合關鍵字
標識符命名規則
(1)由字母、數字、下划線、$組成 ,不能以數字開頭
(2)大小寫敏感
(3)不得使用關鍵字和保留字
習慣
(1)標識符要符合語義信息。
(2)包名所有字母小寫
(3)類名每個首字母大寫其他小寫
(4)變量和方法第一個單詞小寫第二個開始首字母大寫;
(5)常量所有首字母大寫
常用的轉義字符
1. \b 退格 2.\f 換頁 3.\n 換行 4.\r 回車 5.\t 下個tab 6.\' ' 7.\" "
2.Java中的關鍵字
abstract | default | if | private | this |
boolean | do | implements | protected | throw |
break | double | import | public | throws |
byte | else | instanceof | return | transient |
case | extends | int | short | try |
catch | final | interface | static | void |
char | finally | long | stricftp | volatile |
class | float | native | super | while |
const | for | new | switch | |
continue | goto | package | synchronized |
注意:
1.true、false、null不是關鍵字是字面量
2.特殊關鍵字(保留字):goto,const
3.static關鍵字
static關鍵字可以修飾屬性、方法、內部類、代碼塊
1.static屬性
1)static修飾的資源屬於類級別,是全體對象實例共享的資源
2)靜態屬性,是全體類的實例共享的變量。在類加載期間初始化的。使用類名.屬性。Math.PI;
3)實例變量,屬於對象的屬性。
使用對象.屬性訪問
public class Foo{
int id;//實例變量 static int i=0;//靜態類級別的的變量 public javaLearn(){ id=i++; }
}
public class StaticDemo{
public static void main(String args[]){
Foo f1=new Foo();
Foo f2=new Foo();
System.out.println(f1.id+""+f2.id+""+f3.id);
}
}
id相當於水杯則i相當於水桶。程序執行的過程如下
第一步加載類 static在類加載期間初始化
第二步在內存中分配對象空間。 屬性自動初始化,為“0”值()
第三步進行屬性的賦值
第四步遞歸調用父類的構造器 默認調用父類的無參構造函數
第五步調用本類的構造器
4.static方法
屬於類的方法一般用來表示工具的方法,在類加載后就可以自己調用不需要創建任何類的實例對象。
class Moo{ int a=2; public static int main(String[] args) { return a;//靜態的方法不能訪問屬於對象的資源 } }
5.靜態代碼塊
靜態代碼是在類加載期間運行的代碼塊,由於類只加載一次所以靜態代碼塊只加載一次。靜態代碼塊不是很常見,一般用來在類加載后初始化以寫靜態資源的時候使用。
如加載配置文件
static{ System.out.println("類加載了"); }
6.static修飾符綜述
static修飾屬性(類變量)
類名.屬性名,為本類所有對象所共享,生成對象時先加載后構造。類變量會在加載時自動初始化,類中的實例變量是在創建對象的時候被初
始化的。類加載的過程只進行一次也就是說類變量只會被創建一次。
static修飾方法
類名.方法,為本類所有方法所共享,該方法不能訪問非靜態的成員,但是本類的非靜態成員可以訪問靜態的成員。在靜態成員中不能出現this關鍵字。
父類中的靜態方法子類不能覆蓋為非靜態的方法,在符合覆蓋的條件下父類的靜態方法可以被子類所覆蓋但是沒有多態。Java中的main方法必須寫成
靜態的原因是:在類加載時無法創建對象,而靜態的方法可以不通過創建對象來調用,所以通過main方法入口來運行程序。
static修飾的代碼塊
這個代碼只有類加載時被執行一次。可以使用靜態代碼塊初始一個類
動態初始化塊寫在雷替的{}這個是在對象生成的 時候運行。
class Moo{ static int a1=2; Moo a=new Moo(); int b=Moo.a1; }
靜態成員不能被其所在class創建的實例所訪問的。
7.final關鍵字
1.final修飾的類不能被繼承
String就是final類不能被繼承
Mtah是final類不能被繼承
Integer、Long、Character等包裝器是final類不能被繼承
在實際開發中原則上不予許使用final類!因為在Spring,Hiberate,Struts2,這些框架使用了動態繼承代理技術,使用final類會影響"動態繼承代理技術"的實現
2.final修飾的方法不能再被覆蓋
3.final修飾的變量,初始化后就不允許再修改了。
final的局部變量
final的方法參數
final的成員變量
4.final static 修飾的變量作為常量。
一般常量名都用大寫
Java常量的修飾不是const(c、c++修飾常量的修飾符)
final修飾的類不能被繼承
注意:
final的局部變量,只能初始化不能改
final的方法參數,不能改
final的引用,引用指向不能改,但是對象的屬性可以改
8.final修飾符綜述
final修飾變量
被final修飾的變量就會 變成常量,一旦賦值就不能改變,常量可以在初始時賦值也可以在構造方法中賦值但是不能不賦值(對象數據成員被聲明為final,單沒有明確使用=賦值,表示延遲對象成員值的指定,在構造函數執行流程中,一定要有對數據成員指定值的動作不然會編譯錯誤)。常量不會有默認初始值;鎖定棧,使得棧
中的位置不可以改變。靜態常量(final static)只能在初始化時直接賦值。
final修飾方法
被final修飾的方法不能被子類所覆蓋,保持方法的穩定不被覆蓋。
final修飾類
不能被繼承
final類中的方法也是final的。
注意:
final不能用來修飾構造器;
final修飾一個變量是是引用變量不能變引用對象的內容是可以變得。
9.抽象類(abstract class)
抽象方法,只有行為的該娘沒有具體的行為實現
使用abstract關鍵字修飾,並且沒有方法體
包含抽象方法的類一定是抽象類
抽象類不能直接創建實例可以定義引用變量。
Shape shape=new Shape();錯
Shape shape=new Circle();對
抽象類只能被繼承,一個具體類繼承一個抽象類,必須實現所有的抽象方法。
抽象類和抽象方法非常適合作為系統的分析和設計的工具。
10.抽象類綜述
abstract修飾類
這個類是抽象類不能生成實例但是可以作為對象變量的申明的類型編譯時類型。抽象類相當於類的一個半成品,需要子類繼承並覆蓋其中的抽象方法,
這時子類才有創建實例的能力,如果子類沒有實現父類的抽象方法那么子類也要為抽象類
abstract修飾方法
只有聲明沒有實現,在子類中實現,實現部分用“;”代替,需要子類繼承實現。
注意:
有抽象的方法類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以是全是具體的方法。
abstract與final不能同時使用。final阻止重寫和繼承的。
abstract與private也不能同時修飾方法,因為private阻止繼承,也阻止了重寫的事實。
11.抽象類與interface的區別
抽象類不能創建實例
抽象類的抽象方法不需在具體的子類來實現,不能有抽象額構造方法或者抽象的靜態方法。
接口是抽象類的一種特例,接口中的所有方法都必須是抽象的,接口的方法默認為public abstract類型,接口中的成員變量默認為 public static final類型
區別如下
抽象類可以有構造方法,接口中不能有構造方法。
抽象類可以有普通成員變量,接口中沒有。
抽象類中包含非抽象的方法,接口中的所有方法必須是抽象的。
抽象類的抽象方法訪問的類型可以是public,protected和默認類型(最好不要),接口接口方法只能是public類型的,,並且默認為public abstract類型。
一個類只能繼承一個抽象類,但可以實現多個接口。
摘自http://www.cnblogs.com/yongjiapei/p/5494894.html
你選擇使用接口和抽象類的依據是什么?
接口和抽象類的概念不一樣。接口是對動作的抽象,抽象類是對根源的抽象。
抽象類表示的是,這個對象是什么。接口表示的是,這個對象能做什么。比如,男人,女人,這兩個類(如果是類的話……),他們的抽象類是人。說明,他們都是人。
人可以吃東西,狗也可以吃東西,你可以把“吃東西”定義成一個接口,然后讓這些類去實現它.
所以,在高級語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是可以實現多個接口(吃飯接口、走路接口)。
當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用接口。抽象類的功能要遠超過接口,但是,定義抽象類的代價高。因為高級語言來說(從實
際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述。
而且你可以在一個類中同時實現多個接口。在設計階段會降低難度的。
總結幾句話來說:
1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
2、抽象類要被子類繼承,接口要被類實現。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、接口里定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
5、抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那么該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部
實現接口方法,那么該類也只能為抽象類。
6、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
7、抽象類里可以沒有抽象方法
8、如果一個類里有抽象方法,那么這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
1.抽象類 和 接口 都是用來抽象具體對象的. 但是接口的抽象級別最高 2.抽象類可以有具體的方法 和屬性, 接口只能有抽象方法和不可變常量 3.抽象類主要用來抽象類別,接口主要用來抽象功能.
4、抽象類中,且不包含任何實現,派生類必須覆蓋它們。接口中所有方法都必須是未實現的。