Java Shadowing 影子变量 影子声明

如果特定范围(例如内部类或方法定义)中的类型声明(例如成员变量或参数名称)与封闭范围中的另一个声明具有相同的名称,则该声明会隐藏封闭范围中的声明。您不能仅通过名称来引用影子声明。以下示例 ShadowTest 演示了这一点:

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的变量:ShadowTest类的成员变量、内部类FirstLevel的成员变量、方法methodInFirstLevel中的参数。定义为方法methodInFirstLevel 的参数的变量 x 隐藏了内部类FirstLevel 的变量 x。因此,当您在方法methodInFirstLevel 中使用变量 x 时,它指的是方法参数。要引用内部类 FirstLevel 的成员变量,使用关键字 this 来表示封闭范围:

System.out.println("this.x = " + this.x);

引用通过它们所属的类名包围更大范围的成员变量。例如,以下语句从方法 methodInFirstLevel 访问类 ShadowTest 的成员变量:

System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值