tipos significa que primitivos objeto envolventes envoltorios ejemplos datos concepto clases java inner-classes

significa - No es una clase envolvente de Java.



tipos de java (10)

Estoy tratando de hacer un juego de tetris y obtengo "La forma no es una clase que se incluye" cuando intento crear un objeto

public class Test { public static void main(String[] args) { Shape s = new Shape.ZShape(); } }

Estoy usando clases internas para cada forma. Aquí está parte de mi código

public class Shape { private String shape; private int[][] coords; private int[][] noShapeCoords = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; private int[][] zShapeCoords = { { 0, -1 }, { 0, 0 }, { -1, 0 }, { -1, 1 } }; private int[][] sShapeCoords = { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; private int[][] lineShapeCoords = { { 0, -1 }, { 0, 0 }, { 0, 1 }, { 0, 2 } }; private int[][] tShapeCoords = { { -1, 0 }, { 0, 0 }, { 1, 0 }, { 0, 1 } }; private int[][] squareShapeCoords = { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 } }; private int[][] lShapeCoords = { { -1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; private int[][] mirroredLShapeCoords = { { 1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; public Shape(){ int[][] coords = noShapeCoords; shape = "NoShape"; } class ZShape { int[][] coords = zShapeCoords; String shape = "ZShape"; } class SShape { int[][] coords = sShapeCoords; String shape = "SShape"; } //etc }

Qué estoy haciendo mal ?


A veces, necesitamos crear una nueva instancia de una clase interna que no puede ser estática porque depende de algunas variables globales de la clase principal. En esa situación, si intenta crear la instancia de una clase interna que no es estática, not an enclosing class error de not an enclosing class .

Tomando el ejemplo de la pregunta, ¿qué ZShape si ZShape no puede ser estático porque necesita una variable global de la clase Shape ?

¿Cómo puedes crear una nueva instancia de ZShape ? Así es como:

Agregue un captador en la clase padre:

public ZShape getNewZShape() { return new ZShape(); }

Acceda de esta manera:

Shape ss = new Shape(); ZShape s = ss.getNewZShape();


Como se indica en los docs :

OuterClass.InnerClass innerObject = outerObject.new InnerClass();


En caso de que si la clase padre es singleton se usa de la siguiente manera

Parent.Child childObject = (Parent.getInstance()).new Child();

donde getInstance () devolverá el objeto singleton de la clase padre.


Lo que sugeriría no es convertir la clase no estática en una clase estática porque en ese caso, su clase interna no puede acceder a los miembros no estáticos de la clase externa.

Ejemplo:

class Outer { class Inner { //... } }

Entonces, en tal caso, puedes hacer algo como:

Outer o = new Outer(); Outer.Inner obj = o.new Inner();


Me he encontrado con el mismo problema. Resolví creando una instancia para cada clase pública interna. En cuanto a su situación, le sugiero que use una herencia distinta de las clases internas.

public class Shape { private String shape; public ZShape zShpae; public SShape sShape; public Shape(){ int[][] coords = noShapeCoords; shape = "NoShape"; zShape = new ZShape(); sShape = new SShape(); } class ZShape{ int[][] coords = zShapeCoords; String shape = "ZShape"; } class SShape{ int[][] coords = sShapeCoords; String shape = "SShape"; } //etc }

entonces puedes nuevo Shape (); y visitar ZShape a través de shape.zShape;


No es necesario que la clase anidada sea estática, pero debe ser pública.

public class Test { public static void main(String[] args) { Shape shape = new Shape(); Shape s = shape.new Shape.ZShape(); } }


Supongamos que RetailerProfileModel es su clase principal y RetailerPaymentModel es una clase interna dentro de ella. Puede crear un objeto de la clase interna fuera de la clase de la siguiente manera:

RetailerProfileModel.RetailerPaymentModel paymentModel = new RetailerProfileModel().new RetailerPaymentModel();


Una cosa que no me di cuenta al principio cuando leí la respuesta aceptada fue que hacer que una clase interna sea estática es básicamente lo mismo que moverla a su propia clase separada.

Así, al llegar el error.

xxx no es una clase adjunta

Puedes resolverlo de una de las siguientes maneras:

  • Agregue la palabra clave static a la clase interna, o
  • Moverlo a su propia clase separada.

ZShape no es estático, por lo que requiere una instancia de la clase externa.

La solución más simple es hacer que ZShape y cualquier clase anidada sean static si puedes.

También haría cualquier campo final o static final que pueda también.


Shape shape = new Shape(); Shape.ZShape zshape = shape.new ZShape();