先说几个protected的使用原则,后面再看对应的例子。
- protected 的属性和方法可以在本包和子类访问
- 非同包的子类里面,不能直接使用父类,或者其它包的子类访问
我们看代码,这个是基类
1. package
2.
3. /**
4. * 基类,属性和方法都是protected的。
5. *
6. * @author 赵学庆,Java世纪网(java2000.net)
7. *
8. */
9. public class
10. protected int
11. public int
12. protected int
13. return
14. }
15. }
下面是2个同一个包的测试代码,一个是普通类,1个是子类。
1. package
2.
3. /**
4. * 测试相同包的子类。
5. *
6. * @author 赵学庆,Java世纪网(java2000.net)
7. *
8. */
9. public class TestSamePackageSubClass extends
10. public void
11. new Base(); // 使用基类
12. 0; // 可以访问
13. 1; // 访问protected的属性成功
14. // 访问protected的方法成功
15. }
16.
17. public void
18. 0; // 可以访问
19. 2; // 子类中可以直接用父类的属性
20. // 子类中可以直接用父类的方法
21. }
22. }
1. package
2.
3. /**
4. * 测试相同包的普通类。
5. *
6. * @author 赵学庆,Java世纪网(java2000.net)
7. *
8. */
9. public class
10.
11. public void
12. new Base(); // 使用基类
13. 0; // 可以访问
14. 1; // 访问protected的属性成功
15. // 访问protected的方法成功
16. }
17. }
下面是不同包的普通类和子类测试,一个普通类,2个子类
1. package
2.
3. import
4.
5. /**
6. * 不同包的正常类。
7. *
8. * @author 赵学庆,Java世纪网(java2000.net)
9. *
10. */
11. class
12. public void
13. new Base(); // 使用基类
14. 0; // 可以访问
15. 1; // 访问protected的属性-失败
16. // 访问protected的方法-失败
17. }
18.
19. public void
20. new
21. 0; // 可以访问
22. 3; // 直接访问属性-失败
23. // 直接访问方法-失败
24. }
25. }
1. package
2.
3. import
4. import
5.
6. /**
7. * 不同包的子类1.
8. *
9. * @author 赵学庆,Java世纪网(java2000.net)
10. *
11. */
12. class TestOtherPackageSubClass extends
13. public void
14. new Base(); // 使用基类
15. 0; // 可以访问
16. 1; // 访问protected的属性失败
17. // 访问protected的方法失败
18. }
19.
20. public void
21. 0; // 可以访问
22. 2; // 直接用父类的属性-成功
23. // 直接用父类的方法-成功
24. }
25.
26. public void
27. // 用另外一个package的子类。
28. new
29. 0; // 可以访问
30. 1; // 访问protected的属性-失败
31. // 访问protected的方法-失败
32. }
33.
34. public void
35. // 用另外一个package的子类。
36. new
37. 0; // 可以访问
38. 1; // 访问protected的属性-失败
39. // 访问protected的方法-失败
40. }
41. }
1. package
2.
3. import
4.
5. /**
6. * 不同包的子类2.
7. *
8. * @author 赵学庆,Java世纪网(java2000.net)
9. *
10. */
11. class TestOtherPackageSubClass2 extends
12. }
另一个不同包的子类
1. package
2.
3. import
4.
5. /**
6. * 另一个不同包的子类。
7. *
8. * @author 赵学庆,Java世纪网(java2000.net)
9. *
10. */
11. public class TestOtherPackage2SubClass extends
12.
13. }
总结一下:
- 公共属性总能访问,呵呵,这个不用说了
- 同一包的子类,可以任意使用
- 同一个包的正常类,可以直接用他的实例进行访问
- 不同包的正常类,无法访问任何属性和方法
- 不同包的子类,不能使用父类实例的属性和方法
- 不同包的子类,不能使用其它包的子类实例的属性和方法
- 不同包的子类,可以直接使用父类的属性和方法
总之,不同包的子类就规规矩矩的在自己的代码里用父类的属性就行了。其它的使用都是不允许的。