Java允许定义以下一对类。
class Class1 { ... }
public Class2 { public Class2(Class1 c1) { ... } }
为什么Class2有公共构造函数,如果我无法实例化它,因为Class1不可访问?
对于记录,没有从Class1继承的公共类。
答案 0 :(得分:2)
Class1
和Class2
在同一个包中定义。所以他们可以访问。 Class1
具有默认访问修饰符,该修饰符对同一包中的所有类都可见
答案 1 :(得分:2)
乍一看,似乎没有意义:此软件包的用户可以访问Class2。但是他无法创建Class2的实例,因为他无法访问Class1。因此,当它所需的参数不是public
时,没有理由构造构造函数public
。
这实际上有意义的唯一情况是在同一个包中有另一个public
类扩展Class1。然后你可以创建这个类的一个实例,并将它传递给构造函数:
// Assuming this class extends Class1, and it is public, you
// can create an instance of this class from outside the package:
ExtendedClass1 e = new ExtendedClass1();
// This is using the public constructor that expects a Class1.
// Although Class1 itself is NOT public, this constructor
// can be called with an instance of a (public) class that
// extends Class1
Class2 c = new Class2(e);
但由于后者被排除在问题之外,因此没有理由拥有这个公共构造函数。
答案 2 :(得分:0)
有一个类限制其创建/访问同一个包的成员是合理的,同一个包中的其他类将扩展此类并公开。
例如,如果您正在实现模板模式,那么您可能拥有实现基本,共享,逻辑的超类(可能是抽象),以及一个或多个实现不同步骤的具体类。
这些具体的类可以由调用者实例化,但是基类不会。
虽然可以同样保护基类而不是包范围。
答案 3 :(得分:-1)
每个类都有一个默认构造函数(如果你没有提供),你可以这样做:
Class1 c1 = new Class1();
然后
Class2 c2 = new Class2(c1);