我们说我有3节课
class1
,class2
和class3
。
我怎样才能使class1
只能由class2
(class1 object = new class1()
)实例化,而不能由class3或任何其他类实例化?
我认为它应该适用于修饰符,但我不确定。
答案 0 :(得分:2)
我想将您的课程重命名为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();
}
}
的新类,则此不会编译:
{{1}}
当你考虑它时,这个命名约定是有意义的。仅仅因为我是某人的朋友并不意味着我的孩子知道他们。
请注意,所有这些类都在同一个包中。据我所知,这是你正在寻找的方案。
答案 1 :(得分:1)
除了使构造函数受到保护之外的另一个选择:
class1
constructer private class2
的有效实例才能返回class1
的实例答案 2 :(得分:0)
<强>更新强>
make 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
}
}
答案 3 :(得分:0)
make class1 class2的内部类。