一、变量隐藏——变量不具有多态性

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 继承中的属性隐藏与方法重写相关推荐

  1. 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 ...

  2. Java笔记013-IDEA、包、访问修饰符、封装、继承、多态、Super、方法重写/覆盖(override)、java的动态绑定机制

    目录 面向对象编程(中级部分) IDE(集成开发环境)-IDEA IDEA介绍 IDE(集成开发环境)-Eclipse Eclipse介绍 IDEA的安装 IDEA的基本介绍和使用 创建一个java项 ...

  3. 转转转!java继承中的this和super

    学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...

  4. java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题

    Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...

  5. css中list_position,css中list-style-position属性的使用方法

    css中list-style-position属性的使用方法 发布时间:2020-09-24 11:07:10 来源:亿速云 阅读:68 作者:小新 这篇文章给大家分享的是有关css中list-sty ...

  6. java finally方法_讲解Java编程中finally语句的使用方法

    讲解Java编程中finally语句的使用方法 在java中的finally关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会 ...

  7. java可以继承私有的,在java继承中,私有属性能否被继承

    其实在继承中,子类可以继承父类的私有属性的内容空间,但是不能继承父类私有属性的访问权限,下面看代码 父类Animal public class Animal { private String name ...

  8. java继承中的一些该注意的问题

    关于继承,我想大多数人都知道,它是面向对象语言中的三大特性之一,所以在这里,关于继承的概念等我就不做详细介绍了,我主要就讲一下大家对他的认识中一些比较容易犯的错误吧.   错误认识1.继承,是将父类中 ...

  9. 利用tab_control控件在对话框中加入属性页的方法详细介绍

    在对话框中加入属性页 方案一 在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个).然后利用Class Wizard来为Tab C ...

最新文章

  1. 命名实体识别NER遗留问题----模型构建
  2. atitit.userService 用户系统设计 v5 q330
  3. Docker 被禁,K8S 救火!
  4. 关于IB_DESIGNABLE / IBInspectable的那些事
  5. 数学建模论文参考大礼包
  6. Excel与DataGridView的操作示例
  7. 人为什么总感觉莫名的心烦?
  8. 如何检测圣诞树? [关闭]
  9. 《Python语言程序设计基础》:第2章:Python程序实例解析:程序练习题
  10. 计算机的录像功能在哪里找,电脑录像的功能在哪,快速开启的方法分享
  11. 计算机控制实验室装置,自控/计控原理实验箱
  12. 基于mysql的报表工具有哪些?值得推荐的mysql报表工具
  13. 说完列表说字典,说完字典说集合,滚雪球学 Python
  14. vue watch store
  15. 六成大学生认为自己毕业10年内会年入百万!
  16. 通过使用SPSS独立样本T检验,分析两组个案的差异(下)
  17. 符号在excel中的引用_如何在Excel中添加项目符号
  18. 蓝桥 区别质因数,因数
  19. 坚持#第89天~胡晨晨会给予我力量!
  20. iOS xcode9中framework静态库的创建以及xib和图片的使用记录

热门文章

  1. wordContrl word文档管理工具
  2. 【人员产量动态看板管理】
  3. HTML5网页术语,web前端之HTML5的一些术语和概念
  4. journal of neuroscience:面孔的神经表征与眼动模式相协调
  5. 世界第一台电子计算机名称是什么,I1世界第一台电子计算机的英文名称是.doc
  6. 必读 | 回顾2020年最掉头发的一个项目
  7. vue实战——电子时钟
  8. 如何在mac使用 ngrok (别听那帮人胡咧咧看我)
  9. 毕设推荐-----------小网站
  10. 电子相册制作软件评测排名