Чтение значения внешнего класса из внутреннего класса

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;
        }

    }

}
Другие вопросы по тегам