Java 继承中的属性隐藏与方法重写
一、变量隐藏——变量不具有多态性
Java 中的变量不遵循多态性,所以重写仅适用于方法,而不适用于变量。 并且,当子类中的实例变量与父类中的实例变量具有相同的名称时,则从引用类型中选择该实例变量。
在 Java 中,当子类中的实例变量与父类中的实例变量具有相同的名称时,子类的变量将隐藏父类的变量,即使它们的类型不同
。 这种概念称为可变隐藏。
在变量隐藏中,子类隐藏继承的变量而不是替换它们,这基本上意味着子类的对象包含两个变量,而子变量则隐藏了父变量。我们可以通过 super.x 来访问父类中的变量
。
示例:
class Parent {String x = "Parent`s Instance Variable";public void print() {System.out.println(x);}
}class Child extends Parent {String x = "Child`s Instance Variable";@Overridepublic void print() {System.out.print(x);// 可以通过 super.x 访问父类被隐藏的变量System.out.print(", " + super.x + "\n");}
}Parent parent = new Child();
System.out.println(parent.x)
Child child = new Child();
System.out.println(child.x)
结果:
Parent`s Instance Variable
Child`s Instance Variable
解析:
在 Java 中,当我们在Child类中使用已经用于在Parent类中定义变量的名称定义变量时,Child类的变量将隐藏父类的变量。
因此当我们尝试通过持有子对象来从父对象的引用访问该变量时,将调用父类中的变量
。因此我们知道实例变量是从引用类型而不是实例类型中选择的,并且多态性不适用于变量
。
为什么变量被设计为跟随隐藏而不是覆盖?
因为如果我们在子类中更改其类型,则变量覆盖可能会破坏从父级继承的方法。
每个子类都从其父类继承变量和方法(状态和行为)。 如果 Java 允许变量覆盖,它将破坏使用该变量的任何方法,并且由于子代已从父代继承了这些方法,因此编译器将在子类中给出错误。
二、方法重写——方法具有多态性
在方法覆盖的情况下,覆盖方法完全替换了继承的方法,因此当我们尝试通过持有子对象来从父对象的引用访问该方法时,将调用子类中的方法。
我们可以通过 super.x() 来访问父类中的方法
。
三、super 的使用
1、子类调用被隐藏的父类的变量
此时子类中有一个和父类一样的字段(父类字段被隐藏),
为了获得父类的这个字段我们就必须加上super
。
我们通过 super 是不能访问父类 private 修饰的变量
的,因为这个只属于父类的内部成员,一个对象是不能访问它的 private 成员的。
示例:
public class A {String nameA="A";}public class B extends A{String nameA="B";public void getName() {System.out.println("子类"+nameA);System.out.println("父类"+super.nameA);}public static void main(String[] args) {B b=new B();b.getName(); }
2、子类调用被重写的父类的方法
在子类中,我们重写了父类的方法,如果我们想去调用父类的相同方法,必须要通过 super 关键字显示的指明出来。如果不明确出来,按照子类优先的原则,相当于还是再调用被重写的方法
示例:
public class A {private String nameA="A";public void getName() {System.out.println("父类"+nameA);}public static void main(String[] args) {}}public class B extends A{private String nameB="B";@Overridepublic void getName() {System.out.println("子类"+nameB);super.getName();}public static void main(String[] args) {B b=new B();b.getName(); }
}
3、调用父类的构造方法
因为父类的构造函数不能被继承,因此编译器会自动在子类构造函数的第一句加上 super() 来调用父类的无参构造器
,此时可以省略不写,如果想写上的话必须在子类构造函数的第一句
。可以通过 super 来调用父类其他重载的构造方法
,只要相应的把参数传过去就好。
注意:子类继承父类的时候会自动继承父类的默认构造函数(也就是继承那个无参数的构造函数)。如果你的类里面已经有一个带有参数的构造函数了,而你没有写那个默认的不带参数的构造函数的话,继承的时候子类就会报错,因为系统不知道要不继承哪个构造函数,必须明确的使用super()关键字来描述。所以我们一般为了避免这种错误的发生,在有带有多个构造函数的类里面都会写一个不带参数的构造函数
。
示例:
public class A {private String nameA="A";public A() {}public A(String nameA) {this.nameA = nameA;}}public class B extends A{private String nameB="B";public B() {super("lhj");} }
}
Java 继承中的属性隐藏与方法重写相关推荐
- Java继承中为什么不可以降低父类重写方法的访问权限
1 2 3 4 5 6 7 8 9 10 class A { protected int method1(int a, int b) { return 0; } } public class B ex ...
- Java笔记013-IDEA、包、访问修饰符、封装、继承、多态、Super、方法重写/覆盖(override)、java的动态绑定机制
目录 面向对象编程(中级部分) IDE(集成开发环境)-IDEA IDEA介绍 IDE(集成开发环境)-Eclipse Eclipse介绍 IDEA的安装 IDEA的基本介绍和使用 创建一个java项 ...
- 转转转!java继承中的this和super
学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
- java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...
- css中list_position,css中list-style-position属性的使用方法
css中list-style-position属性的使用方法 发布时间:2020-09-24 11:07:10 来源:亿速云 阅读:68 作者:小新 这篇文章给大家分享的是有关css中list-sty ...
- java finally方法_讲解Java编程中finally语句的使用方法
讲解Java编程中finally语句的使用方法 在java中的finally关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会 ...
- java可以继承私有的,在java继承中,私有属性能否被继承
其实在继承中,子类可以继承父类的私有属性的内容空间,但是不能继承父类私有属性的访问权限,下面看代码 父类Animal public class Animal { private String name ...
- java继承中的一些该注意的问题
关于继承,我想大多数人都知道,它是面向对象语言中的三大特性之一,所以在这里,关于继承的概念等我就不做详细介绍了,我主要就讲一下大家对他的认识中一些比较容易犯的错误吧. 错误认识1.继承,是将父类中 ...
- 利用tab_control控件在对话框中加入属性页的方法详细介绍
在对话框中加入属性页 方案一 在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个).然后利用Class Wizard来为Tab C ...
最新文章
- 命名实体识别NER遗留问题----模型构建
- atitit.userService 用户系统设计 v5 q330
- Docker 被禁,K8S 救火!
- 关于IB_DESIGNABLE / IBInspectable的那些事
- 数学建模论文参考大礼包
- Excel与DataGridView的操作示例
- 人为什么总感觉莫名的心烦?
- 如何检测圣诞树? [关闭]
- 《Python语言程序设计基础》:第2章:Python程序实例解析:程序练习题
- 计算机的录像功能在哪里找,电脑录像的功能在哪,快速开启的方法分享
- 计算机控制实验室装置,自控/计控原理实验箱
- 基于mysql的报表工具有哪些?值得推荐的mysql报表工具
- 说完列表说字典,说完字典说集合,滚雪球学 Python
- vue watch store
- 六成大学生认为自己毕业10年内会年入百万!
- 通过使用SPSS独立样本T检验,分析两组个案的差异(下)
- 符号在excel中的引用_如何在Excel中添加项目符号
- 蓝桥 区别质因数,因数
- 坚持#第89天~胡晨晨会给予我力量!
- iOS xcode9中framework静态库的创建以及xib和图片的使用记录