关于java访问修饰符的几个测试(jdk1.8)

时间:2022-05-17 21:06:55
变量和方法的访问修饰符有:public、protected、default(无修饰符)、private,先贴一下比较公认的访问权限。
访问权限     类   包  子类  其他包
public          ∨   ∨   ∨     ∨
protected    ∨   ∨   ∨     ×
default         ∨   ∨   ×      ×
private         ∨    ×    ×      ×

下面是自己的测试,注释的语句均为编译不通过,变量和方法带1的为public修饰,带2为protected修饰,3为default,4为private

package test1;

public class Jiekou{
public String s1="A";
protected String s2="B";
String s3="C";
private String s4="D";
public static void main(String [] args){
//说明四种访问修饰符都能被本类访问
new Jiekou().method1();
new Jiekou().method2();
new Jiekou().method3();
new Jiekou().method4();
System.out.println(new Jiekou().s1);
System.out.println(new Jiekou().s2);
System.out.println(new Jiekou().s3);
System.out.println(new Jiekou().s4);
}
public void method1(){
System.out.println("a");
}
protected void method2(){
System.out.println("b");
}
void method3(){
System.out.println("c");
}
private void method4(){
System.out.println("d");
}
}
//Jiekou2类继承Jiekou类
class Jiekou2 extends Jiekou{
public void method5(){
//说明protected和default可以被子类访问,private则不可以
new Jiekou2().method1();
new Jiekou2().method2();
new Jiekou2().method3();//既可以用子类对象也可以用父类对象调用父类default方法
new Jiekou().method3();
//new Jiekou2().method4();
System.out.println(new Jiekou().s1);
System.out.println(new Jiekou().s2);
System.out.println(new Jiekou().s3);//可以访问父类的default变量
System.out.println(new Jiekou2().s3);
//System.out.println(new Jiekou().s4);
}
}
class Jiekou3{
public void method5(){
//即使没有继承关系,只要在同一个包中,也可以访问其他类的protected和default变量和方法
new Jiekou().method1();
new Jiekou().method2();
new Jiekou().method3();
//new Jiekou().method4();
System.out.println(new Jiekou().s1);
System.out.println(new Jiekou().s2);
System.out.println(new Jiekou().s3);
//System.out.println(new Jiekou().s4);

}
}
package youDao;
//不同包
import test1.Jiekou;

public class Jiekou4 extends Jiekou{
public static void main(String[] args){
new Jiekou().method1();
new Jiekou4().method2();//可以通过继承,用子类对象调用不同包的父类protected方法
//new Jiekou4().method3();子类对象不能调用不同包的父类default方法
//new Jiekou().method2();不同包,子类中不能通过父类对象调用父类的protected、default、private方法和变量
//new Jiekou().method3();
//new Jiekou().method4();
System.out.println(new Jiekou().s1);
//System.out.println(new Jiekou().s2);
//System.out.println(new Jiekou().s3);
//System.out.println(new Jiekou().s4);
}
}
class Jiekou5{
public void method1(){
//无继承关系,只能访问public
new Jiekou().method1();
//new Jiekou().method2();
//new Jiekou().method3();
//new Jiekou().method4();
System.out.println(new Jiekou().s1);
//System.out.println(new Jiekou().s2);
//System.out.println(new Jiekou().s3);
//System.out.println(new Jiekou().s4);
}
}

所以,同包中,protected和default都可被子类或其他类访问,不同包中,default修饰的变量和方法无法被子类访问,