问题描述
在学习界面时,我遇到了这种奇怪的行为 当我运行此
int num=20;
public void sound();
public void eat();
}
class Dog implements Animal{
public void sound(){
System.out.println("Wooof!!!!!!!");
}
public void eat(){
System.out.println("Food");
}
}
public class Main{
public static void main(String[]args){
Dog dog=new Dog();
dog.sound();
dog.eat();
System.out.println(Dog.num);
//System.out.println(Dog.num1);
}
}
如果我声明一个没有静态变量的同名变量,则它运行得很好
interface Animal{
int num=20;
public void sound();
public void eat();
}
class Dog implements Animal{
int num=10;
public void sound(){
System.out.println("Wooof!!!!!!!");
}
public void eat(){
System.out.println("Food");
}
}
public class Main{
public static void main(String[]args){
Dog dog=new Dog();
dog.sound();
dog.eat();
System.out.println(Dog.num);
//System.out.println(Dog.num1);
}
}
出现此错误Main.java:22: error: non-static variable num cannot be referenced from a static context
我的问题是因为来自接口的一个是静态的,并且是类级别的,为什么子类(即当我声明一个非静态实例级别的变量时,狗编译失败)。
解决方法
问题是您正在尝试将Dog
类访问到System.out.println()
中。不是初始化类的变量dog
。
如果变量num
不是静态的,则不初始化类就无法读取它,因此,如果您想做Dog.num
,则该变量必须是静态的。
如果您不将变量添加到Dog
类中,则将在接口中声明该值,但是如果该变量存在于类中,则编译器将尝试读取该值。