JAVA中出现隐藏、遮蔽、和遮掩的情况

避免在无关的变量或无关的概念之间重用名字,避免隐藏、遮蔽、和遮掩

一、隐藏

一个属性、静态方法或内部类可以分别隐藏在其超类中可访问到的具有相同名字(对方法而言就是相同的方法签名)的所有属性、方法或内部类。上述成员被隐藏后,将阻止其被继承
1.父类代码

public class Fu {
    int a = 1;
    public static void fly(){
        System.out.println("Fu want to fly");
    }

    public class Boy{
        public int age = 20;

        public void read(){
            System.out.println("Fu's boy read");
        }
    }
};

2.子类代码

public class Zi extends Fu {
    int a = 2;
    public static void fly(){
        System.out.println("Zi want to fly");
    }

    public class Boy{
        public int age = 23;

        public void read(){
            System.out.println("Zi's boy read");
        }
    }
}

在这里插入图片描述
在这里插入图片描述

子类继承父类,并具有与父类相同的名字,所以子类的变量a、方法Boy() 会隐藏父类的变量a、方法Boy(),引用时,使用的是子类的值或方法。但因为fly()是静态修饰的,不能被继承,所以子类不会隐藏父类的fly()方法,只能使用 类名.方法名 来调用。
在这里插入图片描述

二、遮蔽

一个变量、方法或类可以分别遮蔽在类内部具有相同名字的变量、方法或类。如果一个实体被遮蔽了,那么就无法用简单名引用到它

class TestInnerClass {
    public void test() {
        System.out.println("Other TestInner's method test!");
    }
}

public class TestZ {
    static String name = "My name is zhangsan";

    void test() {
        System.out.println("TestZ's method test!");
    }

    void testInner() {
        TestInnerClass testInnerClass = new TestInnerClass();//实例化重名类
        testInnerClass.test();
    }

    public class TestInnerClass {//遮蔽了外部的类TestInnerClass
        public int test2 = 1;

        public void test() {//遮蔽了类TestZ方法test
            System.out.println("TestInnerClass's method test");
        }

        public void testMethod() {
            String name = "My name's lisi";//遮蔽了类TestZ 的静态属性name
            System.out.println(name);//打印重名变量
            test();//调用重名方法
        }
    }
}

在这里插入图片描述
如果我通过TestZ 类实例化一个TestInnerClass 类,调用testMethod() 方法,test()的输出的结果是 TestInnerClass’s method test 。所以,如果一个实体被遮蔽了,那么就无法用简单名引用到它。
在这里插入图片描述

三、遮掩

遮掩是唯一一种两个名字位于不同的名字空间的名字重用形式,这些名字空间包括:变量,包,方法或类型。如果一个类或一个包被遮掩了,那么你不能通过其简单名引用到它,除非是在这样一个上下文环境中,即语法只允许在其名字空间中出现一种名字

public class Demo {
    static String System;

    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}

在这里插入图片描述
定义的System和Java中已经存在的一个叫系统(System)的类重名,那么它将引用到静态变量上,而不是类上,所以会报编译错误。

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值