Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:同一文件中的两个顶级类_Java_Class - Fatal编程技术网

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

Java:同一文件中的两个顶级类,java,class,Java,Class,例如,我有一个.java。在A.java中,我有: 并且与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 所以,我在这里看到了一些问题

例如,我有一个.java。在A.java中,我有:

并且与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

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

还有一个问题,B类的真正类型是什么,当我在A类和C类之外声明它时。这一点让我感到非常沮丧


谢谢:

我猜您在最后一段代码中输入了一个错误,声明B为public。但重要的是,不能在一个包中定义两个同名的类。它将抛出一个编译器错误。我曾在IDE中尝试过这一点,但该项目表明存在歧义,因为已经定义了类B。

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

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


为什么不分别创建BForA和BForC之类的类呢?如果要重用某些东西,请创建一个共享的AbstractB父类。

在类a中定义的类B不是公共的,它是包私有的-仅在定义它的包内可见


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

当您已经在A.java中这样做时:

您将无法在同一个包中的同一个C.java中定义类B,因为它已经存在于同一个包中

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
  }
}
下面是我尝试过的,它向我展示了这一点:


首先,在一个java文件中不能有两个公共类。java永远不会编译,因为您将c类和b类都声明为public@GanGnaMStYleOverFlowErroR啊,对不起。我又用手打字了,所以我忽略了这一点。我已经编辑了我的问题:@GangnamStyleOverflower,但是,作为我的问题,如果它不是公共的,它怎么能被另一个文件中的另一个类调用:我无法解释这一点。如果你的类B不是公共的,那么你的所有类都在同一个包中,而不是文件,可以访问B。你自己做一个测试。但是,您肯定会遇到编译时错误,因为在同一个包中有两个同名的类。您必须使用顶级类来引用子类。B obj=新的A.B;,或者B obj=新的C.B;。B必须对调用类可见,尽管它必须有一个包或受保护的可见性。我正在使用Eclipse,并且我没有遇到错误:我不知道它只是构建C.java,或者整个项目,我正在使用Eclipse来显示这个错误。正如您所说,我在这里看到了一些问题:在同一个包中,将有两个相同的类。我认为这是不对的。再次尝试创建相同的东西,我认为Eclipse将不允许您在同一个包中创建两个相同的命名类。啊。在我关闭Eclipse并再次打开之后,正如您所看到的,它已经注意到了错误。可能有问题:@hqt:如果你觉得解决问题有用,你可以:
class B {
}
public class C {
  public void methodC() {
      B b = new B(); //this B refer to C.java rather than A.java
  }
}
public class A {
  // normal 
}

class B {  // cannot declare: public class B

}
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
  }
}