java的访问权限修饰符有四种,按由小到大的顺序依次是private,default,protected,public,我们用一个表格先来看一下所有的访问权限,接下来再挑重点的解释一下。
一.private
private是最小的访问权限控制符,其修饰的成员变量、构造方法和普通方法只能在定义它们的类中被操作或使用:
public class Father {
private int age=10;
public static void main(String[] args) {
System.out.println(new Father().age);
}
}
二.friendly友好的
默认(友好的)修饰比private要大,它修饰的成员变量、构造方法和普通方法不仅可以在其定义类中使用,还可以在与定义类同包的其它类中调用,继承与非继承均可:
//同一个包
//当两个类为非继承关系
package com.ghj.test;
public class Father {
int age=10;
}
package com.ghj.test;
public class Son{
public static void main(String[] args) {
System.out.println(new Father().age);
}
}
三.protected
protected的使用范围比友好的还要大一点,它修饰的成员变量、构造方法和普通方法不仅可以在同包中使用,还可以在不同包中使用,但前提是只能在定义类的子类中使用:
//不同包中的继承关系
package com.ghj.test;
public class Father {
protected int age=10;
}
package com.ghj.tool;
import com.ghj.test.Father;
public class Son extends Father{
public static void main(String[] args) {
System.out.println(new Son().age);
}
}
但是在不同包中使用分两种情况:
1.非静态
如果protected修饰的属性和方法均为非静态的,则只能通过子类的对象调用继承过来的属性和方法,而不能使用父类的对象去调用,也就是说以下代码便会报错,因为age是非静态的,而main方法中创建了父类的对象,所以调用age时便会出错:
//不同包中的继承关系
package com.ghj.test;
public class Father {
protected int age=10;
}
package com.ghj.tool;
import com.ghj.test.Father;
public class Son extends Father{
public static void main(String[] args) {
System.out.println(new Father().age);
}
}
2.静态
如果protected修饰的属性和方法均为静态的,则子类既可以通过父类和子类的对象调用,也可以通过类名直接调用:
//不同包中的继承关系
package com.ghj.test;
public class Father {
protected static int age=10;
}
package com.ghj.tool;
import com.ghj.test.Father;
public class Son extends Father{
public static void main(String[] args) {
System.out.println(Father.age);
}
}
以上三段的代码运行结果都如下:
四.public
public是访问权限修饰符中最大的,无论是否是一个包内的,无论是否是继承关系,只要是一个工程里的,就可以调用