Java 修饰符private、protected、public和default的作用域
private、protected、public和default的作用域
我们经常用着四种修饰符去修饰变量、方法和类,但是这四种的作用域都一样吗? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具体的作用域是哪些范围。先对其四种进行说明再通过案例进行证明:
public:具有最大访问权限。 可以被同一项目下的任何类所调用,一般用于对外的情况。
protected:与public不同的是不同包下的类是不能使用的,但是其子孙类除外。所以我认为这是特意为子类设计的。
default:它是针对本包设计的,它所修饰的在本包下的其他类都访问。
private:只为类本身提供。是一种封装的体现。
二、案例
案例:先声明一个类,可以供子类继承。
package com.yuanfy.test.scope1;
/** 父类,其中有四种修饰符所修饰的变量和方法 **/
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: 同包下面测试 四种作用域
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;
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;
3 import com.yuanfy.test.scope1.Person;
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 | √ | × | × | × |