当存在多包,子包,继承等时。为了保护类、变量、方法体、构造体的访问,所以有了访问控制修饰符。
一、访问控制修饰符
- default(默认,什么都不写):对同一包内的类与子孙类可见,对其他包的类与子孙类不可见。
- public:对同一包与不同包都能访问。
- private:只对当前类可见。对同一包与不同包的其他类不可见。
- protected:接下来重点解释下。
二、protected的使用
1、创建ProtectedTest.java
package com.protectedtest; public class ProtectedTest { protected void test(){ System.out.println("my is father protected method"); } public static void main(String []args) { System.out.println("test start !"); } }
这里对方法test()用protected来修饰。然后编译ProtectedTest.java:
javac -d . ProtectedTest.java
2、创建ProtectedTestTwo.java
package com.protectedtest; public class ProtectedTestTwo extends ProtectedTest{ public static void main(String[] args){ /* 子类实例可以访问自身继承的test方法 */ ProtectedTestTwo getTest = new ProtectedTestTwo(); getTest.test(); /* 子类可以访问父类实例的test方法 */ ProtectedTest getTest2 = new ProtectedTest(); getTest2.test(); } }
运行ProtectedTestTwo.java
javac -d . ProtectedTestTwo.java java com.protectedtest.ProtectedTestTwo
结果如下:
可以得出:在同一包内的任何其他类都能访问被声明为protected的对象、方法、构造体、变量。
3、创建ProtectedTestThree.java
package com.protectedtestthree;
import com.protectedtest.ProtectedTest;
public class ProtectedTestThree extends ProtectedTest{
public static void main(String[] args){
/* 子类实例可以访问自身继承的test方法!*/
ProtectedTestThree getTest = new ProtectedTestThree();
getTest.test();
/* 编译会错误! 子类不可以访问父类实例的test方法!
ProtectedTest getTest2 = new ProtectedTest();
getTest2.test();
*/
}
}
运行ProtectedTestThree.java
javac -d . ProtectedTestThree.java java com.protectedtestthree.ProtectedTestThree
结果如下:
可以看到子类实例可以访问自身继承的test方法,而不能直接访问父类的实例的test方法。
三、注意点
- 父类中声明为 public 的方法在子类中只能声明为 public。
- 父类中声明为 protected 的方法在子类中不能声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
- private与protected修饰符不能修饰类。