本文原創首發CSDN,本文鏈接https://blog.csdn.net/qq_41464123/article/details/107461710 ,作者博客https://blog.csdn.net/qq_41464123 ,轉載請帶上本鏈接,謝謝配合。
目錄
零、前言
Java是一門當今最火的編程語言之一,擁有很多現成可用的庫,在我們編程生涯中,有着無比重要的地位。
Java中有個概念叫做訪問權限。它們是什么呢?今天我來詳細講解。
本文所有代碼已經上傳CSDN下載模塊,下載地址,也可以在文章下方的評論區找我要,謝謝!
一、構造方法
1.1 簡易版類的實例化
在內部類中,會涉及到訪問權限的概念;而在訪問權限中,會涉及到構造方法的概念,所以我們先來學習什么是構造方法。
我們先來編寫一個最簡單的類 —— 人,並且不用Java的封裝。
public class People {
String name;
int age;
}
人有兩個屬性,分別是名字name和年齡age。
接着編寫一個主函數,實例化這個類,並且輸出它的屬性。
public class Main {
public static void main(String[] args) {
People people = new People();
people.name = "ZWZ";
people.age = 18;
System.out.println("姓名 = " + people.name + ", 年齡 = " + people.age);
}
}
輸出結果如下圖所示:
很好,那么我們如果要實例化五個類呢?很簡單,我們寫五遍就好了
public class Main {
public static void main(String[] args) {
People people1 = new People();
people1.name = "ZWZ01";
people1.age = 18;
People people2 = new People();
people2.name = "ZWZ02";
people2.age = 18;
People people3 = new People();
people3.name = "ZWZ03";
people3.age = 18;
People people4 = new People();
people4.name = "ZWZ04";
people4.age = 18;
People people5 = new People();
people5.name = "ZWZ05";
people5.age = 18;
System.out.println("姓名 = " + people1.name + ", 年齡 = " + people1.age);
System.out.println("姓名 = " + people2.name + ", 年齡 = " + people2.age);
System.out.println("姓名 = " + people3.name + ", 年齡 = " + people3.age);
System.out.println("姓名 = " + people4.name + ", 年齡 = " + people4.age);
System.out.println("姓名 = " + people5.name + ", 年齡 = " + people5.age);
}
}
1.2 使用構造方法實例化類
那么聰明的你又沒有想過,能不能簡化對類的實例化操作呢?
當然可以!這就需要用到構造方法。
我們現在People.java類中添加構造方法,構造函數訪問權限默認即可
public class People {
String name;
int age;
People(String name,int age){
this.name = name;
this.age = age;
}
}
這個時候,People類自帶的無參構造方法就失效了。
PS:當你沒有為類寫構造方法時,系統會默認給你安排一個無參的構造方法,當你自己寫了構造方法之后,系統自帶的就會消失。
接着我們在主函數實例化類的時候,傳入參數就可以了,代碼是不是簡單了很多?
public class Main {
public static void main(String[] args) {
People people1 = new People("ZWZ01",18);
People people2 = new People("ZWZ01",18);
People people3 = new People("ZWZ01",18);
People people4 = new People("ZWZ01",18);
People people5 = new People("ZWZ01",18);
System.out.println("姓名 = " + people1.name + ", 年齡 = " + people1.age);
System.out.println("姓名 = " + people2.name + ", 年齡 = " + people2.age);
System.out.println("姓名 = " + people3.name + ", 年齡 = " + people3.age);
System.out.println("姓名 = " + people4.name + ", 年齡 = " + people4.age);
System.out.println("姓名 = " + people5.name + ", 年齡 = " + people5.age);
}
}
這就是構造方法。
當然你也可以把輸出信息放在構造方法內部,那也完全可以,就像這樣:
public class People {
String name;
int age;
People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年齡 = " + this.age);
}
}
主函數就直接做實例化操作即可。
public class Main {
public static void main(String[] args) {
People people1 = new People("ZWZ01",18);
People people2 = new People("ZWZ01",18);
People people3 = new People("ZWZ01",18);
People people4 = new People("ZWZ01",18);
People people5 = new People("ZWZ01",18);
}
}
總結起來一句話!構造方法就是在我們實例化類的時候,給類的指定變量賦值、執行指定方法。
本文原創首發CSDN,本文鏈接https://blog.csdn.net/qq_41464123/article/details/107461710 ,作者博客https://blog.csdn.net/qq_41464123 ,轉載請帶上本鏈接,謝謝配合。
二、Java的訪問權限
在講內部類之前,必須要理解Java的訪問權限。
Java語言采用訪問控制修飾符,來控制類、成員方法、成員變量的訪問權限,共分為以下四個級別:
(1)public 公開,對外部訪問不做限制。
(2)protected保護,只對子類和同一個包下的類公開。
(3)默認級保護,不加修飾符,只對同一個包下的類公開。
(4)private私有保護,只有自己才能訪問,不對外公開。
其中:以上訪問級別只適用於類和類的成員,不適用於局部變量。
成員變量、成員方法、構造方法都可以使用上面的四種訪問級別。
先把結論寫出來,后面一一證明。
private | 默認 | protected | public | |
---|---|---|---|---|
同一類的成員 | √ | √ | √ | √ |
同一個包的其他類(包括子類) | × | √ | √ | √ |
不同包的子類 | × | × | √ | √ |
不同包的非子類 | × | × | × | √ |
在第一塊已經講解了Java的構造方法,我們就以構造方法為例,講解Java的訪問權限
2.1 public 公開
首先是public 公開,我們將People類的構造方法的訪問權限定義為public
public class People {
String name;
int age;
public People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年齡 = " + this.age);
}
}
用自己包下的測試函數,跑一波
public class Main {
public static void main(String[] args) {
People people = new People("ZWZ01",18);
}
}
發現沒毛病,可以正常實例化People類。
總結:使用public修飾訪問權限,所有類都可以訪問到此構造方法。
2.2 protected保護
我們在cn.ypc(下面簡稱A包)的People的構造方法,改成 protected 類型
package cn.ypc;
public class People {
String name;
int age;
protected People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年齡 = " + this.age);
}
}
測試A包下的主函數
package cn.ypc;
public class Main {
public static void main(String[] args) {
People people = new People("ZWZ01",18);
}
}
發現可以正常實例化
接着測試cn.yy包(以下簡稱B包)下的測試函數
IDE報錯了,以我的英語水平都能看出來,按照中文式翻譯方法
The constructor People(String, int) is not visible
這個 結構體(類) People(String, int) 是 不 可見的
聰明的讀者明白了吧?B包的測試函數無法讀取A包People的構造方法。
同理,如果是People的子類,能不能訪問到 protected權限的構造方法呢?
我們在A包下,創建一個Student學生類,繼承自People父類。代碼如下所示
package cn.ypc;
public class Student extends People{
protected Student(String name, int age) {
super(name, age);
}
}
接着在A包的測試類中,進行對Student學生類的實例化。
package cn.ypc;
public class Main {
public static void main(String[] args) {
Student student = new Student("ZWZ01",18);
}
}
可以正常輸出!
總結:只對子類,或者同一包下的類公開構造方法。(注意子類並不一定在一個包下)
2.3 系統默認
現在People類創建在A包下,我們在B包下創建一個People的子類——Student類。
翻譯一下,就是 People 類沒有默認的構造方法,必須要自己定義一個構造方法
當我們自動填寫父類的構造方法的時候,IDE又報錯了,類似之前的錯誤,也是構造方法找不到的問題。
所以,可以得出結論:在系統默認的訪問權限下,對同一個包公開,對不同包不公開。
總結:系統默認情況下,只對同一包下的類公開構造方法。
系統默認與protected不同的是,如果其子類不在同一包下,那么這個子類就不能訪問父類的構造方法。
2.4 private私有保護
如果我們把A包的People類構造方法改為private私有
package cn.ypc;
public class People {
String name;
int age;
private People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年齡 = " + this.age);
}
}
看!首先是本包下的子類引用父類的構造方法,就報錯了,說是找不到構造方法
接着是本包下的測試類調用People的構造方法,也不行!
那么如果是別的包下的測試類,那也一樣找不到構造方法。
總結:如果被private修飾,那么這個構造方法只能被自己所用,不能被其他類所調用。
三、總結
1.構造方法:就是在我們實例化類的時候,給類的指定變量賦值、執行指定方法。
2.public:使用public修飾訪問權限,所有類都可以訪問到此構造方法。
3.protected:只對子類,或者同一包下的類公開構造方法。(注意子類並不一定在一個包下)
4.系統默認:與protected不同的是,如果其子類不在同一包下,那么這個子類就不能訪問父類的構造方法。
5.private:如果被private修飾,那么這個構造方法只能被自己所用,不能被其他類所調用。
Java的成員變量、成員方法、構造方法的訪問級別可以是上面的任意一個,一般使用 public (公開)和 private (私有)會比較多。