从内部类读取外部类的值

时间:2014-03-06 06:34:50

标签: java global-variables inner-classes outer-classes

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

我在这里尝试了解主要内容。 我的Main类是一个Android Activity类,它扩展了ListActivity,Demo类扩展了AsyncTask。我需要从doInBackground方法读取值静态字符串。

3 个答案:

答案 0 :(得分:0)

当您想要从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值。在此,abnon-staticsstatic。因此,要获得正确的值,您必须将所有值声明为static,如下所示......

    public static String s;
    static String a="hello";
    static String b="World";

答案 1 :(得分:0)

Inner类始终可以直接访问所有变量,而无需使用任何对象或类名。因此,您可以直接引用外部类的变量,而无需提及其名称。

而不是m=Main.this.s;您可以直接访问变量s m=s;

它的面向对象编程的基本规则,Inner类总是完全访问outter类的所有方法和变量。

答案 2 :(得分:0)

- 首先,我不会向您展示您在此提到的确切示例,因为您的问题不是此示例,而是了解如何访问内部类成员

修改示例:

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,您可以从内部类访问外层成员,如下所示:

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

    }

}