一、展示protected方法具有包访问权限,但是它仍旧不是public的。
package com.springboot.demo; public class Human { protected void doHouseWork() { System.out.println("---------Human Do housework---------"); } }
package com.springboot.demo; public class Main { public static void main(String[] args) { // same package:public、protected、default Human human = new Human(); human.doHouseWork(); } }
返回:
---------Human Do housework---------
二、创建一个带有public,private,protected和包访问权限域以及方法成员的类。创建该类的一个对象,看看你在试图调用所有类成员时,会得到什么类型的编译信息。请注意,处于同一个目录中的所有类都是默认包的一部分。
package com.springboot.demo; public class Human { private String msg0="Human Garden of Eden"; String msg1="Human Do laundry"; protected String msg2="Human Do housework"; public String msg3="Human Eat"; private void secret(String msg){ System.out.println("---------" + msg + "---------"); } void doLaundry(String msg){ System.out.println("---------" + msg + "---------"); } protected void doHouseWork(String msg){ System.out.println("---------" + msg + "---------"); } public void eat(String msg){ System.out.println("---------" + msg + "---------"); } }
package com.springboot.demo; public class Main { public static void main(String[] args) { // same package:public、protected、default Human human = new Human(); human.doLaundry(human.msg1); human.doHouseWork(human.msg2); human.eat(human.msg3); } }
返回:
---------Human Do laundry--------- ---------Human Do housework--------- ---------Human Eat---------
三、创建一个带有protected数据的类。运用在第一个类中处理protected数据的方法在相同的文件中创建第二个类。
package com.springboot.demo.protectedPackage; public class ProtectedClass { protected String classMsg = "protected object"; protected void protectedMethod(String msg) { System.out.println("---------" + msg + "---------"); } }
package com.springboot.demo.protectedPackage; public class SamePackageClass { public ProtectedClass protectedClass = new ProtectedClass(); public void samePackageMethod(){ protectedClass.protectedMethod("same package class transfer " + protectedClass.classMsg); } }
package com.springboot.demo; import com.springboot.demo.protectedPackage.SamePackageClass; public class Main { public static void main(String[] args) { SamePackageClass obj = new SamePackageClass(); obj.samePackageMethod(); } }
返回:
---------same package class transfer protected object---------
四、效仿示例Lunch.java的形式,创建一个名为ConnectionManager的类,该类管理一个元素为Connection对象的固定数值。客户端程序员不能直接创建Connection对象,而只能通过ConnectionManager中的固定数组。客户端程序员不能直接创建Connection对象,而只能通过ConnectionManager中的某个static方法来获取它们。当ConnectionManager之中不再有对象时,它会返回null引用。在main()之中检测这些类。
Lunch.java源码:
public class Lunch { void testPrivate() { } void testStatic() { Soup1 soup1 = Soup1.makeSoup(); } void testSingleton() { Soup2.access().f(); } } class Soup1 { private Soup1() { } public static Soup1 makeSoup() { return new Soup1(); } } class Soup2 { private Soup2() { } private static Soup2 soup = new Soup2(); public static Soup2 access() { return soup; } public void f() { } }
ConnectionManager
public class ConnectionManager { private static Connection[] connectionArray = new Connection[3]; static { for (int i = 0; i < connectionArray.length; i++) { connectionArray[i] = Connection.makeConnection(); } } public static Connection[] getConnectionArray(){ return connectionArray; } } class Connection { private static Connection connection; private Connection() {} public static Connection makeConnection() { return new Connection(); } }
public class Main { public static void main(String[] args) { ConnectionManager manager = new ConnectionManager(); for (Connection c : manager.getConnectionArray()) { System.out.println(c); } } }
返回:
com.springboot.access.Connection@68837a77 com.springboot.access.Connection@6be46e8f com.springboot.access.Connection@3567135c
单例的ConnectionManager,main()不变。
public class ConnectionManager { private static Connection[] connectionArray = new Connection[3]; static { for (int i = 0; i < connectionArray.length; i++) { connectionArray[i] = Connection.makeConnection(); } } public static Connection[] getConnectionArray(){ return connectionArray; } } class Connection { private static Connection connection = new Connection(); private Connection() {} public static Connection makeConnection() { return connection; } }
返回:
com.springboot.access.Connection@68837a77
com.springboot.access.Connection@68837a77
com.springboot.access.Connection@68837a77