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

来源:互联网 发布:网络远程教育可靠吗 编辑:程序博客网 时间:2024/06/07 02:57

继承

关键字: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 {@Overridepublic void work() {System.out.println("员工号为 " + getId() + " 的 " + getName() + " 员工,正在研发淘宝网站");}}

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

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

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

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

public class Hardware extends Maintainer {@Overridepublic 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();}}



原创粉丝点击