Java核心技术卷学习笔记 第一天

Chloe ·
更新时间:2024-09-21
· 610 次阅读

继承 extends 首先今天我学习的是Java中非常重要的三大特性之一继承,首先继承的关键字是extends 它表明正在构造的新类派生于一个已存在的类。这个已存在的类被称为超类(superclass),基类(baseclass)或父类(prantclass);新类被称为子类(subclass),派生类(dervied class)或孩子类 按常理来说父类应该拥有的功能要比子类多,但是它并不优于子类或拥有子类比子类更多的功能,实际上恰恰想反,子类拥有比父类更多的功能 我们举个简单的例子 如我们建立一个Employee的员工类-父类 还有继承员工类的子类:Manager-经理类 在Manager类中 添加一个用于储存奖金的字段 ,以及一个设置这个字段的新方法 public class Employee{ private Double bouns ; public void setBouns (Double bouns){ this.bouons = bouns ; } }

如果我们创建一个Manager对象 我们就可以给这个奖金实例字段赋值

Manager boss = .. ; boss.setBouns(100) ;

由于 setBouns不是在Employee中定义的,所以Employee对象不能使用这个方法。 虽然Manager中没有显式地定义getName和getHireday方法,但是可以对Manager对象使用这个方法,因为Manager自动继承了Employee父类中的方法

超类中的方法对子类Manager并不一定适用 ,如果我们想要一个可以计算薪资和奖金总和的方法。为此我们需要重写一下Manager中的getSalary()方法

public Double getSalary(){ return salary + bouns ; }

按理来说计算薪资和奖金的总和,咋一看很简单只需要返回salary字段和bouns字段之和就行了。但是这样是有问题的 我们只有Employee类能直接访问自己的私有字段。Manager类的getSalary是不能直接访问salary字段的,如果Manager类想要访问salary字段需要像其他方法一样使用公共接口,在这里就是要用Employee的公共方法getSalary();

public Double getSalary(){ Double basesalary = getSalary(); return basesalary + bouns ; }

但是上面这段代码还是有问题的 问题出在调用getSalary()方法上,他只是在调用本身(就是我们正在实现的这个方法),所以这条语句将会导致无限次的调用自己,直到整个系统的崩溃。
正确的方法应该是这样的:

public Double getSalary () { Double baseSalary = super.getSalary(); return bouns + baseSalary; }

这里需要我们指出:我们希望调用父类Employee中的getSalary()方法,而不是当前的这个方法,为此,可以使用super关键字解决这个问题

Manager boss = new Manager(4000.0, "赵龙帅", 2000, 10, 1) ; boss.setBouns(5000); Employee[] emp = new Employee [3] ; emp[0] =mg ; emp[1] =new Manager(1100.0,"程冠希",1999,1,2) ; emp[2] = new Manager(1300.0,"刘德华",1999,1,2) ; for (Employee e : emp) { System.out.println(e.getName()+e.getSalary()); } 运行这条循环语句将会输出下列数据 赵龙帅9000.0 程冠希1100.0 刘德华1300.0

这里的emp[1]和emp[2]仅输出了基本薪水,因为他是Employee对象,而emp[0]是一个Manager对象,它的getSalary()方法会将基本薪水和奖金相加
当e引用Employee对象时调用的是Employee类中的getSalary()方法,当e引用Manager对象时调用的是Manager中的getSalary()方法。虚拟机知道e实际引用的对象类型,因此能够正确的调用相应的方法。
一个对象变量(例如,变量e)可以指示多种实际类型的现象称为多态(polymorphism).在运行时能够自动地选择适当方法,称为动态绑定(dynamic binding)


作者:小林带程序猿



学习笔记 JAVA 学习 java核心技术

需要 登录 后方可回复, 如果你还没有账号请 注册新账号