2010-11-10 52 views
14

仍然来自C++我发现创建许多小的帮助程序类和对象很麻烦。主要是因为我必须为每个类有一个文件。我基本上有一类这样的:为什么每个文件只有一个类

public class mySimpleClass { 
    public float[] numbers = new float[ 4 ]; 
} 

然后,我有这个类:

public class myNotSoSimpleClass { 
    private mySimpleClass; 
    . 
    . 
    . 
} 

这不是那么简单的是确定在其自己的文件第二类。然而,简单的类连接到不那么简单的类,它是非常好的,不必在自己的文件中有这么几行代码。

所以总结起来,这是一个能在C++做:

public class myNotSoSimpleClass { 
    private struct mySimpleClass { 
     float numbers[ 4 ]; 
    } myStruct; 
    . 
    . 
    . 
} 

是否有可能嵌入/使用另一个类,或者同一个文件内一个班?如果我可以将这两个类设置为一个文件,我会发现使用大型项目​​更容易。或者,Java是每个文件严格的一个类,就是这样,语言?

+5

在Java中,习惯上用大写字母命名所有类名,并用小写字母命名所有变量名。你应该调用你的类'MySimpleClass'和'MyNotSoSimpleClass'。 – 2010-11-10 14:21:43

+1

为什么你有一个什么都不做,除了包装一个数组,这也是一个类? – JeremyP 2010-11-10 15:36:57

+0

@JeremyP:这是一个例子。我的实际简单类有几个变量,而我不那么简单的类有更多的代码,包括函数。 – Espen 2010-11-10 15:58:58

回答

14

在另一个类中可能有一个类。在Java中,它被称为inner class

+0

这里的习俗是什么?使用内部类为这种助手类或其中一个包私人类? – Espen 2010-11-10 14:29:54

+0

这可以是一个很好的方法,但要确保你不会首先在其他地方需要这门课程。 – 2010-11-10 14:30:07

+1

内部类是一种嵌套类。还有静态嵌套类。 – 2010-11-10 14:31:20

3

Java允许您创建内部类。也就是说,另一个班级内的班级。这就是你应该把你的帮手类。另一方面,我感到你的痛苦。主要是一个C++编码器,我自己Java有时会觉得它会迫使你模仿样板。

15

你可以有多个类在同一个文件,但只有其中一个可以公开:

Java: Multiple class declarations in one file

+0

你可以有公开的内部类,你想说什么? – 2010-11-10 14:09:14

+6

他根本不是指内层类,而是指其他顶层类。 – 2010-11-10 14:10:52

+0

“只有其中一个可以公开”是不正确的。 – 2010-11-10 14:27:10

4

的规则是每个文件一个顶层公共类。内部类,私人类和其他一些东西被允许

+0

-1错误。限制仅限于顶级类。 – 2010-11-10 14:23:38

+0

@Erick:这是如何使他的答案不正确?他说“私人课堂”,我认为他是指一个不公开的顶级课程。 – Jay 2010-11-10 14:39:17

+0

你可以推测,因为你明白它是如何工作的。有人在这里试图理解不能做出同样的推定。 – 2010-11-10 17:29:04

5

限制是每个文件只能有一个顶级公共类(尽管你可以嵌套公共类)。正如人们所提到的,你可以在该类中拥有内部/嵌套类。

另一件尚未提及的事情是,只要它是包私有的(只在包中可见),您可以在同一个文件中拥有另一个顶级类。包私有类是没有访问修饰符声明的类。

以下是关于此主题的Effective Java(值得一读)的一章。 http://books.google.co.uk/books?id=ka2VUBqHiWkC&lpg=PA67&ots=yXKoLnv2TX&dq=Minimize%20the%20accessibility%20of%20classes%20and%20members&pg=PA67#v=onepage&q&f=false

+2

不正确。嵌套类可以是公共的。 – 2010-11-10 15:00:05

+0

啊,我的道歉。忘记了这种情况。我会对我的答案进行编辑。 – Sinjo 2010-11-10 15:03:02

+0

第二段仍然不正确。解决这个问题,我会删除我的downvote。 – 2010-11-10 16:08:16

0

在Java中有一种叫做嵌套类的东西,阅读更多about it here

+0

-1格式不正确的答案。 – 2010-11-10 14:23:13

2

在Java中,无法将两个公共顶级类放入同一个文件中,但此限制不适用于私有/内部类。所以,你可以有类似:

public class MyNotSoSimpleClass { 
    private MySimpleClass mySimpleClass = new MySimpleClass(); 

    private class MySimpleClass { 
     public float numbers[4]; 
     ... 
    } 
.... 

}

+1

这是错误的。在同一个源文件中可以有任意多的公共类。在同一个文件中不可能有多个*顶级*类。 – 2010-11-10 14:19:53

+0

显然。因此私人/内部类。我不是说他们是一回事。根据定义,内部类是不*顶级的... – nosirrahcd 2010-11-10 14:30:02

+0

@Andy:显然,user468341正在谈论顶级类。 – chiccodoro 2010-11-10 14:32:35

3

是的,你可以窝内的另一个类。

与此处的许多答案相反,公众知名度没有限制。

嵌套类包括:

  • 静态嵌套类。
  • 内部类,它有一个隐含指针指向包含类的实例,并且允许访问其私有部分。
  • 匿名内部类,可以在包含类的方法中创建,不需要名称。例如,这对于短期事件监听者来说很方便。

更多细节在这个Oracle tutorial.

9

可作为其他几个人所指出的那样,你可以在一个单一的文件中的任何数量的非公共类的。

要回答“为什么”,一个可能的因素是,它使您的类容易找到。如果我在程序中看到Foobar类的引用,我立即知道它必须与当前类在同一个文件中,或者它必须位于名为Foobar.java的文件中。我可以检查进口,看看它在什么目录。

当我在C或C++程序上工作时,我经常发现自己必须执行Windows文件搜索或Linux grep's才能找到类的源代码。

当我编写非常小的程序时,我经常把所有的类放在一个文件中。但是,如果它将超过几千条线,那么将其分解出来更容易管理。

当我有一个只被另一个类使用的类时,我经常会把它放在同一个文件中。通常这意味着一个只存在临时存放一些小数据包的类,比如我需要一个数组或者需要多个字段的东西列表。

+1

与不用搜索就能够找到代码的时间相比,为每个类创建新文件花费的时间很少。您不必查看几个级别的#includes或尝试手动解析makefile以查找哪个文件具有哪个类。 +1的解释。 – 2010-11-10 15:14:32

+0

我看到每个班级都有一个文件。但是,我从来没有在C++中找到一个类的问题。主要是因为我认为我做了适当的命名和命名空间,以及VS中漂亮的右键单击菜单。虽然通过std或者外部库来看看会是一件没有它的痛苦。如果这样说的话,每个人有十个或二十三个班级的文件只是一个麻烦。 – Espen 2010-11-10 15:28:02

+0

@Espen:当然,创建一个单独的文件只是为了容纳一个小型的课程似乎很愚蠢。但是我回到了我的原始观点:一致的规则使得所需的源代码很容易找到。现代的IDE可以提供帮助,但我并不总是使用IDE来查看我的代码。 – Jay 2010-11-11 14:14:59

相关问题