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)的更多相关文章

  1. Java核心技术第五章——1.类、超类、子类(2)

    继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...

  2. Java核心技术第五章——2.Object类

    Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的.但是并不需要这样写: public class Emloyee extends Object ...

  3. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java异常第五章:一定会被执行的finally代码块

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  5. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第十五章:Unicode与转义字符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第三十七章:类与字段

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. ASP.NET三剑客 HttpApplication HttpModule HttpHandler 解析

    我们都知道,ASP.Net运行时环境中处理请求是通过一系列对象来完成的,包含HttpApplication,HttpModule, HttpHandler.之所以将这三个对象称之为ASP.NET三剑客 ...

  2. latex中长公式换行,很好的办法

    今天在编辑公式时,有一个公式很长,写到一行就出去了.当时之前换行都是方程组或者在括号完之后换,都没有问题.但是今天我也换行的是在括号中间断开.这样出现问题,编辑的时候会出错误提醒.上网查了一些论坛,也 ...

  3. 4.app是怎么炼成的

    很多刚进入app后端的小伙伴,有的是之前没有接触过这个行业,有的是只在学校学习了基本的技术知识,不知道开发app的整个流程是怎么样的,因此心里会有一股恐惧.听着别人口中的一大串app相关的术语,也不知 ...

  4. 如何查找Linux服务器上JDK安装路径?

    成功远程到你要部署软件的Linux服务器上.这是第一步. 查看JDK版本:java -version 查看java执行路径:which java 查看JAVA_HOME路径:echo $JAVA_HO ...

  5. Spring IOC知识点一网打尽!

    前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总 ...

  6. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

  7. 删除外部dwg中指定的块定义

    本例实现删除外部图纸中指定的块定义,在外部图纸当前模型空间中是没有该块定义的块参照存在. 代码如下: void CBlockUtil::DeleteBlockDefFormOtherDwg(const ...

  8. BZOJ_3438_小M的作物_最小割

    BZOJ_3438_小M的作物_最小割 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物) ...

  9. java可用与串口通信的一些库

    java原生对串口的支持只有javax.comm,javax.comm比较老了,而且不支持64位系统,我在看jlibmodbus(一个java实现的modbus协议栈)的时候发现了几个可供使用的jav ...

  10. Python中pathlib模块

    Python中pathlib模块 Path.cwd():返回当前目录的路径 Path.home():返回当前用户的家目录 Path.stat():返回此路径信息 Path.touch():创建文件 P ...