1

就超类中定义的属性值而言,在子类中使用相同的属性并且该属性被定义为受保护,那么使用 super 或 this 没有任何区别,对吗?那么为什么语言真的有这些访问属性的方式呢?是否存在它们具有不同值的情况。

    class A{ protected int a = 15; 
    }

    class B{ 
    public void printA()
{
    System.out.print(super.a) // prints 15
    System.out.print(this.a) // prints 15
 }   

}

4

1 回答 1

4

这种情况下,它没有任何区别。但是,一旦您更改为方法而不是变量,并引入另一种方法,B其中阴影中的方法A那么它就会有所不同:

class A { 
    protected int a = 15; 
}

class B extends A { 
    private int a = 10;

    public void printA() {
       System.out.println(super.a); // prints 15
       System.out.println(this.a); // prints 10
    }
}

这在方法中比在字段中更常见 - 通常重写实现需要调用超类实现作为其实现的一部分:

public void foo() {
    super.foo();
    // Now do something else
}

我个人建议避免使用非私有字段,此时字段部分变得无关紧要。

有关阴影的更多信息,请参见JLS 的第 6.4.1 节。

于 2012-08-07T20:23:05.163 回答