Java:同一文件中的两个顶级类

时间:2012-12-12 14:42:39

标签: java class

例如,我有A.java。在A.java我有:

public class A {
  // normal 
}

class B {  // cannot declare: public class B

}

A.java在同一个包中。我创建C.java并声明:

public class C {
  public void methodC() {  
      A a = new A(); 
      B b = new B(); // no error -> B is a public class
  }
}

如果我在文件C.java中创建新的B类。 C将引用文件C.java中的B类,而不是A.java

class B {
}
public class C {
  public void methodC() {
      B b = new B(); //this B refer to C.java rather than A.java
  }
}

所以,我在这里看到了一些问题:在同一个包中,会有两个相同的类。因此,当我创建D.java时,我怎么知道将引用哪个B类?

另一个问题,当我在A级和C级之外宣布它时,B类的实际类型是什么。这一点让我感到非常沮丧。

谢谢:)

4 个答案:

答案 0 :(得分:4)

当您在A.java中完成此操作时:

public class A {
  // normal 
}

class B {  // cannot declare: public class B

}

您将无法在相同包中的同一个class B中定义C.java

class B {            //You won't be able to do this as same class in package exists

}
public class C {
  public void methodC() {
      B b = new B(); //this B refer to C.java rather than A.java
  }
}

我尝试过的是下面的内容,它向我展示了这一点:

enter image description here

答案 1 :(得分:1)

我猜你在最后一段代码片段中写了一个拼写错误(将B声明为公开)。但重要的是你不能在包中定义两个具有相同名称的类。它会抛出编译器错误。我用IDE尝试了这个,项目表明由于已经定义了B类,所以存在歧义。

答案 2 :(得分:1)

您将获得重复的类定义。 A.java将被编译为A.class和B.class。编译C.java会导致错误或覆盖B.class。

B类不是公共的,它是本地的包,因此只能由同一包中的类使用。

为什么不创建单独的BForA和BForC类?如果要重用某些内容,请创建一个共享的AbstractB父类。

答案 3 :(得分:1)

A类中定义的B类公开,包私有 - 仅在定义它的包内可见。

当您还在D类中定义类B时,您将收到错误:类型B已经定义。