一、private、protected、public和default的作用域
我們經常用着四種修飾符去修飾變量、方法和類,但是這四種的作用域都一樣嗎? 其中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();//public 20 } 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();//public 18 } 19 }
所以經過上面案例分析可以得出他們分別對應有效的作用域,如下表:
作用域 | 當前類 | 同一包內 | 子孫類(不同包) | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |