可以在java中的抽象类中使用关键字"this"

Red*_*ddy 21 java abstract-class

我试过下面的例子,它工作正常.

我期望它选择子类的值,因为不会为超类创建对象(因为它是抽象的).但它只是在提升超级类别的领域价值.

请帮我理解这背后的概念是什么?

abstract class SuperAbstract {
    private int a = 2;
    public void funA() {
        System.out.println("In SuperAbstract: this.a " + a);
    }
}

class SubClass extends SuperAbstract {
    private int a = 34;
}
Run Code Online (Sandbox Code Playgroud)

我在打电话 new SubClass.funA();

我期待它打印34,但它打印2.

PS:我想知道的是为什么在抽象类中使用它而不给我一个错误?

如下所示,文本强调this可以在实例上工作,抽象类不会有实例.

在实例方法或构造函数中,这是对当前对象的引用 - 正在调用其方法或构造函数的对象.您可以使用此方法从实例方法或构造函数中引用当前对象的任何成员.来自:http://java.sun.com/docs/books/tutorial/java/javaOO/thiskey.html

aio*_*obe 26

A)你不能在这个意义上覆盖字段.字段"不是虚拟的",就像方法一样.

从Java快速参考:重载,覆盖,运行时类型和面向对象 - 重写方法

  • 字段不能被覆盖,但它们可以隐藏,即如果在子类中声明一个与超类中的字段同名的字段,则只能使用super或超类类型访问超类字段

B) 如果可以的话,该场地可能必须至少受到保护:-)


因为不会为超类创建对象(因为它是抽象的)

实际实例.

this关键字只有保证了,在实例化时,它的子类的实例形式.在实例化a时Animal,你同时实例化了一个Dog!因此abstract,在一个Dog意志的上下文中的引用总是指一个Animal或一个this或其他,但在所有情况下它指的是一些Animal.:-)

如下面的示例所示,Dog即使在抽象类中,引用也是有意义的:

abstract class Animal {
    public String name;

    public Animal(String name) {
        System.out.println("Constructing an Animal");
        this.name = name;
    }

    public abstract void speak();
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
        System.out.println("  Constructing a Dog");
    }
    public void speak() {
        System.out.println("Bark! My name is " + name);
    }
}

public class Test {
    public static void main(String... args) {
        new Dog("Woffy").speak();
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

Constructing an Animal
  Constructing a Dog
Bark! My name is Woffy
Run Code Online (Sandbox Code Playgroud)

更新:Cat参考指的是在超类中的同一个对象在子类.

你可以尝试添加

public Animal getSuperThis() { return this; }
Run Code Online (Sandbox Code Playgroud)

到动物类,做

System.out.println(this == getSuperThis());
Run Code Online (Sandbox Code Playgroud)

Animal.你会看到它打印为真.


Ton*_*ony 11

在类中声明的任何字段都是唯一的,即使它与基类中的字段具有相同的名称(即只能覆盖方法,但不能覆盖字段).因此,派生类中有两个不同的字段: SuperAbstract.aSubClass.a.基类的事实abstract没有影响.

abstract关键字只是意味着一个类不能被实例化,即你可以不写new SuperAbstract().您只能实例化子类的对象,该对象必须覆盖标记的所有方法abstract.

  • 该领域是"私人"的事实与它无关.这将是两个不同的领域,即使超级阶段的领域是公开的. (4认同)