我是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的新蜜蜂。 :)
答案 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();
}