【问题标题】:Wants static but can't support?想要静态但无法支持?
【发布时间】:2021-04-18 21:11:17
【问题描述】:

我正在尝试创建一个也显示信息的随机汽车生成器。我以为我拥有一切,直到randomCar 部分。它说

'com.company.Main.this' 不能从静态上下文中引用

switch 中的return 语句下。有没有想过我可能会出错的地方?

 package com.company;
 
public class Main {
 
    class Car{
        private String name;
        private boolean engine;
        private int cylinders;
        private int wheels;
 
        public Car(String name){
            this.name = name;
        }
 
        public String getName(){
            return name;
        }
 
 
        public int getCylinders() {
            if(cylinders == 0){
                System.out.println("Unknown amount of cylinders");
            }
            return cylinders;
        }
 
        public int getWheels() {
            return wheels;
        }
 
        public boolean isEngine() {
            return engine;
        }
    }
 
    class Tacoma extends Car{
 
        public Tacoma(String name) {
            super("Tacoma");
        }
 
 
        public boolean isEngine(boolean engine) {
            return true;
        }
 
 
        public int getCylinders(int cylinders) {
            return 6;
        }
 
 
        public int getWheels(int wheels) {
            return 4;
        }
    }
 
    class Motorcycle extends Car{
 
        public Motorcycle(String name) {
            super("Harley Davidson");
        }
 
 
        public boolean isEngine(boolean engine) {
            return true;
        }
 
 
        public int getCylinders(int cylinders) {
            return 2;
        }
 
 
        public int getWheels(int wheels) {
            return 2;
        }
    }
 
    class Volvo extends Car{
        public Volvo(String name) {
            super("Volvo");
        }
 
 
        public boolean isEngine(boolean engine) {
            return true;
        }
 
        public int getCylinders(int cylinders) {
            return 4;
        }
 
 
        public int getWheels(int wheels) {
            return 4;
        }
    }
 
 
 
    public static void main(String[] args) {
   for (int i = 1; i<6; i++){
       Car car = randomCar();
        System.out.println("Car # " + i + ":" + car.getName() + "\n" +
                "Number of cylinders: " + car.getCylinders() + "\n" +
                "Number of wheels: " + car.getWheels()+ "\n" +
                "Engine is: " + car.isEngine());
       }
    }
 
    private static Car randomCar() {
        int randomNumber = (int) (Math.random()*5) +1;
        System.out.println("Random number generated is: " + randomNumber);
        switch (randomNumber){
            case 1:
                return new Tacoma(); // This is where I am getting an error
            case 2:
                return new Motorcycle(); // This is where I am getting an error
            case 3:
                return new Volvo(); // This is where I am getting an error
        }
        return null;
    }
}

