有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java程序包中的类名和接口名大致相同

我对班级的名字有点困惑。这是我的问题。。。我尝试在两个不同的文件和同一个带有默认访问修饰符的包中提供相同的类名,甚至我尝试了使用接口,但它没有显示任何错误。我想知道它们实际上是如何被访问的

我不明白这些类是如何使用的。。。文件中的类是否先在本地文件中检查类或接口(如果它想使用)的存在,然后在包或其他任何东西的外部检查。我没有弄清楚。如果有人了解我所面临的困难,我希望能帮助我。。。。。 //这是InterfaceTest

package Practice;

interface t{
public void h();
public void h1();
}

abstract class InterfaceTest implements t{
public void h(){

}
public void h1(){

}
public abstract void t();
}

//这是另一个文件接口测试1

package Practice;
interface t{
public void h();
public void h2();
}
public class InterfaceTest1 {
}

//这是TestStack文件

package Practice;

public class TestStack {
Test t=new Test();
public static void main(String[] args){
    TestStack t1=new TestStack();
    InterfaceTest it=new InterfaceTest();
}
}
interface t{
public void h3();
}
class Test implements t{
public void h3(){

}

public void h1(){

}
public void h2(){

}
}
class InterfaceTest{

}

这三个文件在同一个包中使用,但我没有收到任何名称冲突错误


共 (2) 个答案

  1. # 1 楼答案

    包中的接口和类名必须是唯一的:

    package foo;
    
    public interface Bar
    {
        void print();
    }
    
    class Bat implements Bar
    {
        public void print() { System.out.println("Hi there"); }
    }
    

    如果包不同,则可以使用重复的接口或类名。完全解析的类名必须是唯一的

    package other;
    
    public class Bat
    {
        public void doSomething() 
        { 
            System.out.println("And now for something completely different");
        }
    }
    

    更新:

    你给出的示例代码很荒谬。抛开糟糕的命名约定不谈,您在两个单独的文件中定义了interface t。是什么让你认为一旦你有了第一个文件,你就需要复制并粘贴到第二个文件中?从包含InterfaceTest1定义的文件中删除interface t

    所有这些都在同一个package Practice。是什么让你继续一次又一次地定义interface t?在TestStack定义中也有。如果定义确实是唯一的,那么请考虑一些唯一的名称,这样你的问题就可以解决了

  2. # 2 楼答案

    你说的话不太清楚,但我会试试看——如果我不明白你的意思,请留言

    在Java中,类由其完全限定名标识。完全限定名为。类名

    例如,如果一个类在com中。福。bar包,名为MyClass,完全限定名为com。福。酒吧我的班级。如果有多个类具有相同的完全限定名,则会发生冲突,JVM将不知道要使用哪个类。为了在不同的包中使用一个类,您必须import它。你可以import在上面的类中,在java文件的顶部放一条语句import com.foo.bar.MyClass,或者,如果你想导入整个包,你可以使用import com.foo.bar.*,尽管这被认为是不好的做法。接口的行为方式相同。与给定类位于同一个包中的类不需要导入。那么,com中的另一个类。福。希望使用MyClass的bar包不需要import

    这对你有帮助吗?如果你能澄清你的问题,我可以试着帮你更多

    编辑为了澄清问题,每个java文件只能有一个顶级公共类。如果希望在文件中定义其他公共接口或类,它们必须嵌套在顶级类中。如果您使用了一个类,但没有完全限定它,编译器将首先查找具有该名称的嵌套类,然后在同一个包中查找具有该名称的类。如果它仍然找不到,而您还没有导入它,那么它将失败,并出现类解析错误

    编辑2啊,我想我明白了。您是否试图在其他类中使用这些类?编译器在试图解决名称冲突的类之前不会抱怨。如果该类没有在任何地方被引用,编译器将不会在意。如果您有两个MyClass类,但它们都没有在任何地方使用,那么编译器就不会费心尝试解析该类,也不会注意到冲突。是的,在MyClass的内部,如果你试图引用MyClass,它会假设你引用的是你所在的类

    编辑3最后一次尝试,如果您有MyClass,然后在其中嵌套了另一个类MyClass1,MyClass1的完全限定名是com。福。酒吧MyClass$MyClass1,因为它是作为MyClass的一部分嵌套的