Java内部类Punto实例创建及set方法调用报错解决方案
解决Java静态上下文访问非静态内部类的问题
老哥,你碰到的这个non-static variable this cannot be referenced from a static context错误,本质是非静态内部类依赖外部类实例,但静态方法(比如main)属于类本身,没有关联的外部类实例,所以直接创建非静态内部类对象会失败。下面给你两种可行的解决方案:
方案1:把内部类改为静态内部类
如果你的Punto类不需要访问外部类PrimerPrograma的非静态成员,直接给Punto加上static修饰符,让它变成静态内部类——静态内部类不依赖外部类实例,静态方法里可以直接实例化:
public class PrimerPrograma{ // 添加static修饰,转为静态内部类 public static class Punto{ int x; int y; public Punto(int lax, int lay){ x=lax; y=lay; } public void set(int lax, int lay){ x=lax; y=lay; } } // 建议把main方法放在外部类(更符合Java规范) public static void main(String[]args){ Punto p=new Punto(5,5); p.set(8,8); System.out.println(p.x+p.y); // 会输出16 } }
方案2:先创建外部类实例,再实例化非静态内部类
如果Punto必须是非静态内部类(比如需要访问外部类的非静态属性/方法),那你得先创建外部类PrimerPrograma的实例,再通过这个实例来创建Punto对象:
public class PrimerPrograma{ public class Punto{ int x; int y; public Punto(int lax, int lay){ x=lax; y=lay; } public void set(int lax, int lay){ x=lax; y=lay; } } public static void main(String[]args){ // 第一步:创建外部类实例 PrimerPrograma outerInstance = new PrimerPrograma(); // 第二步:通过外部实例创建内部类对象 Punto p = outerInstance.new Punto(5,5); p.set(8,8); System.out.println(p.x+p.y); // 输出16 } }
简单总结下:非静态内部类相当于外部类实例的“附属品”,必须先有外部类的对象,才能创建它;静态内部类则是独立的,和外部类实例无关,静态方法里直接用就行。
内容的提问来源于stack exchange,提问作者Alberto Escalera Ramos
相关产品推荐
相关产品推荐

