Я думал, что внутренние классы могут обращаться к внешним переменным класса/методам?
Я прочитал несколько тем, обсуждая внутренние классы, и у меня создалось впечатление, что внутренний класс имеет доступ к переменным и методам охватывающего класса. В следующем случае у меня есть внешний класс и внутренний класс, в тестовом классе я создаю экземпляр внешнего класса, а затем из него создаю экземпляр внутреннего класса. Однако я не могу получить доступ к переменной String a через внутреннюю ссылку на класс. Помогите?
public class OuterClass {
String a = "A";
String b = "B";
String c = "C";
class InnerClass {
int x;
}
public static class StaticInnerClass {
int x;
}
public String stringConCat() {
return a + b + c;
}
}
public class TestStatic {
public static void main(String args[]) {
OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
System.out.println(inner.a);// error here, why can't i access the string
// variable a here?
}
}
Ответы
Ответ 1
Внутренний класс может обращаться к внешним методам и свойствам класса через свои собственные методы. Посмотрите на следующий код:
class OuterClass {
String a = "A";
String b = "B";
String c = "C";
class InnerClass{
int x;
public String getA(){
return a; // access the variable a from outer class
}
}
public static class StaticInnerClass{
int x;
}
public String stringConCat(){
return a + b + c;
}
}
public class Test{
public static void main(String args[]) {
OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
System.out.println(inner.getA()); // This will print "A"
}
}
Ответ 2
Кажется, вы путаете область и доступ. Ссылки могут иметь доступ только к атрибутам и методам объекта, к которому они относятся. Таким образом, ваш inner.a
не может работать.
С другой стороны, внешние переменные класса входят в объем методов в соответствующем внутреннем классе. Таким образом, вы можете сделать то, что хотите, указав аксессуар для чтения.
public class OuterClass {
String a = "A";
String b = "B";
String c = "C";
class InnerClass{
int x;
String getA() {
return a;
}
}
}
public class TestStatic {
public static void main(String args[]) {
OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
System.out.println(inner.getA()); //error should be gone now.
}
}
Ответ 3
inner
- это экземпляр OuterClass.InnerClass
, который не определяет a
, поэтому он не сможет получить к нему доступ в любом случае.
Чтобы понять это простейшим образом... посмотрите на блок, в котором создается a
, и блок, в котором определяется OuterClass.InnerClass
.
public class OuterClass { // a is defined in this block
String a = "A";
class InnerClass{ // InnerClass starts here and an instance will access what is defined now
int x;
}
}
Ответ 4
An Non-static inner class
имеет неявный привязку к OuterClass
.....
Попробуй вот так.....
class OuterClass {
String a = "A";
String b = "B";
String c = "C";
class InnerClass {
String x = a; // Directly uses the instance variable a from Outer class
}
public static class StaticInnerClass {
int x;
}
public String stringConCat() {
return a + b + c;
}
}
public class TestStatic {
public static void main(String args[]) {
OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
System.out.println(inner.x);
}
}
Ответ 5
System.out.println(inner.a);
Вы пытаетесь читать a
, как будто это свойство вашего внутреннего класса, но это не так. Вы должны определить метод, который будет читать искомое свойство внешнего класса. Поэтому в вашем внутреннем классе вы должны:
public String getA(){
return a;
}
System.out.println(inner.getA());
Это должно работать.