You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决main方法中创建Cube对象时的“AbstractShape.this无法从静态上下文引用”错误?

问题解决:AbstractShape.this cannot be referenced from a static context

错误原因

你的Shapes、Solids、Cube都是AbstractShape的非静态内部类,而main方法是静态方法。静态方法属于类本身,不依赖外部类实例,但非静态内部类必须依附于外部类的实例才能创建对象,所以直接在main里new Cube(4,4,4)会触发该错误。

修复方案

方案1:将内部类改为静态内部类(推荐)

给所有内部类加上static修饰符,让内部类脱离外部类实例的依赖,即可在静态方法中直接创建对象:

public class AbstractShape {
    public static void main(String[] args)throws Exception{
        Cube cube1 = new Cube(4,4,4);
        cube1.calcArea();
        cube1.calcVol(); // 补充调用体积计算方法
        cube1.print();
        Solids [] MySolids = new Solids[2];
    }

    // 加static修饰
    static abstract class Shapes{
        public abstract double getArea();
        public abstract double getVolume();
        public abstract String getName();
    }

    // 加static修饰,同时给Comparable指定泛型避免强制类型转换
    static class Solids extends Shapes implements Comparable<Shapes>{
        protected int len;
        protected int wid;
        protected int hig;
        protected double area;
        protected double volume;

        // 构造方法补充成员变量赋值逻辑
        public Solids(int len, int wid, int hig){
            this.len = len;
            this.wid = wid;
            this.hig = hig;
        }

        // 泛型化后无需强制类型转换,代码更简洁安全
        public int compareTo(Shapes o){
            return Double.compare(getVolume(), o.getVolume());
        }

        public void setLen(int len){
            this.len = len; // 补充实际赋值逻辑
        }
        public void setWid(int wid){
            this.wid = wid;
        }
        public void setHig(int hig){
            this.hig = hig;
        }
        public int getLen(){
            return len;
        }
        public int getWid(){
            return wid;
        }
        public int getHig(){
            return hig;
        }
        public String getName(){
            return "solid";
        }
        public double getArea(){
            return 0.0;
        }
        public double getVolume(){
            return 0.0;
        }
        public void print(){
            System.out.println("Solid of len"+len+" wid"+wid+" hig"+hig);
        }

    }

    // 加static修饰
    static class Cube extends Solids{
        // 移除重复定义的len、wid、hig,直接复用父类成员变量
        public Cube(int len, int wid, int hig){
            super(len,wid,hig);
            // 父类构造已完成赋值,无需重复操作
        }
        public void calcArea(){
            area = 6*len*len;
        }
        public void calcVol(){
            volume = len*len*len;
        }
        public double getVolume(){
            return volume;
        }
        public double getArea(){
            return area;
        }
        public String getName(){
            return "Cube";
        }

    }
}

方案2:先创建外部类实例再生成内部类对象

如果必须保留非静态内部类结构,需要先实例化外部类,再通过外部类对象创建内部类实例:

public static void main(String[] args)throws Exception{
    AbstractShape outer = new AbstractShape();
    Cube cube1 = outer.new Cube(4,4,4);
    cube1.calcArea();
    cube1.calcVol();
    cube1.print();
    Solids [] MySolids = new Solids[2];
}

额外代码优化点

  • Solids原构造方法未给成员变量赋值,导致后续计算、打印会使用默认值0,已补充赋值逻辑
  • Cube中重复定义len、wid、hig会覆盖父类变量,造成冗余,已移除
  • calcVol方法需手动调用才能计算体积,否则getVolume会返回0
  • 给Comparable指定泛型Comparable<Shapes>,避免强制类型转换和类型安全问题
  • 原setLen等set方法无实际赋值逻辑,已补充实现

内容的提问来源于stack exchange,提问作者Thomas Hutton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:52:08