Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 - Fatal编程技术网

我可以在java程序的不同级别使用相同的类名吗?

我可以在java程序的不同级别使用相同的类名吗?,java,Java,在上面的代码中,我们使用公共类战斗10和类战斗10在类战斗101中,是否公共类战斗10与类战斗10冲突? 若否,原因为何? 请给我你的答案,我是java新手是的,在不同的级别你可以使用相同的类名,但这是不可取的。这样做不是一个好的编程实践,因为我认为这会降低代码的可读性,并且在调试时也很难通过。但是不能将内部类命名为与外部类相同的名称 在您的情况下,不会发生冲突,因为编译器会以不同的方式对待它们。我认为这是因为Java动态地将Java类加载到JVM中。因此,在加载外部类时不会加载内部类 我读了另

在上面的代码中,我们使用公共类战斗10类战斗10类战斗101中,是否公共类战斗10类战斗10冲突? 若否,原因为何?
请给我你的答案,我是java新手是的,在不同的级别你可以使用相同的类名,但这是不可取的。这样做不是一个好的编程实践,因为我认为这会降低代码的可读性,并且在调试时也很难通过。但是不能将内部类命名为与外部类相同的名称

在您的情况下,不会发生冲突,因为编译器会以不同的方式对待它们。我认为这是因为Java动态地将Java类加载到JVM中。因此,在加载外部类时不会加载内部类

我读了另一个问题,其中有一些很好的信息。
请参阅

您必须将语法重新编写为
newbattle101().newbattle10()使其可编译

当您实例化new battle10()时,编译器不知道要实例化哪一个。这是因为通过扩展“battle101”,将“内部battle10()”封装在“公共battle10”中

考虑让内部阶级斗争10变得像私人一样

public class battle10 extends battle101
{
    public static void main(String a[])
    {
        battle10 obj=new battle10();
    }
}

class battle101
{
    class battle10
    {
        public void life()
        {
            System.out.println("I love Mango");
        }
    }
}
现在,编译器可以区分内部battle10和公共battle10,并且您的代码可以编译


希望这能带来一些清晰…:-)

来具体回答您的问题

Java打包非常简单。获得名称空间冲突的唯一方法是在同一个包中有两个同名的类

class battle101 {
    private class battle10 {
        public void life() {
            System.out.println("I love Mango");
        }
    }
}
battle 101中的battle 10具有名称空间:

com.game.battles.Battle101.Battle10

外面的战场

com.game.battles.Battle10

如果在同一代码块中引用了这两个类,那么声明完全限定路径将使您能够获取正确的路径,而不管名称如何

package com.game.battles

public class Battle10{
}

package com.game.battles.behavior

public class Battle10{
}

package com.game.battles

public class Battle101 extends com.game.battles.Battle10{
    public static class Battle10{ 
    }
}
在我们的例子中,我们有3个10类。其中一个是内部的,两个在不同的包中

这些都没有命名空间冲突。。。但在使用时需要完全合格

我建议重新构造代码以避免名称空间混乱


作为旁注:这很麻烦,但也是可能的。强烈建议不要让代码看起来像这样。

当您尝试运行代码时,会发生什么?为什么你要费尽心机去编写代码,然后在运行它之前就停止了呢。您的程序应该运行,但是类加载器将确定哪个获取首选项。我猜,内部类battle10(属于battle101)将首先加载。是的,您可以,但这是一个坏主意,原因很明显。@jcd否,这与类加载器无关。为什么类加载器在编译时优先选择内部类battle10而不是公共类battle10。
com.game.battles.Battle10 battle10 = new com.game.battles.Battle10()

com.games.battle.Battle101.Battle10 innerBattle = new com.games.battles.Battle101.Battle10()