Java 无法引用非静态变量

Java 无法引用非静态变量,java,Java,我不能创建狗对象,我应该能够 我不理解编译错误,非静态变量这不能从静态上下文引用 public class Program { abstract class Animal{ private String name; String latin; } abstract class Carnivore extends Animal{} abstract class Herbivore extends Animal{} interface Petable{ public v

我不能创建狗对象,我应该能够 我不理解编译错误,非静态变量这不能从静态上下文引用

public class Program
{

abstract class Animal{
    private String name;
    String latin;
}

abstract class Carnivore extends Animal{}
abstract class Herbivore extends Animal{}

interface Petable{
    public void pet();
}

class Dog extends Carnivore implements Petable{
    public void pet(){System.out.println("bark");}
}


public static void main(String[] args) {
    Dog d = new Dog();
    d.pet();
}
}

您需要将内部类移到Program类之外,否则它们必须用new Program.new Dog实例化

公共课程{ 公共静态无效字符串[]args{ 狗d=新狗; d、 宠物; } } 抽象类动物{ 私有字符串名称; 拉丁字符串; } 类狗扩展肉食动物实现可拍打{ 公共宠物{ System.out.printlnbake; } } 抽象类食肉动物{} 抽象类Herbivore扩展了Animal{} 接口瓣{ 公共宠物; }
感谢@Blokje5和@MC-emperon提供的引用和嵌套实例类实例化语法,请向上投票。

您的嵌套类不是静态的,它们只属于类的成员。要解决此问题,请向类声明中添加static

abstract class Animal{
    private String name;
    String latin;
}
改为

abstract static class Animal{
    private String name;
    String latin;
}

现在,无需初始化类的成员即可使用它们。

所有类都嵌套在程序类中。您的类是所谓的非静态内部类。在您的案例中,如果没有封闭类程序的实例,则无法创建这些类。您有三个选项:您需要将类移动到顶层,使它们不再嵌套,或者将类更改为静态类,或者创建封闭类Dog d=new Program.new Dog的实例。