假设我有 3 个课程
class1
,class2
并且class3
.
我怎样才能让它class1
只能由class2
( class1 object = new class1()
) 实例化,但不能由 class3 或任何其他类实例化?
我认为它应该与修饰符一起使用,但我不确定。
我想将您的课程重命名为Friend
,Shy
和Stranger
. Friend
应该能够创造,Shy
但Stranger
不应该能够。
此代码将编译:
package com.sandbox;
public class Friend {
public void createShy() {
Shy shy = new Shy();
}
private static class Shy {
}
}
但是这段代码不会:
package com.sandbox;
public class Stranger {
public void createShy() {
Friend.Shy shy = new Friend.Shy();
}
}
此外,如果我们创建一个名为 的新类FriendsChild
,这也不会编译:
package com.sandbox;
public class FriendsChild extends Friend {
public void childCreateShy() {
Shy shy = new Shy();
}
}
当您考虑它时,这种命名约定是有意义的。仅仅因为我是某人的朋友并不意味着我的孩子认识他们。
请注意,所有这些类都在同一个包中。据我所知,这是您正在寻找的场景。
除了使构造函数受保护之外的另一个选择:
class1
构造函数设为私有class2
才能返回一个实例class1
使 class1 成为 class2 的内部类。
更新
制作protected
构造函数并将符合条件的类放在同一个包中,如果您希望包外的任何类来构造此实例,那么您需要ClassA
在此示例中扩展该类,
如果你限制它然后去default
访问说明符
package com.somthing.a;
public class ClassA {
ClassA() {
super();
// TODO Auto-generated constructor stub
}
}
package com.something.a;
public class ClassB {
public static void main(String[] args) {
new ClassA();//valid
}
}
package com.something.c;
public class ClassC {
public static void main(String[] args) {
new ClassA();// invalid
}
}