java—如何访问同名的外部类变量?

zynd9foi  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(272)

我做了一个外部类和一个内部类。这两个类都有变量 int x . 如何访问 x 外部阶级在内部阶级。 this.x 不起作用。

class OuterClass {
int x,y;
private class InnerClass {
    private void printSum(int x,int y) {
        this.x=x;
        this.y=y;
    }
  }
}
tjvv9vkg

tjvv9vkg1#

你可以试试这个:

private void printSum(int x,int y) {
       OuterClass.this.x=x;
       OuterClass.this.y=y;
    }
4jb9z9bj

4jb9z9bj2#

如果要执行此操作,首先需要示例化外部类,然后示例化内部类,如下所示:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    int x,y,sum;

    public static void main (String[] args) throws java.lang.Exception
    {
        //Create outer object
        Ideone ideOne = new Ideone();

        //instantiate inner object, and call method
        Ideone.InnerClass ic = ideOne.new InnerClass();
        ic.printSum(5,4);
    }

    private class InnerClass {
        private void printSum(int x,int y) {
            //reference the outer object instance
            Ideone.this.x=x;
            Ideone.this.y=y;
            Ideone.this.sum = x + y;
            System.out.println(Ideone.this.sum);
        }
    }
}

已经在这里进行了测试:http://ideone.com/e.js/drizsg

Output: 9
vcirk6k6

vcirk6k63#

使用 OuterClass.this.x ; OuterClass.this 引用父对象(从中 InnerClass 对象已生成)。
请考虑以下oracle官方教程中发布的黯然失色的示例:

public class ShadowTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

与输出

x = 23
this.x = 1
ShadowTest.this.x = 0
``` `x = 23` 指方法的局部变量 `void methodInFirstLevel()` ,  `this.x = 1` 指公共字段 `x` 的 `FirstLevel` 内部阶级,以及 `ShadowTest.this.x = 0` 指公共字段 `x` 的 `ShadowTest` 外层阶级。
w8ntj3qf

w8ntj3qf4#

另一种方法是使外部类成员受到保护

public class OuterClass {

 protected int x=10,y=20;

private class InnerClass {

    private void printSum(int x1,int y1) {
        x=x1;
        y=y1;
    }

  }

 }

相关问题