1. 程式人生 > >Java筆記丨14 修飾符

Java筆記丨14 修飾符

修飾符

  • 修飾符(modifiers)分為兩類

訪問修飾符(access modifiers)

如public/private等

其他修飾符

如abstract等

  • 可以修飾類,也可以修飾類的成員(欄位、方法)

 

訪問修飾符

1.成員的訪問控制符(許可權修飾符)

 

同一個類中

同一個包中

不同包中的子類

不同包中的非子類

private

 

 

 

預設

 

 

protected

 

public

 

2.類的訪問控制符

在定義類時,也可以用訪問控制符。

類的訪問控制符或者為public,或者預設

  • 若使用public,其格式為:

public class 類名{

……

}

  • 如果類用public修飾,則該類可以被其他類所訪問
  • 如果用預設訪問控制符,則該類只能被同包中的類訪問

 

setter與getter

將欄位用private修飾,從而更好地講資訊進行封裝和隱藏

用setXXX和getXXX方法對類的屬性進行存取,分別稱為setter與getter

這種方法有以下優點

(1)屬性用private更好地封裝和隱藏,外部類不能隨意存取和修改

(2)提供方法來存取物件的屬性,在方法中可以對給的引數的合法性進行檢驗

(3)方法可以用來給出計算後的值

(4)方法可以完成清理資源、設定狀態等必要工作

(5)只提供getXXX方法,而不提供setXXX方法,可以保證屬性是隻讀的

示例:

class Person2{

    private int age;

    public void setAge(int age){

        if(age>0&&age<200) this.age=age;

    }
    
    public int getAge(){

        return age;

    }

}

 

非訪問控制符

 

基本含義

可修飾

成員

區域性變數

static

靜態的、非例項的、類的

可修飾內部類

 

final

最終的、不可改變的

abstract

抽象的、不可例項化的

 

 

static

1.static欄位

  • 靜態欄位最本質的特點是:

它們是類的欄位,不屬於任何一個物件例項

  • 它不儲存在某個物件例項的記憶體空間中,而是儲存在類的記憶體區域的公共儲存單元
  • 類變數可以通過類名直接訪問,也可以通過例項物件來訪問,兩種方法的結果是相同的
  • 如System類的in和out物件,就屬於類的域,直接通過類名來訪問,即System.in和System.out。

示例:

在類Person中可以定義一個類域為totalNum:

class Person{

    static long totalNum;

    int age;

    String Name;

}

totalNum代表人類的總人數,它與具體物件例項無關。可以有兩種方法來訪問:Person.totalNum和p.totalNum(假定p是Person物件)

在一定意義,可以用來表示全域性變數

 

2.static物件

  • 用static修飾符修飾的方法僅屬於類的靜態方法,又稱為類方法
  • 與此相對,不用static修飾的方法,則為例項方法
  • 類方法的本質是該方法屬於整個類,不是屬於某個例項的
  • 宣告一個方法為static有以下幾重含義

(1)非static的方法是屬於某個物件的方法,在這個物件建立時,物件的方法在記憶體中擁有自己專用的程式碼段。而static的方法是屬於整個類的,它在記憶體中的程式碼將隨著類的定義而進行分配和裝載,不被任何一個物件專有。

(2)由於static方法是屬於整個類的,所以它不能操縱和處理屬於某個物件的成員變數,而只能處理屬於整個類的成員變數,即static方法只能處理本類中的static域或呼叫static方法

(3)static方法中,不能訪問例項變數,不能使用this或super

(4)呼叫這個方法時,應該使用類名直接呼叫,也可以用某一具體的物件名

如:Math.random(),Integer.parseInt()等就是類的方法,直接用類名進行訪問

 

3.import static

import static 實際上是import的一種更強的寫法。引用一個類(前提是這個類所有的成員都是static的)。在JDK1.5以後才可以用。

import static java.lang.System.*;

out.println();表示System.out.println();

 

final

1.final類

如果一個類被final修飾符所修飾和限定,說明這個類不能被繼承,即不可能有子類

2.final方法

final修飾符所修飾的方法,是不能被子類所覆蓋的方法

3.final欄位及final區域性變數

final欄位、final區域性變數(方法中的變數)

它們的值一旦給定,就不能更改

只讀量,它們能且只能被賦值一次,而不能被賦值很多次

一個欄位被static final兩個修飾符同時所限定時,它可以表示常量

如:Integer.MAX_VALUE(表示最大整數)、Math.PI(表示圓周率)

關於賦值

在定義static final域時,若不給的初始值,則按預設值進行初始化(數值為0;boolean型為false,引用型為null)

在定義final欄位時,若不是static域,則必須且只能賦值一次,不能預設

這種域的賦值方式有兩種:一是在定義變數時賦初始值,二是在每一個建構函式中進行賦值

在定義final區域性變數時,也必須且只能賦值一次。它的值可能不是常量,但它的取值在變數存在期間不會改變

 

abstract

1.abstract類

凡是用abstract修飾符修飾的類被稱為抽象類

抽象類不能被例項化

2.abstract方法

被abstract所修飾的方法叫抽象方法,抽象方法的作用在為所有子類定義一個統一的介面。對抽象方法只需要宣告,而不需要實現,即用分號(;)而不是{},格式如下:

abstract returnType abstractMethod([paramlist]);

抽象類中可以包含抽象方法,也可以不包含抽象方法。但是一旦某個類中包含了抽象方法,則這個類必須宣告為抽象類

抽象方法在子類中必須被實現,否則子類仍然是abstract的