【问题标题】:can i use same class name at different levels in a program in java?我可以在java程序的不同级别使用相同的类名吗?
【发布时间】:2015-03-26 03:50:04
【问题描述】:
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");
        }
    }
}

在上面的代码中,我们在class Battle101里面使用了public class battle10class battle10,就是public class battle10 strong> 是否与class Battle10 冲突? 如果不是那为什么? 请给我你的答案,我是java新手

【问题讨论】:

  • 当你尝试运行你的代码时,会发生什么?为什么你会费尽心思编写代码然后就停止运行它?
  • 看看这个。 stackoverflow.com/questions/8994147/…。您的程序应该运行,但类加载器将确定哪个优先。我会猜测并说(battle101的)内部battle10将首先加载。
  • 是的,你可以,但由于显而易见的原因,这是一个坏主意。
  • @jcd 不,这与类加载器无关。
  • 为什么类加载器在编译时比公共类battle10更倾向于内部类battle10

标签: java


【解决方案1】:

专门回答你的问题。

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

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

战斗101中的战斗10有命名空间:

com.game.battles.Battle101.Battle10

外面的战斗10

com.game.battles.Battle10

如果您在同一代码块中引用这两个类,则声明完全限定路径将让您无论名称如何都能获取正确的路径。

com.game.battles.Battle10 battle10 = new com.game.battles.Battle10()

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

在我们的示例中,我们有 3 个battle10 类。其中一个是内部的,其中两个在不同的包装中。

这些都没有命名空间冲突...但需要完全限定使用。

我建议您重组代码以避免这种命名空间混乱。

附带说明:这很麻烦,但可能。非常不鼓励让您的代码看起来像这样。

【讨论】:

    【解决方案2】:

    是的,您可以在不同级别使用相同的类名,但不建议这样做。这样做不是一个好的编程习惯,因为我认为这会降低代码的可读性,并且在调试时也很难通过。但是您不能将内部类命名为与外部类相同。

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

    我已经阅读了另一个问题,其中包含一些很好的信息。 参考Does the Java ClassLoader load inner classes?

    【讨论】:

      【解决方案3】:

      您必须将语法重写为 new battle101().new battle10(); 使其编译。

      当您实例化 new Battle10() 时,编译器会混淆要实例化哪一个。这是因为通过扩展“battle101”将“inner Battle10()”包含在“public Battle10”中。

      考虑将内部类battle10设为私有,

      class battle101 {
          private class battle10 {
              public void life() {
                  System.out.println("I love Mango");
              }
          }
      }
      

      现在编译器可以区分内战10和公共战10,你的代码就可以编译了。

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

      【讨论】:

        猜你喜欢
        • 2018-07-14
        • 2011-10-16
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        相关资源
        最近更新 更多