Java继承详解

"本文详细介绍了Java中的继承概念,包括如何定义子类、覆盖方法以及使用super关键字。此外,还讨论了子类构造器的使用规则。接着,文章深入探讨了多态性,包括"is-a"规则、多态成员的特点以及instanceof关键字的应用。整个讲解旨在帮助读者理解面向对象编程中的核心概念。"
摘要由CSDN通过智能技术生成

继承

1.类、超类和子类

1.1定义子类

有2个类,继承Employee类来定义Manager类,这里使用关键字extends 表示继承

public class Manager extends Employee{
    //add method and fields
}

关键字extends表明正在构造的新类派生于一个已存在的类

  • 已存在的类称为超类、基类或父类
  • 新类称为子类、派生类或孩子类

1.2覆盖方法

父类有些方法对子类不一定适用,就需要提供一个新的方法来覆盖父类中的那个方法

public class Manager extends Employee{
    ...
    public double getSalary(){//重写父类方法
        ...
    }
    ...
}

因为在子类重写父类的方法,方法名相同,所以在子类要调用父类的getSalary()方法,就需要用关键字super解决这个问题

super.getSalary();

准确的写法3

public double getSalary(){//重写父类方法
    						//通过super.getSalary()来在子类中调用父类的方法
       double baseSalary = super.getSalary();
       return baseSalary + bouns;
    }

super的用法

可以访问下面网页进行学习:

[(https://www.cnblogs.com/GDDG123/p/15123532.html)]:

1.3 子类构造器

在例子中**(完整代码在最后)**,我们提供了一个构造器

public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary, year, month, day);//调用父类含有相同参数的构造器
        bonus = 0;
    }

这里的super具有不同的含义。语句

super(name, salary, year, month, day);

是“调用父类Employee中带有name,salary,year,month,day参数的构造器”的简写

1.使用super调用构造器的语句必须是子类的第一条语句

2.如果子类的构造器没有显示地调用父类的构造器,即将自动地调用父类的无参数构造器

3.如果父类没有无参数的构造器,并且在子类的构造器中又没有显示地调用父类的其他构造器,Java编译器就会报告一个错误

  • 关键字this有2个含义:1.指示隐式参数的引用,2.调用该类的其他构造器
  • 关键字super也有2个含义:1.调用父类的方法,2.调用父类的构造器

ManagerTest.java

package com.book.company;

public class ManagerTest {
    public static void main(String[] args)
    {
        // construct a Manager object
        Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
        boss.setBonus(5000);

        Employee staff[] = new Employee[3];

        // fill the staff array with Manager and Employee objects

        staff[0] = boss;
        staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
        staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

        // print out information about all Employee objects
        for (Employee e : staff) {
            System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
        }
    }
}

Manager.java

package com.book.company;

public class Manager extends Employee{
    //add method and fields
    private double bonus;

    public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary, year, month, day);
        bonus = 0;
    }

    @Override
    public double getSalary() {
        double baseSalary = super.getSalary();
        return baseSalary+bonus;

    }

    public void setBonus(double b){
        bonus = b;
    }
}

Employee.java

package com.book.company;

import java.time.LocalDate;

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;
        hireDay = LocalDate.of(year, month, day);
    }

    public String getName()
    {
        return name;
    }

    public double getSalary()
    {
        return salary;
    }

    public LocalDate getHireDay()
    {
        return hireDay;
    }

    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}

1.4多态

"is-a"规则,它指出子类的每个对象也是父类的对象。

"is-a"规则的另一种表述是替换原则,它指出程序中出现父类对象的任何地方都可以使用子类对象替换

例如:

Employee e;
e = new Employee(...);//Employee object expected
e = new Manager(...);//OK,Manager can be used as well

在Java中,对象变量是多态的,一个Employee类类型的变量既可以引用一个Employee类型的对象,也可以引用Employee类的任何一个子类的对象(例如:Manager,Executive,Secretary)

**注意:**在Java中,子类引用的数组可以转换成父类引用的数组,而不用使用强制类型转换,如:下面是一个经理数组

Manager[] managers = new Managers[10];

将它转换成Employee[]数组完全是合法的

Employee[] staff = managers;
1.4.1多态概念

1.多态体现为父类引用变量可以指向子类对象

注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

2.多态的定义与使用格式

​ 定义格式:父类类型 变量名=new 子类类型();

3.理解:

​ 多态是同一个行为具有多个不同表现形式或形态的能力。

​ 多态就是同一个接口,使用不同的实例而执行不同操作。

1.4.2多态成员的特点
  1. 多态成员变量:编译运行看左边
Fu f = new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
  1. 多态成员方法:编译看左边,运行看右边
Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
1.4.3.instanceof关键字

作用:用来判断某个对象是否属于某种数据类型。

  • 注意: 返回类型为布尔类型

    使用案例:

Fu f1=new Zi();
Fu f2=new Son();
if(f1 instanceof Zi){
    System.out.println("f1是Zi的类型");
}
else{
    System.out.println("f1是Son的类型");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值