Java基礎--10.final,static,權限修飾符
一. final
1.1 概述
那麼我們能不能隨意的繼承API中提供的類,改寫其內容呢?顯然這是不合適的。爲了避免這種隨意改寫的情況,Java提供了 final 關鍵字,用於修飾不可改變內容。
final: 不可改變。可以用於修飾類、方法和變量。
類:被修飾的類,不能被繼承。
方法:被修飾的方法,不能被重寫。
變量:被修飾的變量,不能被重新賦值。
1.2 使用方式
1.2.1 修飾類
final修飾的類,不能被繼承。
final class 類名 {
}
查詢API發現像 public final class String 、 public final class Math 、 public final class Scanner
等,很多我們學習過的類,都是被final修飾的,目的就是供我們使用,而不讓我們所以改變其內容。
1.2.2 修飾方法
final修飾的方法,不能被重寫。
修飾符 final 返回值類型 方法名(參數列表){
//方法體
}
1.2.3 修飾變量
1.2.3.1 局部變量
1.基本類型
基本類型的局部變量,被final修飾後,只能賦值一次,不能再更改。
public class FinalDemo1 {
public static void main(String[] args) {
// 聲明變量,使用final修飾
final int a;
// 第一次賦值
a = 10;
// 第二次賦值(錯誤)
a = 20; // 報錯,不可重新賦值
// 聲明變量,直接賦值,使用final修飾
final int b = 10;
// 第二次賦值
b = 20; // 報錯,不可重新賦值
}
}
錯誤示例:(同一個變量不能再複製)
final int c = 0;
for (int i = 0; i < 10; i++) {
c = i;
System.out.println(c);
}
正確示例:不同的變量
for (int i = 0; i < 10; i++) {
final int c = i;
System.out.println(c);
}
2.引用類型
引用類型的局部變量,被final修飾後,只能指向一個對象,地址不能再更改。但是不影響對象內部的成 員變量值的修改.
public class FinalDemo2 {
public static void main(String[] args) {
// 創建 Person 對象
final Person p = new Person();
// 創建 另一個 Person對象
p = new Person(); // 報錯,指向了新的對象,地址值改變。
// 修改對象成員變量的值,可以修改
p.name("張三");
}
}
1.2.3.2 成員變量
成員變量涉及到初始化的問題,初始化方式有兩種,只能二選一:
a.顯示初始化(在定義成員變量的時候立馬賦值);
public class Student {
final int num = 10;
}
b.構造方法初始化(在構造方法中賦值一次);
public class Student {
final int num = 10;
final int num2;
public Student() {
this.num2 = 20;
}
}
備註:被final修飾的常量名稱,一般都有書寫規範,所有字母都大寫
二. static
2.1 概述
關於 static 關鍵字的使用,它可以用來修飾的成員變量和成員方法,被修飾的成員是屬於類的,而不是單單是屬於某個對象的。也就是說,既然屬於類,就可以不靠創建對象來調用了。
2.2 定義和使用格式
2.2.1 靜態變量
當 static 修飾成員變量時,該變量稱爲靜態變量。該類的每個對象都共享同一個類變量的值。任何對象都可以更改該類變量的值,但也可以在不創建該類的對象的情況下對類變量進行操作。
**靜態變量:**使用 static關鍵字修飾的成員變量。
static 數據類型 變量名;
public class Chinese {
String name;
int age;
static String country;
public Chinese() {
}
public Chinese(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age + "," + country);
}
}
//測試類
public class Demo08 {
public static void main(String[] args) {
// 類名.靜態成員變量名
Chinese.country = "中國";
System.out.println(Chinese.country);
Chinese c1 = new Chinese("范冰冰", 20);
c1.country = "中國";
c1.show(); // 范冰冰, 20, 中國
}
}
**static修飾成員變量好處:**static修飾的成員變量會存儲在靜態區,只有一份,節省內存,可以使用類名調用。
2.2.2 靜態方法
當 static 修飾成員方法時,該方法稱爲靜態方法 。靜態方法在聲明中有 static ,建議使用類名來調用,而不需要創建類的對象。調用方式非常簡單。
**靜態方法:**使用 static關鍵字修飾的成員方法,習慣稱爲靜態方法。
修飾符 static 返回值類型 方法名 (參數列表) {
// 執行語句
}
靜態方法調用的注意事項:
靜態方法可以直接訪問靜態變量和靜態方法。
靜態方法不能直接訪問普通成員變量或成員方法。反之,成員方法可以直接訪問靜態變量或靜態方法。
靜態方法中,不能使用this關鍵字。
備註:靜態方法只能訪問靜態成員
2.2.3 調用格式
被static修飾的成員可以並且建議通過類名直接訪問。雖然也可以通過對象名訪問靜態成員。
// 訪問類變量
類名.類變量名;
// 調用靜態方法
類名.靜態方法名(參數);
//對象名調用
類型 對象名 = new 類型();
對象名.類變量名;
對象名.靜態方法名(參數);
2.2.4 靜態代碼塊
靜態代碼塊:定義在成員位置,使用static修飾的代碼塊{ }。
位置:類中方法外。
執行:隨着類的加載而執行且執行一次。
public class ClassName {
static {
// 執行語句
}
}
給靜態變量進行初始化賦值:
public class Game {
public static int number;
public static ArrayList<String> list;
static {
// 給類變量賦值
number = 2;
list = new ArrayList<String>();
// 添加元素到集合中
list.add("張三");
list.add("李四");
}
}
static 關鍵字,可以修飾變量、方法和代碼塊。在使用的過程中,其主要目的還是想在不創建對象的情況
下,去調用方法。
三. 權限修飾符
3.1 概述
在Java中提供了四種訪問權限,使用不同的訪問權限修飾符修飾時,被修飾的內容會有不同的訪問權限,
public:公共的。
protected:受保護的
default:默認的
private:私有的
public > protected > default > private
3.2 不同權限的訪問能力
public | protected | default | private | |
---|---|---|---|---|
同一類中 | true | true | true | true |
同一包中(子類與無關類) | true | true | true | |
不同包的子類 | true | true | ||
不同包的無關類 | true |