【问题标题】:How can a sub-class access not-static members of an abstract class?子类如何访问抽象类的非静态成员?
【发布时间】:2014-05-15 15:05:16
【问题描述】:

我是 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的新手。 :)

【问题讨论】:

  • 这是不可编译的代码。类定义中不能直接调用方法,应该在方法中调用。
  • @JeroenVannevel 是的,syso 是代码更改。如果你要编辑,只做缩进。
  • syso 是 Eclipse 中的一个快捷方式,我发现仅仅为此而恢复我的编辑是不合理的。如果你这样做了,那么我建议你接受我的编辑并将其放回原处,但至少保持其他更改不变。
  • 你的例子是完全错误的。如果您尝试从静态上下文访问实例变量,您只会收到您所说的错误。因此,您的子类或子类中的方法必须是静态的才能收到此错误。
  • 好的,现在您已经向我们展示了一个完整的示例:这与abstract 无关。在第一个示例中,您从静态方法中引用 id,而在第二个示例中,您没有。

标签: java abstract-class abstraction


【解决方案1】:

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

first 示例尝试从 static 上下文 访问 id,这是不允许的,但您会收到错误消息(Cannot make a static reference to the non-静态字段 id)。

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

第二个示例中,您创建了一个类的实例,并且可以从该实例中访问id。这是来自非静态上下文的引用。

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

因此,如果您在第二个示例中创建类似的实例并从 非静态 方法访问 id,那么您可以在第一个示例中实现相同的效果..

【讨论】:

  • 嗯...这就是我现在所理解的。 :) 顺便谢谢。
  • 没问题。请在第一时间提供更好的示例,以避免“格式”、“不可编译”的 cmets。所以你会得到更好更快的反馈。
【解决方案2】:

无法对非静态字段 id 进行静态引用

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

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-02-23
    相关资源
    最近更新 更多