Java 在子类中使用super或this访问超类中的属性?

Java 在子类中使用super或this访问超类中的属性?,java,Java,就超类中定义的属性值而言,使用子类中相同的属性,并且该属性被定义为受保护,那么使用超类或这不会有任何区别,对吗那么为什么语言真的有这些访问属性的方法?是否存在这样一种情况,即它们将具有不同的值 class A{ protected int a = 15; } class B{ public void printA() { System.out.print(super.a) // prints 15 System.out.print(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
 }   
}

在这种情况下,没有任何区别。但是,只要您改为使用方法而不是变量,并在
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
}
我个人建议避免使用非私有字段,此时字段部分变得无关紧要

有关阴影的详细信息,请参见。

在这种情况下,阴影没有任何区别。但是,只要您改为使用方法而不是变量,并在
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
}
我个人建议避免使用非私有字段,此时字段部分变得无关紧要


有关阴影的详细信息,请参阅。

B扩展A*-否则编译错误是。还没有在这里全部输入。B扩展了A*-否则编译错误是的。尚未在此处全部键入。因此,成员变量不可重写:尽管如此,成员变量是不可重写的: