参考文档
https://www.runoob.com/java/java-modifier-types.html#protected-desc
访问控制修饰符
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
-
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
-
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
-
public : 对所有类可见。使用对象:类、接口、变量、方法
-
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
我们可以通过以下表来说明访问权限:
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | Y/N(说明) | N |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |
默认访问修饰符-不使用任何关键字
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。
1.类上的访问修饰符为public ,或者不写,不能加其他访问修饰符(除非有些内部类)。
如:public class People {
private static String name="xiaMing";
}
则项目中的所有类中都可以去访问,如 new People(), People.name, extends People的访问操作;
如果去掉public 则只能在同胞类中进行上述访问。
2.通常设计的类访问修饰符都为public,下面的对类成员访问权限的描述也这样默认。
访问权限的范围为,从近到远,本类,同包类(包括同包子类),非同包类。
从上表可以看出,public,protected,default,修饰的成员(包括方法,属性)如果在同一个包里,是可以相互访问的。而privated只在本类中可以访问。
什么叫做属性的可访问?
首先privated 就最容易测试出来,
public class People {
private int age = 999;
}
通过由于被private修饰,new People().age的方式无法访问。可以通过People另外提供的非private方法获取。
3.protected 测试
下面做两个测试,分别对protectied 的非同包子类,和非同包非子类做测试。
protected 需要从以下两个点来分析说明:
-
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
-
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
基类
package java_basic.stuInnerClass;//注意基类包名 public class People {
public class People {
protected String showMessage(){
return "say good by";
}
}
eg1:子类与基类在同一包中,的问题直接归并为protect 的同胞类中。
子类
package java_basic.stuInnerClass;//注意包名与基类是相同的
public class Main extends People {
public void method() {
new People().showMessage();
new Main().showMessage();
}
}
eg2: 子类与基类不同包,且基类目标方法被protected 访问修饰符修饰。
子类
package java_basic.other;//注意包名与基类是不同的
import java_basic.stuInnerClass.People;
public class Main extends People {
public void method() {
//new People().showMessage();//报错 不能访问基类实例的protected方法
new Main().showMessage();//可访问
}
}
其实属性的访问,要么就是根据对象,要么就是根据类名点。一般情况这个类指的是被访问的属性(方法)的类,对象指的是被访问属性(方法)的对象。
再测试一下default,基类成员默认,则非同包类(包括子类非同包类)中是没有访问权限的。
基类
package java_basic.stuInnerClass;//主要包名
public class People {
static void md(){//默认defalt,//类名点的访问方式
System.out.println("protected 方法");
}
}
非同包类
public class Main extends People {
public void method() {
People.md();//报错
Main.md();//报错
}
}