Java中的变量和方法阴影

Java中的变量和方法阴影,java,static,instance,instance-variables,shadowing,Java,Static,Instance,Instance Variables,Shadowing,基本上,我想知道为什么静态方法不能被实例方法隐藏(我知道为什么,它在某些情况下会导致歧义),而静态变量可以被实例变量隐藏(它只适用于子类) 例如: public class Apartment{ static int area = 10; public static int getArea(){ return area; } } class BedroomFlat extends Apartment { int area = 10;// n

基本上,我想知道为什么静态方法不能被实例方法隐藏(我知道为什么,它在某些情况下会导致歧义),而静态变量可以被实例变量隐藏(它只适用于子类)

例如:

public class Apartment{

    static int area = 10;

    public static int getArea(){
        return area;
    }
}

class BedroomFlat extends Apartment {

    int area = 10;// no problem at all 

    public int getArea(){ // illegal line it cannot hide the super static method
        return area;
    }
}
因此,如果我试图在超类中声明
int-area
(实例变量)以及
static int-area
,它将给出一个错误,但在子类中声明时不会发生错误,即使从子类中仍然可以看到
static int-area

在行为方面,试图用实例方法隐藏静态方法和试图用实例变量隐藏静态变量有什么区别


提前感谢。

没有人可以继承静态方法和字段,因为它们属于类


在您的情况下,您不是覆盖
getArea()从父级开始,您试图创建具有相同签名的方法-这会导致编译错误。

问题是:您在这里根本没有隐藏任何内容

您的实例变量可以通过我的命名直接访问,通常您必须编写类似ClassName.staticVar的内容才能访问静态变量。Java只允许在引用静态变量时省略类名


这很清楚,不是吗?

在Java中,静态方法和字段只属于类,因此它们不能被对象继承,否则会导致编译错误。

我们知道子方法继承父方法,但我们也知道静态方法不能被重写。因此,在本例中,子对象中有两个方法具有相同的方法签名。这将产生问题,因为java不支持具有相同签名的两个方法,尽管这里一个是静态的,另一个是非静态的。但对于静态变量,情况并非如此。

在子类(BedroomFlat)中,编译器将不允许您声明与基类中静态方法同名的实例方法,因为方法重写仅适用于实例方法。扩展类只能使子类可以使用实例方法进行重写(而不是类方法,如静态)。 此外,当您试图声明一个与静态方法具有相同签名的方法时,编译器将抛出一个错误,说明您无法重写静态方法,因为重写发生在实例方法上


但编译器不会阻止您使用与super类中的静态变量同名的实例变量,因为变量不是重写的候选变量

我的猜测是,这在多态性(或者至少是如何实现多态性)方面带来了一些问题。比如说你做了这样的事情
公寓x=新卧室公寓()。调用方法
getArea()
,它不知道它是隐藏的还是被重写的,因为如果它是隐藏的(静态),它应该调用类
单元中的方法,但是如果它被重写,它应该调用实例方法

当然,通常应该避免这些情况(这会带来不必要的头痛)


编辑:我找到了这个链接,在页面底部,您可以看到静态和实例方法之间的方法隐藏/重写表。Idk为什么它是这样的,但至少我们知道它是在某处编写的()

我知道它为什么不编译。假设我有一个新的bedroomflat().getArea(),编译器不知道选择哪个getArea。静态还是实例?两者都可以通过这种方式访问。但是对于实例变量区域,即使静态变量区域是可见的,也没有问题,因此会被隐藏。我完全理解静态方法不会被覆盖的原因。我只想知道为什么实例变量area shadows(用new dombery()表示)会返回实例变量而不是超级静态变量,而对于无法发生的方法,我完全理解静态方法不会被重写的原因。我只想知道为什么实例变量area shadows(在new dombery()中,a将返回实例变量而不是超静态变量),而对于方法,如果一个方法指向类,另一个方法指向实例,它就不能出现在“点”上。为什么要制造冲突?静态int-area=10和int-area=10的逻辑不一样吗?有什么区别?为什么不是这样?