带有非公共参数的公共构造函数的Java公共类。为什么?

时间:2014-03-17 11:36:34

标签: java

Java允许定义以下一对类。

class Class1 { ... }
public Class2 { public Class2(Class1 c1) { ... } }

为什么Class2有公共构造函数,如果我无法实例化它,因为Class1不可访问?

对于记录,没有从Class1继承的公共类。

4 个答案:

答案 0 :(得分:2)

Class1Class2在同一个包中定义。所以他们可以访问。 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);
相关问题