第五章《类的继承》第4节:属性的屏蔽

本文探讨了Java中子类如何通过同名属性屏蔽父类属性,包括重新设置默认值、类型不同以及final关键字的影响。子类可以自由定义与父类属性相同名称的属性,无论类型、默认值或final修饰,都不会阻止子类的属性屏蔽行为。这种屏蔽不会影响到方法重写,final关键字在属性与方法前的作用也有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一小节详细阐述了Java语言中方法重写的相关知识。很多读者都会问:方法可以被重写,属性是否也能被重写呢?在此首先澄清一个概念:当子类中定义了一个属性,并且该属性的名称与父类中的某个属性名称相同,这种情况并不叫做“重写”或“覆盖”,而是被称为“屏蔽”。

Java语言允许子类用名称相同的属性去屏蔽父类的某个属性。子类在屏蔽父类属性时有如下几个语法特点:

一、子类属性可以重新设置属性的默认值,例如:

class A{
    int x = 1;
}

class B extends A{
    int x = 5;
}

在以上代码中定义了两个类A和B,其中B是A的子类。父类A中所定义的属性x默认值是1,而子类B中所定义的同名属性屏蔽了A类中的x,其默认值也被重新设置为5,这种重新设置属性默认值的情况并不会引起语法错误。而当子类B的某个方法中调用属性x时,将会调用到子类B中的x,也即值为5的那个x。如果在B类的方法中希望调用到A类所定义的属性x,也需要在它的前面加上super关键字,语法格式如下:

super.属性名称

二、子类属性可以与父类属性类型不同,例如:

class A{
    int x = 1;
}

class B extends A{
    double x = 5.0;
}

以上代码中,父类A所定义的属性x是int型,而子类B所定义的同名属性x是double型,虽然属性类型发生了变化,但这种情况并不会引起语法错误。如果B有一个子类C,那么C类将会继承double型的x而不是int型的x。当然,C类也可以重新定义一个其他类型的属性x屏蔽掉B类中x。总之,子类所定义的属性并不会被其父类同名属性的类型所限制。

三、final关键字并不能阻止父类属性被屏蔽,例如:

class A{
    final int x = 1;
}

class B extends A{
    int x = 5;
}

以上代码中,父类A所定义的属性x被final关键字所修饰,但子类B仍然可以定义一个同名属性x,并且重新设置其默认值。有读者会问:为什么父类中的方法前面加上final关键字就能阻止方法被重写,但属性前面加上final关键字就不能阻止属性被屏蔽呢?这是因为final关键字用于方法之前和属性之前的作用不同而导致的。final关键字出现在方法之前,其作用是阻止子类重写该方法。而final关键字出现在属性之前,其作用是使得该属性的值不能被修改,成为一个常量,但并不能阻止该属性被子类所屏蔽。子类如果屏蔽了父类中带有final关键字的属性,并且在子类中这个属性的前面没有final关键字,那么在子类中这个属性的值是可以被修改的。

通过以上三个语法特点可以看出:所谓属性的屏蔽,本质上就是子类对父类某个属性的重新定义。也就是说,无论父类定义的属性是什么类型,其默认值是多少,有没有被final关键字所修饰,子类都可以对该属性进行重新定义。重新定义的属性与父类中原本的属性相比,它的类型、默认值都可以不相同。当然,子类如果有“后代”,那么这些“后代”将会继承到重新定义之后的属性,除非它再次对该属性进行重新定义。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆哥讲Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值