继承中父类、子类构造器中的super. 和super()运用
1)第一种用法:super 关键字是父类对象的引用
package com.example;public class Person{ // 父类public String name="李四";public int age = 18;public void speak(){System.out.println("Person: speak()");}public void cry(){System.out.println("Person: cry()");}
}
package com.example;public class Man extends Person{ // 子类public void speak(){System.out.println("Man: speak()"); super.speak(); // 调用父类的 speakcry(); // 调用父类的 crySystem.out.println("name: " + name); // 调用父类的 nameSystem.out.println("age: " + super.age); // 调用父类的 age
}
public static void main(String[] args){Man m = new Man();m.speak();}
}
运行结果:
Man: speak()
Person: speak()
Person: cry()
name: 李四
age: 18
- 当子类中重写了父类中的方法时,我们在new一个子类对象的时候会先产生一个父类对象,在产生子类对象。那么在调用重写的方法时候,会优先调用子类的方法,但也不是说父类中被重写的方法就没了,其实不是这样的,只是我们要调用父类中被重写的方法要用super.的方式调用。
- 上面代码中父类和子类中都有 speak 方法,所以子类中想要调用父类的 speak 方法时,必须要用 super 关键字(这种情况是子类对父类的方法进行了重写)
- 如果父类中其他方法没有被子类重写,那么在new一个子类对象的时候,子类引用可以直接引用父类中的所有方法和属性,这就是继承。
2)第二种用法:super(参数列表) 调用父类的构造器
例1:
package com.example;public class Person{ public Person(int i){System.out.println("Person" + "(" + i + ")");}public Person(String str){System.out.println("Person" + "(" + str + ")");} class Man extends Person{ public Man(){super(1); // 调用父类构造器System.out.println("Man()");}public Man(int i){super("张三"); // 调用父类构造器System.out.println("Man" + "(" + i + ")");}public Man(String str){super(2); // 调用父类构造器System.out.println("Man" + "(" + str + ")");} }public static void main(String[] args){Man a= new Man("张三");} }
运行结果:Person(2) Man(张三)
- 父类构造器只能在子类构造器中调用,不能在子类的方法中调用,父类构造器只能位于子类构造器的第一行
- 如果我们没有给类创建构造器,编译器会为该类自动创建一个默认构造器(无参构造器),如果我们给类创建了构造器,那么编译器便不会再为类创建默认构造器
- 当父类中含有默认构造器时,编译器会在子类的构造器中自动调用父类的默认构造器,以完成父类的初始化。
- 当父类中含有无参构造器时,编译器也会在子类构造器中自动调用父类的无参构造器
- 当父类中只含有有参构造器时,编译器不会在子类构造器中自动调用父类的构造器,此时我们必须在子类的所有构造器中都对父类中的一个构造器进行调用,否则编译时会报错,例如:例子中子类 Man 中的每一个构造器都调用了父类的构造器
- 总结:在继承关系中,父类最好不创建构造器或者在创建多个构造器时要创建一个无参构造器,这样才不用每个子类的构造器都对父类的构造器进行调用
转载于:https://www.cnblogs.com/dmp90/p/8849229.html
继承中父类、子类构造器中的super. 和super()运用相关推荐
- c++中父类子类对象指针相互转换,成员函数调用方式
c++中父类子类对象指针相互转换的问题: 在面向对象开发时,某些场景下需要将子类对象的指针强转成父类指针进行调用,或者,将父类指针强转成子类指针进行调用,这个时候成员函数调用规律是什么样的? 规律:不 ...
- 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)
名人名言:思想好比火星:一颗火星会点燃另一颗火星.一个深思熟虑的教师和班主任,总是力求在集体中创造一种共同热爱科学和渴求知识的气氛,使智力兴趣成为一些线索,以其真挚的.复杂的关系--即思想的相互关系把 ...
- 11 java基础之继承:区分子类方法中变量的三种变量
在子类方法中使用三种同名变量,需要使用super关键字来访问同名的成员变量 /* 局部变量: 直接写成员变量名 本类的成员变量: this.成员变量名 父类的成员变量: super.成员变量名*/ 父 ...
- java子类代码块_java中父类子类静态代码块、构造代码块执行顺序
父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...
- 子类方法中super.父类方法
1.子类方法super.父类方法,并且有自己的方法体内容 下面代码中,子类方法中的"super."的意思就是父类对象调用该方法 2.一个类中只能有一个public的class,别的 ...
- 子类可以继承到父类上的注解吗
转载自 子类可以继承到父类上的注解吗? 不了解注解基础知识的请先看<JDK 5 Annotation\注解\注释\自定义注解> 子类可以继承到父类上的注解吗? 我们知道在编写自定义注解时, ...
- 根据父类id查询所有的父级_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点...
继承 继承(Inheritance)可以实现类之间共享属性和方法,是面向对象编程的另一个特性 使用继承可以最大限度地实现代码复用. 定义:继承就是在已有类的基础上构建新的类,一个类继承已有类后,可以对 ...
- idea实现抽象类的所有抽象方法_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点
继承 继承(Inheritance)可以实现类之间共享属性和方法,是面向对象编程的另一个特性 使用继承可以最大限度地实现代码复用. 定义:继承就是在已有类的基础上构建新的类,一个类继承已有类后,可以对 ...
- java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...
最新文章
- Android:JNI 与 NDK到底是什么
- 不止Markov决策过程,全景式分析强化学习研究内容
- 话里话外:“按单制造”的业务特点(二)
- CF1B Spreadsheets
- 详解Python垃圾回收机制
- 《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托
- Java Hashtable rehash()方法与示例
- java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析
- Oracle表空间的创建
- 脚本同步mysql数据_windows下数据库文件使用脚本同步到linux下的mysql数据库中
- Python+django网页设计入门(18):自定义模板过滤器
- docker 拷贝镜像文件
- 1203.1——条件语句 之 if语句
- 为VS2005添加X64编译平台
- 屏蔽 已阅读59% 前往新浪新闻查看全文
- 语音识别行业技术和市场横向对比
- 【目标检测】目标检测算法-从OverFeat到YOLO
- 电子电路计算机仿真应用,电子电路计算机仿真技术
- web安全工具库(笔记)----端口扫描(端口扫描器.exe)
- Springboot实现拦截器功能