3分钟弄明白JAVA三大修饰符
3分鐘弄明白JAVA三大修飾符
JAVA的三個修飾:static,final,abstract,在JAVA語言里無處不在,但是它們都能修飾什么組件,修飾組件的含義又有什么限制,總是混淆。所以來總結對比一下。
1 static靜態修飾符
static修飾符能夠修飾屬性,方法,初始代碼塊。不能修飾局部變量和類。
首先要明白屬性分為靜態和非靜態,靜態的稱為靜態屬性,又叫類變量,非靜態的稱為實例變量。
靜態變量和靜態方法統稱為靜態成員。
修飾屬性 | 靜態屬性又稱類變量,它不屬于某個對象,是屬于類的,是所有對象共同享有。 | eg:類名.靜態屬性 =對象1.靜態屬性=對象2.靜態屬性=同一塊內存里所對應的地址 |
修飾方法 | 1:靜態方法可以直接類名.方法名調用。 2:靜態方法里只能:訪問靜態成員,不能訪問非靜態成員。 3:靜態方法里不能用this關鍵字。 4:靜態法法里沒有多態,只能被靜態方法覆蓋。 | |
修飾初始代碼塊 | static修飾初始代碼塊稱為靜態代碼塊。靜態代碼塊是在類加載的時候運行。這里回顧一下類加載。 |
類加載:
//TestPerson .java
?class Person{?
?????static{
? ? ? ? ? System.out.println("static here");
?????}
? ? ?public Person(){
? ? ? ? ? System.out.println("構造方法");
?????}
}
public class TestPerson(){
? ? ?public static void main(){
? ? ? ? ?Person p1 = new Person();
? ? ? ? ?Person p2 = new Person();?
?????}
}
運行 TestPerson .java文件會編譯生成TestPerson .class 和 Person.class兩個class文件。
執行java? TestPerson 首先會啟動JAVA虛擬機(JVM),然后再硬盤上找到TestPeson.calss文件,并開始解釋執行,
此時JVM里只有TestPerson.class這一個類的信息,順序執行到main方法,遇到,Person p1 = new Person(),
創建Person對象,JVM會根據CLASSPATH環境變量找到Person.class文件,把Person類的信息讀入到JVM里,
保存起來。這個過程就是類加載。
類加載:加載類信息;
? ? ? ? ? ? ?執行靜態代碼塊;
? ? ? ? ? ?? 為靜態屬性分配空間并初始化值。
以上例子的執行順序結果如下:
static here?
構造方法
構造方法
2final修飾符
final修飾符能夠修飾變量,方法,和類。
final修飾變量 | final修飾的變量稱為常量,一旦賦值不能更改。對于基本類型來說是其值不能改變,對于對象類型來說是其址不能改變。 | final變量的賦值說明:一般的實例變量在創建時JVM會給其分配空創建默認值。但是final變量只能有一次賦值機會,所以,對于final變量,JVM不會為其賦值,唯一的賦值機會留給程序員。 final類型的實例變量賦值在1:初始化屬性, 2:調用構造方法,兩種方式必須抓住其中一次機會,但不能試圖抓住兩種機會。 |
final修飾方法 | final修飾方法,表示該方法不能被子類覆蓋。 | eg:class A{ public final void a1(){.....}} class B extends A{public void ?a1(.....)} //編譯錯誤無法覆蓋 |
final修飾類 | final修飾類表示該類不能被繼承 | 一個類中有final方法,該類可以被繼承,但無法覆蓋final方法,但一個類是final類,則該類不能被繼承,更無從談起覆蓋。 |
eg:final賦值
class Person {
? ? ?final int num = 10 ; //初始化屬性
? ? ?public Perosn(int num){
? ? ? ? ?this.num = num;?
?????}
}
class Person {
? ? ?final int num ;?
? ? ?public Perosn(int num){//構造方法賦值
? ? ? ? ?this.num = num;
?????}
}
class Person {
? ? ?final int num = 10; ? ?// 錯誤,兩種方式都抓住
? ? ?public Perosn(int num){//錯誤,兩種方式都抓住
? ? ? ? ?this.num = num;
?????}
}
3 abstract修飾符
abstract可以修飾類和方法,
abstract修飾類 | abstract修飾類稱為抽象類。抽象類只能用來聲明引用不能用來創建對象。從某種意義上來說,抽象類就是讓子類去繼承,抽象類聲明引用,讓這個引用指向子類。子類去實現抽象方法。 | 抽象類中可以有非抽象方法,但一個類里有抽象方法就一定要是抽象類。子類繼承抽象類要么自己成為抽象類,要么實現父抽象類里的所有抽象方法。 |
abstract修飾方法 | abstract修飾方法,稱為抽象方法。抽象方法指:只有聲明沒有實現的方法。 | public abstract void ?a1();//抽象方法。 public void a1(){};//空實現的方法 |
abstract class A{
? ? ? ? ?public void a1(){}//抽象類中可以有非抽象方法
? ? ? ? ?public abstract void a2();//但有了抽象方法就一定要是抽象類
}
class B extends A{
? ? ?public void a2(){
? ? ? ? ?System.out.print("子類要么是抽象類,要么實現父抽象類所有的抽象方法");?
?????}
}
public class TestA{
? ? ?public static void main(){
? ? ? ? ?A a ;//正確,抽象類可以用來引用
? ? ? ? ? a = new A();//錯誤,A抽象類,抽象類不能用來創建對象
? ? ? ? ? a = new B();//正確
? ? ? ? ? a.a2();//正確
?????}
}
抽象類最大的作用就是,定義功能,具體實現由子類實現。
其充分體現了共性放在父類,這個基本原則里。抽象和多態是聯系緊密的,其思想大家可以參考JAVA三大特性。
限于文章篇幅原因,這里僅僅介紹冰山一角。由于筆者的水平有限,編寫時間也很倉促,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。
以上內容希望對大家有所幫助。歡迎討論,共同進步。
轉載于:https://blog.51cto.com/zhangdongxu/1920716
總結
以上是生活随笔為你收集整理的3分钟弄明白JAVA三大修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀Magic Vs系列连续两月销量份额
- 下一篇: 安装漂亮的Faenza1.3与Faien