《java解惑》读书笔记8——更多类谜题

本文是《java解惑》读书笔记,详细解释了Java中的隐藏(hide)、遮掩(Obscure)和遮蔽(Shadow)的概念,通过示例代码展示了这些问题在程序中的表现和解决方法,强调了遵循命名规范和理解类型优先级的重要性。
摘要由CSDN通过智能技术生成

1.Java中的隐藏(hide):

问题:

下面的小程序用来演示java中的隐藏,代码如下:

class Base{
    public String className = "Base";
}

class Derived extends Base{
    private String className = "Derived";
}

public class Test{
    
    public static void main(String[] args){
        System.out.println(new Derived().className);
    }
}

有人觉得应该打印输出Base,也有觉得Derived类编译报错,因为同名的变量访问控制权限比父类更严格了。

真实情况确实是程序编译有错,但是不是Derived类编译报错,而是在main函数的打印语境中报错,因为Derived类的className属性是私有的,无法访问。


原因:

java中,子类和父类拥有相同方法签名的方法被称为方法覆盖,在方法覆盖中子类方法的访问控制权限不能被父类更严格,同时子类方法也不能抛出被父类方法更多的异常。

而子类和父类拥有同名的变量被称为变量隐藏(hide),变量隐藏没有访问控制权限的限制,因此虽然Base类中的className属性是共有的,子类Derived类可以继承,但是由于子类Derived中拥有同名的className变量,即使是私有的,Derived类的className变量还是会隐藏了父类Base类的className变量。


结论:

如果想要解决上述程序中变量隐藏带来的编译错误,有以下两种解决方法:

方法1:使用类型转换将子类转换父类,代码如下:

class Base{
    public String className = "Base";
}

class Derived extends Base{
    private String className = "Derived";
}

public class Test{
    
    public static void main(String[] args){
        System.out.println(((Base)new Derived()).className);
    }
}

此时程序的打印输出结果为Base。

方法2:使用方法覆盖代替变量隐藏,代码如下:

class Base{
    public String getClassName() {
        return "Base";
    }
}

class Derived extends Base{
    public String getClassName() {
        return "Derived";
    }
}

public class Test{
    
    public static void main(String[] args){
        System.out.println(new Derived().getClassName());
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值