C++程序员学Java系列之十八:继承和抽象
2017-07-18 00:18
375 查看
继承
关键字:extends
格式:
class 子类 extends父类 {}
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
1,不能多继承,这点和C++里是不一样的,即Java的一个类不能有同时有多个父类的,只能有一个父类(单继承);
例如下面这种情况是不合法的。
2、多个类可以继承同一个父类,例如下面这种情况是允许的。
3、在Java中,多层继承(多重继承)是可以的,即一个类的父类可以再去继承另外的父类,
例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。下面这种情况是允许的。
继承给我们带来的好处,提高了代码的复用性
当子类和父类都有一个同名的成员变量或成员函数,用this 和 super 可以区分
this
super
当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
这里,子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖。
重写需要注意的细节问题:
1)子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
2)写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样。
总结:当一个类是另一个类中的一种时,可以通过继承,来继承属性与功能。如果父类具备的功能内容需要子类特殊定义时,进行方法重写。
抽象
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。
抽象方法定义的格式:
public abstract 返回值类型方法名(参数);
抽象类定义的格式:
abstract class 类名 {
}
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员工,正在修复打印机
代码:
定义员工类(抽象类)
定义研发部员工类Developer 继承 员工类Employee
定义JavaEE工程师 继承 研发部员工类,重写工作方法
定义Android工程师 继承 研发部员工类,重写工作方法
定义Hardware硬件维护工程师 继承 维护部员工类,重写工作方法
在测试类中,创建JavaEE工程师对象,完成工作方法的调用
关键字: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(); } }
相关文章推荐
- C++程序员学Java系列之四:Java中的关键字和标识符
- C++程序员学Java系列之十一:流程控制语句switch,case,break,default
- C++程序员学Java系列之十二:一维数组定义,初始化,遍历,最值及异常
- C++程序员学Java系列之七:Scanner类 和 引用数据类型
- C++程序员学Java系列之八:随机数类Random
- C++程序员学Java系列之三: 从Hello World! 开始
- C++程序员学Java系列之二一:final 关键字
- C++程序员学Java系列之十五:自定义类的简单使用
- C++程序员学Java系列之十六:ArrayList 集合
- C++程序员学Java系列之三十:数据结构之向量Vector
- C++程序员学Java系列之三一:数据结构之Stack(栈)
- C++程序员进军Android系列:C++跟JAVA的区别总结
- C++程序员学Java系列之二四:内部类及匿名内部类概念
- C++程序员学Java系列之十九:接口
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- C++程序员学Java系列之十:Java中的循环while,for,do while,猜数字案例
- C++程序员学Java系列之二五:包(package)
- C++程序员学Java系列之五:常量,变量,基本数据类型及转换
- C++程序员学Java系列之二二:static 关键字
- C++程序员学Java系列之九:流程控制语句if,else