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 中使用公共类battle10 和 class battle10 ,是公共类战10 与 class battle10 冲突? 如果不是那么为什么? 请给我你的答案,我是java的新手
答案 0 :(得分:0)
专门回答你的问题。
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
外面的战斗
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类。其中一个是内部的,其中两个是不同的包。
这些都没有名称空间冲突......但需要在使用时完全合格。
我建议您重新构建代码以避免此命名空间混乱。
作为旁注:这很麻烦,但可能。非常劝阻你的代码看起来像这样。
答案 1 :(得分:-1)
是的,在不同的级别,您可以使用相同的类名,但这是不可取的。这样做并不是一个好的编程习惯,因为我认为这会使你的代码在可调试时难以理解且难以通过。但是你不能将内部类命名为外部类。
在您的情况下,冲突不会发生,因为编译器对它们的处理方式不同。我认为这是因为Java Classloader动态地将Java类加载到JVM中。因此,在加载外部类时,内部类不会被加载。
我已经阅读了另一个有关此问题的好问题。 请参阅Does the Java ClassLoader load inner classes?
答案 2 :(得分:-1)
你必须重写语法
new battle101().new battle10();
让它编译。</ p>
当你实例化new battle10()时,编译器会混淆哪一个实例化。这是因为&#34;内战10()&#34;内部公开战斗10&#34;通过扩展&#34; battle101&#34;。
考虑将内部阶级之战10视为私有,
class battle101 {
private class battle10 {
public void life() {
System.out.println("I love Mango");
}
}
}
现在,编译器可以将内部战斗10与公共战斗10区分开来,并且您的代码可以编译。
希望这会带来一些清晰度......: - )