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