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. JFrame图形界面 ----鼠标消息

    #开始 不管是什么GUI 按钮的存在都是必不可少的而且还会有很多奇怪的按钮 #代码 package window; import java.awt.Container; import java.awt ...

  2. MySQL复制入门

    Ⅰ.复制类型 1.1 逻辑复制 记录每次逻辑操作 主从数据库可以不一致 1.2 物理逻辑复制 记录每次对于数据页的操作 主从数据物理严格一致 基于重做日志 说明: 如果一个块(页)修改了,就把这个修改 ...

  3. JDK源码分析-String、StringBuilder、StringBuffer

    String类的申明 public final class String implements java.io.Serializable, Comparable<String>, Char ...

  4. Invalid character found in method name. HTTP method names must be tokens

      o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header Note: further occurrenc ...

  5. bzoj 2588 树上主席树

    主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]] 去重竟然要减一,我竟然不知道?? #include<cstdio> #include& ...

  6. bzoj 1064 假面舞会 图论??+dfs

    有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...

  7. BZOJ_4325_NOIP2015 斗地主_DFS

    BZOJ_4325_NOIP2015 斗地主_DFS Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游 ...

  8. java面试题总结

    一.http://blog.csdn.net/moneyshi/article/details/50786786 二.http://blog.csdn.net/moneyshi/article/det ...

  9. 【已解决】【Mac】 运行adb提示command not found,需要配置adb环境

    问题:运行adb提示command not found  解决措施: 1.下载安装:android-sdk-macosx 下载路径:http://down.tech.sina.com.cn/page/ ...

  10. XSS攻击(出现的原因、预防措施......)

    验证XSS攻击重点不是去查找可输入哪些内容会出现什么样的bug就是测试XSS攻击,重点是了解它出现的原理,为什么会出现XSS攻击,导致一些问题出现?如何防御与解决XSS攻击?以下我将简单介绍以上提出的 ...