封装:类的设计者把类设计成一个黑盒子,使用者只能看见类中定义的公共方法,而看不见方法的实现细节,也不能直接对类中的数据进行操作。
根据封装的原则,使用者可以访问类中的部分方法,但不能直接访问成员变量。
Java通过设置访问权限来实现类的封装。
访问修饰符允许的访问级别 如下图所示:
设置类的访问权限
在声明一个类时,可以不用权限修饰符,也可以用public设置类为公有的,不允许使用其他的权限修饰符。
package com.ez;
/**
* 访问修饰符测试类 访问严格级别从低到高 public-->protected-->default(nodecorate)-->private
* 类中的数据称为成员变量,对数据进行的操作称为成员方法。类内部的构成,统称类的成员。
* @author 窗外赏雪(EZ编程网)
*/
public class AccessModifier {
public void testPublic() {
System.out.println("该类成员可被所有类的成员访问");
}
/**
* 不能被其他包的非子类访问,并且非静态成员只能通过子类实例来访问。
* 注意:非静态成员只能通过子类的实例访问。
*/
protected void testProtected() {
System.out.println("该类成员可以被其他包的子类实例访问");
}
protected static void testStaticProtected(){
System.out.println("该类成员可以被其他包的子类访问");
}
void testNoDecorate() {
System.out.println("该类成员能被同一类中的其他成员、或同一包中的其他类访问");
}
private void testPrivate() {
System.out.println("该类成员只能被同一类中的其他成员访问");
}
/**
* private方法只能被自己类的成员访问
*/
public static void main(String[] args) {
AccessModifier am = new AccessModifier();
am.testPrivate();
am.testNoDecorate();
am.testProtected();
am.testPublic();
}
}
同个包下的其他类
package com.ez;
/**
* protected类成员能被同一包下的类成员访问
* default类成员能被同一类中的其他成员、或同一包中的其他类访问
* @author 窗外赏雪(EZ编程网)
*/
public class AccessModifierTest {
public static void main(String[] args) {
AccessModifier am=new AccessModifier();
am.testNoDecorate();
am.testProtected();
am.testPublic();
}
}
同个包下的子类
package com.ez;
/**
* protected类成员能被同一包下的类成员访问。
* default类成员能被同一类中的其他成员、或同一包中的其他类访问
* @author 窗外赏雪(EZ编程网)
*/
public class AccessModifierChildTest extends AccessModifier{
public static void main(String[] args) {
AccessModifier am=new AccessModifier();
am.testNoDecorate();
am.testProtected();
am.testPublic();
}
}
不同包下的其他类
package com.ez.other;
import com.ez.AccessModifier;
/**
* protected不能被其他包的非子类访问,并且非静态成员只能通过子类对象来访问。
* default类成员不能被不同包中的其他类访问
* @author 窗外赏雪(EZ编程网)
*/
public class AccessModifierTest {
public static void main(String[] args) {
AccessModifier am=new AccessModifier();
am.testPublic();
}
}
不同包下的子类
package com.ez.other;
import com.ez.AccessModifier;
/**
* protected不能被其他包的非子类访问,并且非静态成员只能通过子类实例来访问。注意:是子类实例
* default类成员不能被不同包中的其他类访问
* @author 窗外赏雪(EZ编写网)
*/
public class AccessModifierChildTest extends AccessModifier {
public static void main(String[] args) {
AccessModifier am = new AccessModifier();
am.testPublic();
AccessModifierChildTest amc = new AccessModifierChildTest();
amc.testProtected();
}
}