子类,父类....变量冲突?

时间:2011-02-16 00:11:18

标签: java

如果我的子类和父类使用相同的变量名,会发生什么?

父类是这样的:

public class things{
    private things[] stuff;
}

,子类是这样的:

import java.utils.LinkedList;
public class listOfThings extends LinkedList<things>{
    private LinkedList<things> stuff;
}
这是允许的吗?或链接列表是否会覆盖数组?

3 个答案:

答案 0 :(得分:4)

在这种情况下,两个变量都是私有的。这意味着它们只存在于定义类的范围内,并且没有重叠。如果父类将变量声明为protected或public,则会出现有关已存在变量的编译器错误。

修改
KG回答了你给出的例子的问题。如果你真的按照你的要求做了什么,我给出了答案。

答案 1 :(得分:2)

您没有使用此示例扩展内容,而是扩展

LinkedList<things>

这与扩展事物基本不同。

因此,您的代码应该编译。

答案 2 :(得分:1)

具有相同名称的变量是可以的。 私有,公共,静态,实例,方法本地,阻止本地,无论。 Java选择最接近的一个。它比方法松散得多。

JLS3#8.3 :(第一句中只有1个限制)

类声明的主体声明两个具有相同名称的字段是编译时错误。方法,类型和字段可以具有相同的名称,因为它们在不同的上下文中使用,并且通过不同的查找过程消除歧义(第6.5节)。

如果类声明了具有特定名称的字段,则该字段的声明被称为隐藏超类中具有相同名称的字段的任何和所有可访问声明,以及该类的超接口。字段声明还隐藏(§6.3.1)封闭类或接口中任何可访问字段的声明,以及任何封闭块中具有相同名称的任何局部变量,形式方法参数和异常处理程序参数。

如果字段声明隐藏了另一个字段的声明,则这两个字段不必具有相同的类型。

一个类继承自它的直接超类,并直接超级接口超类和超接口的所有非私有字段,这些字段既可以被类中的代码访问,也不会被类中的声明隐藏。

请注意,子类可以访问超类的私有字段(例如,如果两个类都是同一个类的成员)。然而,私有字段永远不会被子类继承。

类可以继承多个具有相同名称的字段(第8.3.3.3节)。这种情况本身不会导致编译时错误。但是,在类的主体内通过其简单名称引用任何此类字段的任何尝试都将导致编译时错误,因为这样的引用是不明确的。

// this is a valid program!
class $
{
    $ $;
    $ $($ $)
    {
        class $$ extends $
        {
            $$ $;
        }
        return new $$();
    }
}