关于包中的相同类名和接口名称

时间:2011-04-03 17:52:46

标签: 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();
}

//这是其他文件InterfaceTest1

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 个答案:

答案 0 :(得分:4)

目前还不是很清楚你在说什么,但我会捅一下 - 如果我不理解你就发表评论。

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

例如,如果一个类在com.foo.bar包中并且名为MyClass,则完全限定名称将为com.foo.bar.MyClass。如果您有多个具有相同完全限定名称的类,则会发生冲突,并且JVM将不知道要使用哪个类。要在不同的包中使用类,您必须import它。你可以import上面的类,你的java文件顶部的语句是import com.foo.bar.MyClass,或者,如果你想导入整个包,你会使用import com.foo.bar.*虽然这被认为是坏的实践。接口的行为方式相同。不需要导入与给定类相同的包中的类。因此,com.foo.bar包中另一个希望使用MyClass的类不需要import

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

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

编辑2 啊我想我明白了。您是否尝试在不同的课程中使用这些课程?在尝试解析具有名称冲突的类之前,编译器不会抱怨。如果该类未在任何地方引用,编译器将无关紧要。如果你有两个MyClass类,但两个都没有在任何地方使用,那么编译器就不会费心去尝试解决这个类,也不会注意到碰撞。是的,在MyClass内,如果您尝试引用MyClass,则会假设您指的是您所在的班级。

编辑3 最后一次尝试,如果你有MyClass,然后在其中嵌套了另一个类,MyClass1,MyClass1的完全限定名是com.foo.bar.MyClass $ MyClass1,因为它是嵌套为MyClass的一部分

答案 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。是什么让你认为你需要将第一个文件复制并粘贴到第二个文件中?从包含interface t

定义的文件中删除InterfaceTest1

所有这些都在同一个package Practice。是什么让你继续一次又一次地定义interface t?您还可以在TestStack定义中使用它。如果定义确实独特且你的问题消失了,请考虑一些独特的名称。

相关问题