He estado aprendiendo Java y OOP durante algunas semanas.
Ayer aprendí clase interna y clase externa. Quiero saber la forma de acceder al campo de la clase exterior desde la clase interior cuando tienen exactamente el mismo nombre.
Como a continuación, es posible acceder al campo de la clase exterior desde la clase interior cuando tienen nombres diferentes.
public class OuterClass { public String OuterName; public OuterClass(String OuterName) { this.OuterName = OuterName; } public class InstanceInnerClass { public String InnerName; public InstanceInnerClass(String InnerName) { this.InnerName = InnerName; } // In this method, accessing field in outer and inner class is possible. // when they have different name. public void printAllName() { System.out.printf("OuterName: %s, InnerName: %s\n", OuterName, InnerName); } } }Cuando tienen el mismo nombre, no sé cómo acceder a ambos nombres.
public class OuterClass { public String name; // field which has same name public OuterClass(String name) { this.name = name; } public class InstanceInnerClass { public String name; // field which has same name public InstanceInnerClass(String name) { this.name = name; } public void printAllName() { // What should be written in this code // to print both name fields from OuterClass and InnerClass System.out.printf("OuterName: %s, InnerName: %s\n", name, name); } } }Simplemente haciendo OuterClass.this y el nombre del campo de la OuterClass a la que desea acceder, por ejemplo, OuterClass.this.OuterName . En su código se vería así:
public class OuterClass { public String name; // field which has same name public OuterClass(String name) { this.name = name; } public class InstanceInnerClass { public String name; // field which has same name public InstanceInnerClass(String name) { this.name = name; } public void printAllName() { // What should be written in this code // to print both name fields from OuterClass and InnerClass System.out.printf("OuterName: %s, InnerName: %s\n", name, OuterClass.this.name); } } }Cuando tiene dos campos con el mismo nombre, uno en la clase interna y el otro en la clase externa ( es decir, sombreado), e intenta acceder desde la clase interna a ese campo, el compilador asume que desea acceder al campo desde la clase interna, e ignora el otro de la clase externa. De lo contrario, sería imposible elegir qué variable usar.
Si una declaración de un tipo (como una variable miembro o un nombre de parámetro) en un ámbito particular (como una clase interna o una definición de método) tiene el mismo nombre que otra declaración en el ámbito adjunto , entonces la declaración sombrea la declaración del alcance envolvente. No puede hacer referencia a una declaración sombreada solo por su nombre.
Los campos de OuterClass son accesibles en InnerClass a través de OuterClass.this :
public void printAllName() { // to print both name fields from OuterClass and InnerClass System.out.printf("OuterName: %s, InnerName: %s\n", OuterClass.this.name, this.name); }Prueba:
OuterClass outer = new OuterClass("myOuter"); OuterClass.InstanceInnerClass inner = outer.new InstanceInnerClass("myInner"); inner.printAllName();huellas dactilares:
OuterName: myOuter, InnerName: myInner