標籤:extend 編譯 name script void 情況 許可權 ble 編譯報錯
我們經常用著四種修飾符去修飾變數、方法和類,但是這四種的範圍都一樣嗎? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具體的範圍是哪些範圍。先對其四種進行說明再通過案例進行證明:
public:具有最大存取權限。 可以被同一項目下的任何類所調用,一般用於對外的情況。
protected:與public不同的是不同包下的類是不能使用的,但是其子孫類除外。所以我認為這是特意為子類設計的。
default:它是針對本包設計的,它所修飾的在本包下的其他類都訪問。
private:只為類本身提供。是一種封裝的體現。
案例:先聲明一個類,可以供子類繼承。
package com.yuanfy.test.scope1;/** * @Description: 父類,其中有四種修飾符所修飾的變數和方法 * @author yuanfy * @date 2017年12月8日 下午5:04:35 */public class Person { private String name; int age; protected String color; public Person(){} public Person(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } public void say(){ System.out.println(this.name + " say: I am " + this.color + " Person"); }}
測試1:同包下面測試 四種範圍,從中可以看出private不支援在同包下的其他類使用,其他三種是支援在同包下其他類調用的。
package com.yuanfy.test.scope1;/** * @Description: 同包下面測試 四種範圍 * @author yuanfy * @date 2017年12月8日 下午5:11:12 */public class PersonTest { public static void main(String[] args) { Person person = new Person("James", 32, "red"); System.out.println("name:" + person.name);//編譯報錯,所以private修飾的 是不能在同包下的其他類訪問 System.out.println("age:" + person.age);// default System.out.println("color:" + person.color);//protected person.say();//public }}
測試2:在子孫類下測試 四種範圍(不同包的情況下,同包相當於測試1),從下面測試代碼中可以看出:private和default所修飾的,不支援在子孫類下調用的,其他兩種是支援在子孫類下調用的。
1 package com.yuanfy.test.scope2; 2 import com.yuanfy.test.scope1.Person; 3 /** 4 * @Description: 在子孫類下測試 四種範圍 5 * @author yuanfy 6 * @date 2017年12月8日 下午5:24:30 7 */ 8 public class BlackPerson extends Person{ 9 10 public BlackPerson(String name, int age) {11 super(name, age, "black");12 }13 public static void main(String[] args) {14 BlackPerson person = new BlackPerson("James", 32);15 16 System.out.println("name:" + person.name);//private 編譯報錯,所以private修飾的 是不能在不同包下的子孫類訪問17 System.out.println("age:" + person.age);// default 編譯報錯,所以default修飾的 是不能在不同包下的子孫類訪問18 System.out.println("color:" + person.color);//protected 19 person.say();//public20 }21 }
測試3:不同包下面測試 四種範圍,從下面測試案例中可以看到只有public才支援不同包下的其他類(子孫類除外)調用,其他三種都不支援。
1 package com.yuanfy.test.scope2; 2 3 import com.yuanfy.test.scope1.Person; 4 5 /** 6 * @Description: 不同包下面測試 四種範圍 7 * @author yuanfy 8 * @date 2017年12月8日 下午5:11:12 9 */10 public class PersonTest2 {11 public static void main(String[] args) {12 Person person = new Person("James", 32, "red");13 14 System.out.println("name:" + person.name);//private 編譯報錯,所以private修飾的 是不能在其他包下的任何類訪問(除了自身)15 System.out.println("age:" + person.age);// default 編譯報錯,所以default修飾的 是不能在其他包下訪問的。16 System.out.println("color:" + person.color);//protected 編譯報錯,所以default修飾的 是不能在其他包下訪問的。17 person.say();//public18 }19 }
所以經過上面案例分析可以得出他們分別對應有效範圍,如下表:
範圍 |
當前類 |
同一包內 |
子孫類(不同包) |
其他包 |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
default |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
Java關鍵字(一) 修飾符private、protected、public和default的範圍