Java内部类构造提示无外部类可访问实例错误如何修复
报错原因
你遇到的报错是因为Citizen被定义为Adresse的非静态内部类:Java中非静态内部类会隐式持有外部类的实例引用,无法脱离外部类实例被独立实例化,因此直接调用new Citizen()时会抛出该异常:
"No enclosing instance of type Adresse is accessible. Must qualify the allocation with an enclosing instance of type Adresse (e.g. x.new A() where x is an instance of Adresse)."
修复方案
方案1(推荐):将Citizen改为静态内部类
从业务逻辑来看Citizen仅持有Adresse类型的属性,本身不需要依附Adresse实例存在,只需要在Citizen类定义前添加static关键字即可修复问题:
public class Adresse{ private String rue,ville; private int codepostale,numero; Adresse(String rue,String ville,int num,int code){ this.rue=rue; this.ville=ville; codepostale=code; numero=num; } // 添加static关键字改为静态内部类 static class Citizen{ private String nom,prenom; private Adresse adr; Citizen(String nom,String prenom,String ville,String rue,int num,int code) { this.nom=nom; this.prenom=prenom; this.adr=new Adresse(rue, ville, num, code); } } }
修改后可以直接正常创建Citizen实例:Adresse.Citizen citizen = new Adresse.Citizen("Doe","John","Paris","Champs Elysees",1,75001);
方案2:保留非静态内部类结构,创建时绑定外部类实例
如果业务要求必须保留非静态内部类的定义,那么创建Citizen实例前需要先实例化Adresse,再通过外部类实例创建内部类实例:
// 先创建外部类实例 Adresse adresse = new Adresse("Champs Elysees","Paris",1,75001); // 通过外部类实例调用new创建内部类实例 Adresse.Citizen citizen = adresse.new Citizen("Doe","John","Paris","Champs Elysees",1,75001);
内部类构造方法调用外部类构造方法的方式
针对非静态内部类,可以在内部类构造方法的第一行通过super(参数)的形式调用外部类对应的构造方法,示例如下:
class Citizen{ private String nom,prenom; private Adresse adr; Citizen(String nom,String prenom,String rue,String ville,int num,int code) { // 第一行调用外部类Adresse的带参构造方法 super(rue, ville, num, code); this.nom=nom; this.prenom=prenom; // 直接绑定当前关联的外部类实例即可,不需要重新new Adresse this.adr = Adresse.this; } }
这种方式下创建的Citizen实例,绑定的外部类实例就是通过super调用构造生成的实例,不需要额外传入或者新建Adresse对象。
内容的提问来源于stack exchange,提问作者Rafik Bouloudene

