java面向对象思想-继承(一)

       最近换了个工作后除了月末月初的几天,相比之下还是有充足的时间给自己学习的.所以最近又重新开始看一些java的基础部分.最近在看的这本书是霍斯特曼写的core java volume I-Fundamentals  中文名字是java核心技术.看了几章觉得这本书对于基础部分还有一些日常会被忽略的细节讲的不错.尤其是用java代码相较于c++的区别进行描述.

oop是现在的主流的程序设计范型,它取代了20世纪70年代的结构化过程化程序设计开发技术.java是完全面向对象的,必须熟悉oop才能够编写java程序.从根本上说,只要对象能够满足需求,就不必关心其功能实现的具体过程,在oop中,不必关心对象的具体实现,只要能够满足用户的需求即可.

而继承又是面向对象中的一个基本概念.利用继承人们可以基于已经存在的类构建一个新类,继承已存在的类就是复用这些类的方法和域.在此基础上,可以添加一些新的方法和域,以满足新的需求.这是java程序设计中的一项核心技术.

要了解继承,首先需要了解什么叫做类,超类和子类.假设你在某个公司中工作,那么你就是这个公司中的一个员工,你拥有员工所拥有的属性,比如姓名,员工编码,工资,入职日期等等.将以上的属性我们可以通过java代码封装成为一个employee类.
 

public class Employee {
    private String id ;
    private String name ;
    private double salary ;
    private Date joinDate;

}

注:为了节省篇幅,类中就先不提供对应的构造方法和属性访问器和修改器

与此同时你又是所属于一个部门的一个员工,那么就要求你拥有你们部门所拥有的独特的属性.比如你是开发部门的,那么就需要你的固有属性中增加对于一种汇编语言的掌握了解,还有你能够在开发部门生存的方法,例如测试,开发运维.那么在这个时候你既拥有员工的特征,又拥有一个程序员的特征.可是重新编写一个程序员的类让其拥有员工的特征对于我们来说不但存在重复的工作,又无法清晰地说明员工和程序员之间的关系,那么这个时候我们就需要使用继承来表明类与类之间的关系.这样既可以在员工类的基础上添加一些新的属性,又可以重用一些员工类中已经存在的代码.从理论上说,在员工类和程序员类中存在明显的is-a关系.每个程序员都是一个员工,is-a关系是继承中的一个明显特征.

同样,作为员工你会拥有一些领导,这些领导相较于你们或许在薪水之外又存在奖金.但是领导本身也是这家公司的一个员工.所以相较于普通的员工可能他的域中多了一个叫做奖金的私有属性.而域中的其他属性只需要继续沿用员工类即可.

领导类:

public class Manager extends Employee {
 
    private double bonus;
}

在定义领导类中我们用到了extends关键字,其表明正在构建的新类派生与一个已经存在类.已存在的类被我们成为超类,基类或者父类.新构建出来的类叫做子类或者派生类.超类和子类是java程序员常用的称呼,而其他语言的程序员可能更喜欢叫做父类和孩子类.

虽然employee类是一个超类,但并不是因为他拥有比子类更多或者更加强大的方法和属性,恰恰相反.子类拥有比超类更加丰富的功能.比如:我们需要去计算员工的工资,这个时候我们需要为员工提供一个访问器.

	public double getSalary(){
		double salary = super.getSalary();
		salary = salary + bonus ;
		return salary;
			
	}

但是这个访问器在用于manager类时就会出现一些逻辑上的问题.因为我们知道manager类的工资中应该包含基本的工资以及奖金,所以我们需要在manager类中修改对应的访问器来确保我们得到的工资是正确的工资.

这里首先我们需要为manager类添加一个属性的修改器

	public void setBonus(double bonus) {
		this.bonus = bonus;
	}

然后我们需要覆盖对应的超类中的方法

	public double getSalary(){
	...
			
	}

那么方法中的具体实现是什么呢.我们之前已经说到,manager类中的工资是基本工资加上奖金,因此我们只需要将奖金添加进去即可.

	public double getSalary(){
		double salary = super.getSalary();
		salary += bonus ;
		return salary;
			
	}

这里我们需要注意的是,虽然我们没有显示的定义salary属性以及对应的访问器,但是我们依旧可以使用它们,因为子类自动的继承了超类的这些属性和方法.

还有需要注意的是,因为在子类中也存在getSalary方法,当我们需要调用超类的访问器时,如果不使用super关键字指定调用父类的方法,那么子类会一直循环的调用自身的getSarary方法致使程序报错.

猜你喜欢

转载自blog.csdn.net/xiaoai1994/article/details/81937743