Java核心技术第五章——1.类、超类、子类(1)
1.定义子类:
关键字extends表明正在构造的新类派生与一个已存在的类。已存在的类称为超类、基类或父类;新类称为子类、派生类或孩子类。超类和子类是Java程序员最常用的两个术语(emmm~~我觉得是叫父类比超类多)。
父类Employee
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary,int year, int month, int day) {
this.name = name;
this.salary = salary;
this.hireDay = LocalDate.of(year,month,day);
}
}
子类Manager,通过extends关键字继承父类Employee
public class Manager extends Employee{
//奖金
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
this.bonus = 0;
}
}
在通过扩展超类定义子类的时候,仅需要指出子类与超类的不同之处。因此在设计类的时候,应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中,这种将通用的功能放到超类的做法,在面向对象程序设计中十分普遍。
2.覆盖方法:
超类中有些方法对子类并不一定使用。例如Employee(员工)类的getSalary返回薪水的方法并不使用于Manager(经理)类的返回薪水的方法。为此,需要提供一个新的方法来覆盖超类中的这个方法。
Employee的返回薪水方法如下:
public double getSalary() {
return salary;
}
Manager覆盖Employee返回薪水的方法如下:
public double getSalary(){
double baseSalary = super.getSalary();
return baseSalary + bonus;//基本工资 + 奖金
}
注意:super只是一个指示编译器调用超类方法的特殊关键字。
在子类中可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。
3.子类构造器:
如果子类的构造器没有显示地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显示地调用超类的其他带参数的构造器,则Java编译器将报告错误。
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary,int year, int month, int day) {//父类的带参构造器
this.name = name;
this.salary = salary;
this.hireDay = LocalDate.of(year,month,day);
}
public double getSalary() {
return salary;
}
}
public class Manager extends Employee{
//奖金
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);//子类显示调用父类的带参构造器。
this.bonus = 0;
}
//设置奖金
public void setBonus(double bonus){
this.bonus = bonus;
}
}
4.继承层次:
由一个公共超类派生出来的所有类的集合被称为继承层次。在继承层次中,从某个特定的类到其祖先类的路径被称为该类的继承链。
5.多态
在Java程序设计语言中,对象的变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类对象,
例如:
Employee e = new Employee();
Employee m1 = new Manager();
Manager m2 = new Manager();
在上面的例子中,m2.setBonus(5000)是可以调用的,而m1.setBonus(5000)是不能调用的。
即使m1引用的对象是Manager,但是m1的声明类型是Employee,而setBonus方法并不是Employee类的方法。所以不能调用。
m1.setBonus(5000);//编译错误
m2.setBonus(5000);
在Employee m1 = new Manager();这样的引用叫做向上转型。即子类的引用指向父类。那么就只能使用父类的属性和方法。那么问题来了,如果向上转型后子类的引用都调用不了自己的方法了,那咋办?在子类定义的方法怎么办?
此时就要重写方法了。就是我上面所说的第二小节覆盖方法,即使向上转型了,也可使用父类的方法和子类的方法。
Employee类的messager方法
public void messager(){
System.out.println("我是Employee");
}
Manager类的messager方法
public void messager(){
System.out.println("我是Manager");
}
测试
Employee e = new Employee();
Employee m1 = new Manager(); e.messager();
m1.messager();
结果
我是Employee
我是Manager
总结一下Java多态的必要条件,有三个:
1.继承:在多态中必须存在继承的关系
2.重写:子类重写父类的方法。那么在调用其方法时才会调用到子类的方法。
3.向上转型:子类的引用指向父类。只有这样才可以调用父类的方法(没有被重写的方法)和子类的方法(被子类重写的方法)
欢迎大家在评论区指出不足之处 ~Thanks♪(・ω・)ノ
Java核心技术第五章——1.类、超类、子类(1)的更多相关文章
- Java核心技术第五章——1.类、超类、子类(2)
继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...
- Java核心技术第五章——2.Object类
Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的.但是并不需要这样写: public class Emloyee extends Object ...
- “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第五章:一定会被执行的finally代码块
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十五章:Unicode与转义字符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十七章:类与字段
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- Load balancer does not have available server for client
最近在研究spring-cloud,研究zuul组件时发生下列错误: Caused by: com.netflix.client.ClientException: Load balancer does ...
- php对接微信小程序支付
前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...
- c# Socket通信异步TCP
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- hibernate关系映射
多对一:比如多个订单对应同一个用户,需要在订单表中添加一个用户的属性 订单类: private Integer orderId; private Date createTime; private Us ...
- php自带验证邮箱 url ip函数
以前用PHP验证邮箱.URL.IP是否合法都是通过自己写正则来实现,但是有时候脑子发昏,可能会写出一个不是完全正确的正则,导致验证出错,今天发现原来PHP本身自带了验证邮箱.URL.IP是否合法的函数 ...
- TestNG监听器实现用例运行失败自动截图、重运行功能
注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...
- GO语言.树莓派.环境安装和测试
Go是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识别,有时会将其称为Golang 记录一下如何在树莓派上安装语言环境 第一步: 下载安装包 http ...
- stop_token.go
package engine import ( "bufio" "log" "os" ) type StopToke ...
- Netty4.x整合SpringBoot2.x使用Protobuf3详解
前言 本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容.Protobuf会介绍下用法,至于Netty在netty 之 telnet HelloWor ...
- ssm客户管理系统的设计与实现
ssm客户管理系统 注意:系统是在实现我的上一篇文章 https://www.cnblogs.com/peter-hao/p/ssm.html的基础上开发 1 需求 1.1 添加客户 客户 ...