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. Python题库

    Date:2018-05-08 1.Given: an array containing hashes of names Return: a string formatted as a list of ...

  2. Java描述数据结构之链表的增删改查

    链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础 ...

  3. Java 并行与并发

    Java 并行与并发 注意两个词:并行(Concurrent) 并发(Parallel) 并行:是逻辑上同时发生,指在某一个时间内同时运行多个程序 并发:是物理上同时发生,指在某一个时间点同时运行多个 ...

  4. Celery beat实现定时/轮询任务

    Celery定时任务 配置 启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE .  Celery的定时任务都由celery beat来进行调度.celery beat默认按照s ...

  5. client.go

    package)*time.Second) ], {         hasConn := false         waitc := time.After(cfg.DialTimeout)     ...

  6. [HNOI2015]菜肴制作 拓扑序

    逆序最大字典序拓扑序 反向建边,逆序字典序最大.. #include<cstdio> #include<cstring> #include<iostream> #i ...

  7. DCGAN 代码简单解读

    之前在DCGAN文章简单解读里说明了DCGAN的原理.本次来实现一个DCGAN,并在数据集上实际测试它的效果.本次的代码来自github开源代码DCGAN-tensorflow,感谢carpedm20 ...

  8. 我是庖丁,<肢解IOT平台>之物模型

    前言 物模型是对设备在云端的功能描述,包括设备的属性,数据,服务和事件. 物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language) ...

  9. 聚焦“云开发圆桌论坛”,大前端Serverless大佬们释放了这些讯号!

    4月14日,由云加社区举办的TVP&腾讯云技术交流日云开发专场,暨"腾讯云-云开发圆桌论坛"在北京.深圳两地同步举行. 当天下午,一场主题为"基于大前端和node ...

  10. java常用的框架介绍

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...