如何解决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
相关产品推荐
相关产品推荐

