您的位置:首页 > 编程语言 > C语言/C++

C++程序员学Java系列之十八:继承和抽象

2017-07-18 00:18 375 查看
继承

关键字:extends

格式:

class 子类 extends父类 {}

在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。

1,不能多继承,这点和C++里是不一样的,即Java的一个类不能有同时有多个父类的,只能有一个父类(单继承);

例如下面这种情况是不合法的。

class A{}
class B{}
class C extends A,B{}  // C类不可以同时继承A类和B类


2、多个类可以继承同一个父类,例如下面这种情况是允许的。

classA{}
class B extends A{}
class C extends A{}   // 类B和类C都可以继承类A


3、在Java中,多层继承(多重继承)是可以的,即一个类的父类可以再去继承另外的父类,
例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。下面这种情况是允许的。

class A{}
class B extends A{}   // 类B继承类A,类B是类A的子类
class C extends B{}   // 类C继承类B,类C是类B的子类,同时也是类A的子类
这里 类B是类A的子类,但是是类C的父类。

继承给我们带来的好处,提高了代码的复用性

当子类和父类都有一个同名的成员变量或成员函数,用this 和 super 可以区分

this

super

当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。

这里,子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖。

重写需要注意的细节问题:

1)子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

2)写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样。

总结:当一个类是另一个类中的一种时,可以通过继承,来继承属性与功能。如果父类具备的功能内容需要子类特殊定义时,进行方法重写。

抽象

分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

抽象方法定义的格式:

public abstract 返回值类型方法名(参数);

抽象类定义的格式:

abstract class 类名 {

}

抽象类的特点:

1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。

2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。

3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。

也就是说有抽象方法的类一定是抽象类,但抽象类不一定会有抽象方法

抽象类的细节问题

1、抽象类一定是个父类?

是的,因为不断抽取而来的。

2、抽象类中是否可以不定义抽象方法。

是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用

3、抽象关键字abstract不可以和哪些关键字共存?

1、private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。

2、final

3、static

案例:

某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)。

研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;

维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师。

公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。

工作内容

JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站

Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件

网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通

硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机



代码:

定义员工类(抽象类)

public abstract class Employee {
private String id;// 员工编号
private String name; // 员工姓名

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

//工作方法(抽象方法)
public abstract void work();
}

定义研发部员工类Developer 继承 员工类Employee

public abstract class Developer extends Employee {
}
定义维护部员工类Maintainer 继承 员工类Employee

public abstract class Maintainer extends Employee {
}


定义JavaEE工程师 继承 研发部员工类,重写工作方法

public class JavaEE extends Developer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝网站");
}
}

定义Android工程师 继承 研发部员工类,重写工作方法
public class Android extends Developer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝手机客户端软件");
}
}
定义Network网络维护工程师 继承 维护部员工类,重写工作方法

public class Network extends Maintainer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在检查网络是否畅通");
}
}


定义Hardware硬件维护工程师 继承 维护部员工类,重写工作方法

public class Hardware extends Maintainer {
@Override
public void work() {
System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在修复打印机");
}
}


在测试类中,创建JavaEE工程师对象,完成工作方法的调用

public class Test {
public static void main(String[] args) {
//创建JavaEE工程师员工对象
JavaEE ee = new JavaEE();
//设置该员工的编号
ee.setId("000015");
//设置该员工的姓名
ee.setName("小明");
//调用该员工的工作方法
ee.work();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: