访问权限从高到低:public、protected、友好的、private
控制成员的可见性和可访问性,局部变量由于其作用域和生命周期的限制,不能使用访问修饰符
- 访问修饰符可以修饰成员内部类,不能修饰局部内部类
- 访问修饰符可以修饰成员变量、成员方法,不能修饰局部变量
一、公共类、友好类
不能使用 protecte、private 修饰类、接口
- 公共类可以被任何类继承,友好类只能被同一包中的类继承
- 公共接口可以被任何类实现,友好接口只能被同一包中的类实现
public class A { } // 公共类 可以在【任何】类中使用公共类创建对象
class A { } // 友好类 只能在【同包】类中使用友好类创建对象
二、private 修饰成员变量
-
类外间接访问private成员变量:定义一对Getter/Setter方法
-
可以在 Setter 方法中验证数据是否合法,确保数据的合理性
// Person类
public class Person {
private int age;
public void setAge(int age) {
this.age = age;
if (age < 0 || age > 130) {
this.age = -1; // 数据错误,赋值为-1
}
}
public int getAge() {
return age;
}
}
三、protected 进一步说明
一个类 A 中的 protected 成员变量和方法可以被它的子孙类继承
B 是 A 的子类,C 是 B 的子类,D 是 C 的子类,B、C 和 D 类都继承 A 类的 protected 成员变量和方法
1、用 D 类在 D 本身中创建一个对象,该对象总是可以通过 “.” 运算符访问继承的 protected 成员
2、用 D 类在 Other 类中创建一个对象,Other 类和 A 类在同一个包中,对象才能访问继承的 protected 成员
// A 类
// protected 成员所在的 “祖先” 类
package com.yuyouyi.test;
public class A {
protected int numA;
protected void methodA() {
System.out.println("method in A...");
}
}
// B 类
package com.yuyouyi.test;
public class B extends A {
}
// C 类
package com.yuyouyi.test;
public class C extends B {
}
// D 类
package com.yuyouyi.test;
public class D extends C {
public void methodD() {
D d = new D();
d.numA = 100;
d.methodA();
}
}
// Other 类
package com.yuyouyi.test.hello;
import com.yuyouyi.test;
public class Other {
public void methodOther() {
D d = new D();
// d.numA = 100;
// 标红报错 'numA' has protected access in 'com.yuyouyi.test.A'
// d.methodA();
// 标红报错 'methodA()' has protected access in 'com.yuyouyi.test.A'
}
}