变量和方法在Java中的阴影(Variable and Method shadowing in Ja

2019-08-17 10:58发布

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

例:

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仍是从子类中可见。

什么也正是在试图遮蔽静态方法与实例方法,并试图遮蔽静态变量,实例变量之间的行为方面的差异。

提前致谢。

Answer 1:

在你的子类(BedroomFlat),编译器不会让你声明具有相同名称作为基类的静态方法的实例方法,因为方法重载只适用于实例方法。 扩展一个类只能使实例方法提供给子类覆盖(而不是类方法,即静态)。 此外,当您尝试声明具有相同签名作为一个静态方法的方法,编译器将抛出一个错误,说你不能覆盖静态方法,作为压倒一切的发生的实例方法。

但是,编译器将不会从声明具有相同的名称从超类静态的一个实例变量阻止你,因为变量不用于覆盖候选人。



Answer 2:

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

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



Answer 3:

问题是:你是不是在这里遮蔽任何东西...

你的实例变量直接访问我命名它,通常你会写类似ClassName.staticVar访问一个静态变量。 Java的只允许referncing一个静态变量时省略了类名。

这使得它清楚,不是吗?



Answer 4:

在Java中静态方法和字段只属于一流的,所以他们不能被对象继承,否则会导致编译错误。



Answer 5:

我们知道,孩子继承父,但我们也知道,静态方法不能被重写。 因此,在这种情况下,你将不得不在孩子两种方法使用相同的方法签名。 这将创建一个问题,因为Java不支持相同的签名两种方法,但这里一个方法是静态的,另一种是非静态的。 但对于静态变量不是这种情况。



Answer 6:

我的猜测是,这给在多态性的一些问题(或者至少它是如何实现的)。 比方说,你做这样的事情Apartment x = new BedroomFlat(); 。 调用方法getArea()它不知道这是否是一个隐藏的方法或重写,因为如果它是隐藏的(静态),应该调用一个类Apartment ,但如果它重写它应该调用实例之一。

当然,通常这种情况下,应避免(它给unnecesarry头痛)。

编辑:我发现这个链接,在页面的底部,你可以看到静态和实例方法之间的方法隐藏/压倒一切的表。 IDK为什么它是怎么回事,但至少我们知道这是什么地方写( https://docs.oracle.com/javase/tutorial/java/IandI/override.html )



文章来源: Variable and Method shadowing in Java