子类如何访问抽象类的非静态成员?

时间:2014-05-15 15:05:17

标签: java abstract-class abstraction

我是Java的新手。

我知道,即使是子类也不能直接引用基类的非静态成员。 等,

class BaseClass
{
int id;
public void testMethod()
{
    System.out.println("Hello");
}
}
public class Test1 extends BaseClass
{
public static void main(String[] args)
{
    System.out.println("ID : " + id);
}
}

这会给我们一个错误"无法对非静态字段ID进行静态引用"

但是,在抽象类的情况下,我们可以做到。

abstract class MyAbstractClass
{
int id;
public void setId(int id)
{
    this.id = id;
}
}

public class SubClass extends MyAbstractClass
{
public void testMethod()
{
    System.out.println("ID Value : " + id);
}
public static void main(String[] args)
{
    SubClass obj = new SubClass();
    obj.setId(1);
    obj.testMethod();
}
}

我想知道如何以及为什么在抽象类的情况下可能。 感谢您的回答。 请温柔,我是java的新蜜蜂。 :)

2 个答案:

答案 0 :(得分:3)

您声明的问题依赖于抽象类,但依赖于静态和非静态上下文。您只需对实例变量进行两次不同的调用。

第一个示例尝试从静态上下文访问ID,这是不允许的,并且您收到错误(无法对非静态引用静态字段ID )。

public static void main(String[] args)
{
    System.out.println("ID : " + id);
}

第二个示例中,您创建了一个类的实例,在此实例中,您可以访问id。这是来自非静态背景的参考。

public void testMethod()
{
    System.out.println("ID Value : " + id);
}

如果您在第二个示例中创建了一个实例,并且从非静态方法访问id,那么您的第一个示例也是如此。

答案 1 :(得分:1)

  

无法对非静态字段id

进行静态引用

出现此错误是因为您要访问静态方法中的非静态字段。这就是你在这里所做的:main方法是static,但id不是。{/ p>

public static void main(String[] args) {
    //here you don't create an instance of the class
    //you cannot access to id directly
    System.out.println("ID : " + id);
}

您需要创建类的实例以访问其非静态字段,就像您在第二个示例中所做的那样,无论您是否从其他(抽象)类扩展。

public static void main(String[] args) {
    //here you create an instance of the class
    SubClass obj = new SubClass();
    obj.setId(1);
    obj.testMethod();
}