【问题讨论】:

    标签: java intellij-idea compiler-errors static return


    【解决方案1】:

    我会从这里开始阅读:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html -> 实际上,那里的所有章节都会对你有用:https://docs.oracle.com/javase/tutorial/java/javaOO/index.html

    严格来说,要解决“无法从静态上下文中引用”的问题,您只需将类设为静态(汽车、塔科马、摩托车、沃尔沃)static class Car{

    从我的角度来看,您不需要嵌套类,只需在与 Main 类相同的包中创建类,您应该一切顺利(随意创建更多包以更好地构建您的类)

    此外,我假设您的代码正在进行中,因为它存在多个问题:

    • 这样的方法没有意义public boolean isEngine(boolean engine) {return true;} 你收到一个你忽略的参数并返回一个常量值:true;我假设您在这里想要做的是拥有不同类型的汽车,每种汽车都有自己的预定义特征,但为此您应该设置父级 Car 中的属性值。为此,您可以定义受保护的设置器,使字段受保护,或者最好创建接受所有值的构造函数
            public Car(String name, boolean engine, int cylinders, int wheels) {
                this.name = name;
                this.engine = engine;
                this.cylinders = cylinders;
                this.wheels = wheels;
            }
    

    你可以在塔科马拥有

            public Tacoma(String name) {
                super(name, true, 6, 4);
            }
    
    • 运行您的代码,我得到了 randomNumber 5,因此返回 null 并得到一个 NPE,我认为工作正在进行中
    • 在您的开关中,您正在调用默认构造函数 new Tacoma(),但由于您定义了带参数的构造函数、使用可用构造函数或创建无参数构造函数,因此该构造函数不再可用。

    关于 OOP 原则还有其他问题,所以我建议再次阅读它们,只需谷歌“java OOP 原则”然后“SOLID”......那里有很多很棒的资源,你只需要时间和耐心,你会到达那里的!

    【讨论】:

    • 关于 return true; 我会将其表述为“您返回一个 constant 值”而不是“您返回一个 static 值”,尤其是避免与静态的其他用途得出结论,在这里。
    • 我的意思是输入“困惑”,而不是“结论”。谢谢,+1。
    • 嘿乔治!感谢您的反馈和帮助。你是对的,这是一项正在进行的工作,由于我对 Java 有点陌生,你的解释很有帮助!
    【解决方案2】:

    当您将 Car 类定义放在 Main 的类定义中时,您将 Car 设为内部类,因此 Car 需要外部类 Main 实例。静态方法中没有 Main 实例,没有它就无法创建 Car。

    有一个立即修复:将关键字 static 添加到 Car 类:

    static class Car { 
    

    这意味着没有指向封闭对象的链接。

    但是在这里将其设为嵌套类没有任何好处,最好不要在开始时将一个类定义放在另一个类中。

    【讨论】:

      【解决方案3】:

      您定义的内部类是 instance 成员,这意味着它们属于 Main 的特定实例,因此无法从没有Main 实例。解决此问题的最简单方法是声明所有内部类 static

      【讨论】:

        【解决方案4】:

        首先,解决您的错误:'com.company.Main.this' cannot be referenced from a static context,将所有方法设为静态:

        static class Car{//code here} 
        static class Volvo extends Car{//code here}
        static class Tacoma extends Car{//code here}
        static class Motorcycle extends Car{//code here}
        

        每当您看到该错误时,这意味着一个静态方法正在调用一个非静态方法。因此,只需使两者都非静态或都静态。唯一的例外是public static void main(String[] args);,它必须static

        解决原来的错误后,还有更多要调试的:

        'Volvo(java.lang.String)' in 'com.company.Main.Volvo' cannot be applied to '()'
        
        'Motorcycle(java.lang.String)' in 'com.company.Main.Motorcycle' cannot be applied to '()'
        
        'Tacoma(java.lang.String)' in 'com.company.Main.Tacoma' cannot be applied to '()'
        

        这意味着您的方法Tacoma()Volvo()Motorcycle() 需要参数String name。所以你所要做的就是给他们一个名字:在这里,它是

        `new Tacoma("cool")`
        
        
        
        new Volvo("car")
        
        
        
        new Motorcycle("harley davidson")`
        

        最后,在解决了静态和参数问题之后,你会得到一个NullPointerException,因为randomCar() 返回null。你的方法Car randomCar(),表示它会返回一个Car,但是返回语句是return null;。因此,出于我们的目的,只需在此处返回 Car - rtn

        private static Car randomCar() {
                int randomNumber = (int) (Math.random()*5) +1;
                System.out.println("Random number generated is: " + randomNumber);
                Car rtn = null;
                switch (randomNumber){
                    case 1:
                        rtn =  new Tacoma("cool"); // This is where I am getting an error
                    case 2:
                        rtn =  new Motorcycle("harley davidson"); // This is where I am getting an error
                    case 3:
                        rtn = new Volvo("car"); // This is where I am getting an error
                }
                return rtn;
            }
        

        这不是您的代码需要的全部调试,但它是一个开始:这是系统到目前为止所做的:

        Random number generated is: 3
        Unknown amount of cylinders
        Car # 1:Volvo
        Number of cylinders: 0
        Number of wheels: 0
        Engine is: false
        Random number generated is: 5
        

        万岁! 这有帮助吗?

        【讨论】:

        • 它做到了!我感谢帮助和反馈。我只是在学习基础知识,所以我不需要深入研究我的代码和调试它!
        • 太棒了!很高兴能提供帮助,并感谢有关答案是否有用的反馈。谢谢!
        猜你喜欢
        • 2017-08-13
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多