目錄
什么是封裝?
什么是訪問限定符?
static靜態修飾符
用static修飾的類變量或類方法的注意事項:
什么是封裝?
封裝是面向對象的三大特性之一,指的是將一個類中的實現細節進行隱藏,對外只提供一些開放的接口而看不見內部的字段,通過訪問限定符來控制對數據的訪問,以此來提高程序的安全性。那么怎么實現封裝呢?通常使用private關鍵字對類中的成員變量進行封裝起來,通過用public方法提供對屬性的訪問和修改:
class Student{//在Student類外面直接訪問是訪問不到private修飾的成員變量的;private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}//不能夠直接訪問字段,而我們可以寫一些方法間接訪問public void setName(String name) {this.name = name;}//獲取name的方法public String getName() {return name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void write(){System.out.println(this.name+"正在寫作業");}
}
public class Test {public static void main(String[] args) {Student student = new Student("張三",10);//寫完setName就可以修改字段了student.setName("小張");//通過getName方法去獲取姓名System.out.println(student.getName());student.write();}
}
運行結果:
什么是訪問限定符?
Java中主要通過類和訪問權限來實現封裝:類可以將數據以及封裝數據的方法結合在一起,而訪問權限用來控制方法或者字段能否直接在類外使用。Java中提供了以下訪問限定符:
范圍 | private | protected | public |
---|---|---|---|
同一包中的同一類 | ? | ? | ? |
同一包中的不同類 | ? | ? | |
不同包中的子類 | ? | ? | |
不同包中的非子類 | ? |
- 訪問權限除了可以限定類中成員的可見性,也可以控制類的可見性?
- 一般情況下成員變量設置為private,成員方法設置為public。
static靜態修飾符
static修飾成員變量:被static修飾的成員變量,它屬于類本身,而不是類的某個對象,稱為類對象;在計算機中只有一份,能被類中的所有對象共享。沒有被static修飾成員變量,它屬于類的每個對象。每個對象在創建時都會擁有自己的一份實例變量。實例變量的內存空間在對象創建時分配,在對象銷毀時釋放。
public class Student {//實例變量,屬于對象,每個對象都有自己的實例變量public String name;public int age;//類變量(靜態變量),屬于類,所有對象共享//當每個Student的教室都是相同的時候需要用到類變量會更加方便一些public static String classRoom = "2-412";public Student(String name, int age) {this.name = name;this.age = age;}public static void main(String[] args) {// 創建兩個Student對象Student s1 = new Student("張三", 18);Student s2 = new Student("李四", 19);//實例化成員變量只能通過先實例對象,對象.成員變量來訪問。System.out.println(s1.name);//靜態成員變量可以直接通過類名訪問System.out.println(Student.classRoom);//也可以通過對象訪問System.out.println(s1.classRoom);}
}
?通過以上的例子可以知道: 類變量可以通過類名.成員變量的方法來直接訪問;當然可以通過實例化個對象,通過對象.成員變量方法來訪問。而只能通過通過實例化個對象,通過對象.成員變量方法來訪問。
被static修飾成員方法:也是一樣的規則,類方法通過類名.成員的方法來直接訪問,也可以通過實例化個對象,通過對象.成員方法來訪問。而只能通過通過實例化個對象,通過對象.成員方法來訪問。
public class Student {// 類變量(靜態變量),屬于類,所有對象共享private static int studentCount = 0;// 實例變量,屬于對象,每個對象都有自己的實例變量private String name;private int age;// 構造方法public Student(String name, int age) {this.name = name;this.age = age;studentCount++; // 每次創建對象時,類變量studentCount自增}// 靜態方法,可以訪問類變量,但不能直接訪問實例變量public static int getStudentCount() {return studentCount;}// 實例方法,可以訪問實例變量和類變量public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);System.out.println("Total students: " + studentCount);}public static void main(String[] args) {// 創建兩個Student對象Student student1 = new Student("Alice", 20);Student student2 = new Student("Bob", 22);// 通過類名訪問類變量 System.out.println("Total students: " + Student.getStudentCount());// 調用實例方法student1.displayInfo();student2.displayInfo();}
}
用static修飾的類變量或類方法的注意事項:
- 在靜態方法的內部 不能使用非靜態的數據成員
- this 不能出現在靜態方法當中