Чтение значения внешнего класса из внутреннего класса
Public class Main {
public static String s;
String a="hello";
String b="World";
s=a+b;
class Demo{
String m;
m=Main.this.s;
System.out.println(m);
}
}
Вывод должен быть: Hello World
Я просто здесь пытаюсь понять главное. Мой основной класс - это класс Android Activity, который расширяет ListActivity, а Demo класс расширяет AsyncTask. Мне нужно прочитать значение Static String s из метода doInBackground.
3 ответа
Внутренний класс всегда может напрямую обращаться ко всем переменным без использования какого-либо объекта или имени класса. Следовательно, вы можете напрямую ссылаться на переменную вашего внешнего класса, не упоминая ее имя.
Вместо m=Main.this.s;
Вы можете напрямую обращаться к переменной s как m=s;
Основное правило объектно-ориентированного программирования - внутренний класс всегда имеет полный доступ ко всем методам и переменным внешнего класса.
Когда вы хотите получить доступ к любому типу значения переменной из InnerClass
Вы можете напрямую вызвать эту переменную.
Для этого случая Вам не нужно использовать Main.this
чтобы получить доступ к статической переменной нашего класса... просто вызовите ее, как показано ниже...
m = s;
Когда вы хотите получить доступ к static
объект одного класса из другого класса, который не является внутренним классом, то вам нужно использовать имя класса как...
m = Main.s;
не так...
m = Main.this.s;
Итак, ваш класс должен выглядеть так, как показано ниже...
Public class Main{
public static String s;
String a="hello";
String b="World";
s = a + b;
class Demo{
String m;
m = s;
System.out.println(m);
}
}
Обновить:
Результат дает вам null
потому что вы вставляете non-static
значение для static
объект. Вот, a
а также b
являются non-static
а также s
является static
, Итак, чтобы получить правильное значение, вы должны объявить их все как static
как показано ниже...
public static String s;
static String a="hello";
static String b="World";
- Во-первых, я не покажу вам точный пример того, что вы упомянули здесь, потому что ваша проблема не в этом примере, а в том, чтобы понять, как получить доступ к внутренним членам класса.
Модифицированный пример:
package com.cyberfreaky.test;
public class Main {
public static String static_string = "hello";
public String nonstatic_string = "world";
class Demo {
String m = "";
String n = "";
public void getStaticString() {
m = static_string;
System.out.println(m);
}
public void getNonStaticString() {
n = nonstatic_string;
System.out.println(n);
}
}
public static void main(String[] args) {
Main outerClass = new Main();
Main.Demo innerClass = outerClass.new Demo();
innerClass.getStaticString();
innerClass.getNonStaticString();
}
}
В случае Android вы можете получить доступ к члену Outer Class из Inner Class, как показано ниже:
package com.example.simpleservice;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
public class MainActivity extends Activity {
int i = 0;
static int x = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
class InnerClass extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
int a = i;
int b = x;
return null;
}
}
}