您的位置:首页 > 编程语言 > Java开发

java从零单排(八) 继承与多态

2018-02-28 10:08 211 查看

继承

什么是继承?继承当然就是你是你老爸的儿子,然后等着你老爸退休了然后好继承你老爸的资产(PS:就这么简单!)。额好的言归正传,java里面的继承其实也差不多这个意思,不过这个不用等到老爸退休,只要你创建了父类(又称:超类、基类),随时都可以写一个继承。但是你只能继承一个父类(正如你只能有一个父亲一样)…来下面我们看看例子:

//还拿前面的Employee对象来说,这个就是我们的父类
public class Employee {

private String name = "";
private double salary = 1000;

//constructor
public Employee() {}

public String getName() {
return name;
}

public void setName(String n) {
name = n;
}

public void setSalary(double s) {
salary = s;
}

public double getSalary() {
return salary;
}

}


然后我们来创建子类:

class Manager extends Employee {
public double bonus;
public void setBonus(double b) {
bouns = b;
}
}


这里我们用了extends关键字就实现了继承(哇,好简单,好了下一章…开玩笑)。首先我们说一下为什么需要继承,就拿书中的这个例子来看,就是说雇员这个对象,下面可能还会有项目经理、产品经理、程序员等多种工种,那他们的级别岗位功能薪资甚至是有一些不一样的地方,比如项目经理可能会有项目抽成,而普通程序员可能并没有(我随便说的,不要打我)。根据这些不一样雇员的特性,所以我们就需要了继承,这样继承相同的雇员的基本属性,然后单独编写不一样的属性,上面例子Manager继承了Employee的所有属性之外,还拥有了自己的bonus属性,这就是继承的基本作用,这样我们在使用的时候就可以直接创建Manager的实例,就可以完成相关经理对应的业务了。

接下来我们看看如何调用父类的方法和属性,额首先private是肯定没有办法调用的,只有protect或者public权限类型的才可以访问,所以那些属性我们还是只能用访问器来访问了,比如我们现在想访问工资和奖金的总和:

class Manager extends Employee {
...
public double getSalary() {
return getSalary() + bonus; //
}
...
}


上面这个方法恩,好像很不对,因为父类里面也有getSalary方法子类里面也有getSalary方法,这个肯定是会先调用本身的方法,因为子类里面写的方法会覆盖父类的方法,所以我们调用父类的方法就要用super关键字:

class Manager extends Employee {
...
public double getSalary() {
return super.getSalary() + bonus; //没错就是这个super
}
...
}


对了,你还可以通过super来调用父类的构造函数super(…),所以这样就学会了继承的基本用法。java里面继承是可以有一个继承链的,比如a继承b继承c(就像你继承你爸爸,你爸爸继承你爷爷一样的道理),然后b1、b2、b3也可以继承c(就像你爸爸还有很多兄弟姐妹一样)。

多态

都说到这里了,那当然要说一说多态了。所谓多态就是,一个基类变量可以引用自己本身的类对象,也可以引用基类的任何一个子类对象,比如:

Employee e;
e = new Manager();
e = new Employee();


没错,这就是多态,但是反过来就不行了:

Manager m = new Employee();


因为不一定每一个雇员都是经理,没错!只要理解这一层在现实中的映射关系就可以非常容易的理解这个多态。所以到底多态有个什么用?来下面我们举个栗子,还是Employee的例子,比如我们有一家公司需要计算该公司的经理的薪水:

class Manager {
...//就是上面的Manager类对象
}
class Company{
private String name;
private String url;

public double getSalary(Manager m){
return m.getSalary();
}
}


然后我们实例化一个Manager以及在Company,然后通过getSalary得到了Manager的工资,哈哈然后你就被项目经理砍死了(这么严重,吓得我赶紧转去写前端了)。因为这里的耦合性太高了,如果不仅仅要计算这个经理,而且有可能还要计算其他岗位的薪水,这个方法就不能用了。所以java的多态就是解决这种问题的,将上面的Company类改为:

class Company{
private String name;
private String url;

public double getSalary(Employee e){
return e.getSalary();
}
}


然后就可以利用多态的特性用Employee变量来实例化经理或者其他员工,并传递到Company里面去实现,这样就大幅度的降低了耦合性:

Employee e = new Manager();
Employee e1 = new Employee();

Company c = new Company();
c.getSalary(e);
c.getSalary(e1);


所以我讲得清楚了么?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 继承 多态