【问题标题】:Java - object of a private inner class being as an argument to an outer class' constructorJava - 私有内部类的对象作为外部类构造函数的参数
【发布时间】:2013-03-23 03:06:27
【问题描述】:
public class Person
{
    private class Date
    {
        public Date(int month, int day, int year)
        {
            ...
        }
    }


    private String name;
    private Date birthDate;

    public Person(String name, Date birthDate)
    {
        ...
    }
}

上面,我有一个外部类 Person 和一个私有内部类 Date。 Person 对象的构造函数应将 Date 作为其参数之一。

public class Test
{
    public static void main(String[] args)
    {
        Person testPerson = new Person("Mr. Sandman", new Date(1, 1, 1970));
    }
}

但是,当我尝试在单独的“测试”文件 Test.java(上图)(与我的 Person.java 文件位于同一文件夹中)中创建 Person 对象时,出现错误。

错误是这样的:“错误:没有为 Person(String,Date) 找到合适的构造函数” (编译器引用我实例化 testPerson 的行作为错误原因。)

问题:我做错了什么?另外,如何创建 Person 对象并将 Date 对象传递给 Person 的构造函数? (如果 Date 是 Person 的私有内部类,这是否可能?)

【问题讨论】:

  • 为什么Date 必须是Person 的内部类?这似乎不合逻辑。将Date移到Person之外,它会解决你所有的问题。
  • 大概因为你不能像这样实例化一个Person.Date对象,那实际上是一个不同的Date类在你的Test类中使用......
  • @miorel 它必须是一个内部类,因为这是我的家庭作业指定的。 :P

标签: java constructor private inner-classes


【解决方案1】:

DatePerson 的私有内部类,因此您将无法从另一个(非Person)类创建它的实例。两件事:

  • 为了使您当前的设计工作,请将Date 的访问权限从私有更改为公共
  • 您还需要为Person 类创建一个默认构造函数,因为您需要它的一个实例来创建内部类。
  • 请考虑更改您的内部类名称。 SDK 中已经有一个Date 类。

老实说,您应该按照其他人的建议将 Date 创建为独立类。

【讨论】:

  • 我同意。 Date 作为内部类没有明显的好处,也没有任何意义;我没有看到任何应该是 Person 类私有的。为什么不直接使用 java.util.Date?您可以使用 JodaTime 库来获得更多便利。
  • 感谢您的解释和建议。
【解决方案2】:

您可以添加一个新的Person 构造函数,该构造函数将java.util.Date 作为第二个参数,并从java.util.Date 对象(可能通过Calendar 对象)创建一个Person.Date 对象。

你也可以让你现有的构造函数private,因为没有人能够使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2016-07-31
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多