学习了上面两篇文章的内容
复习一下:
- 什么是封装?
- 什么是继承?
- 什么是多态?
- 以上三大特性,在面向对象编程中有什么优势,带给我们编程有什么好处呢?
接下来我们学习新的一个特性:
抽象
- 抽象:抽象是从众多的事物中抽取出共同的、本质性的特征
- 在软件开发过程中,识别稳定的需求、识别核心的需求、识别概念性的需求、设计系统的架构、定义系统中构件之间的接口关系等等都是抽象的过程,都是反应系统的本质特征的过程。
- 抽象的,才是稳定的,才是永恒的。
- 什么是抽象类:
- 就是不能使用new关键字进行实例化的类,即没有具体实例对象的类。
- 包含了抽象方法的类。
- 为什么需要抽象类?
- 是一种模板模式,抽象类为所有子类提供了一个通用模板,子类可以在这个模板基础上面进行扩展。
- 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
- 如何定义抽象类:
- 使用关键字abstract。
- 如何定义抽象方法
- 使用关键字abstract,抽象方法不能有方法体。
- 特点:
- 有抽象方法的类,一定是抽象类。
- 子类继承抽象父类,必须重写父类的抽象方法。
- 抽象类不能被实例化(不能使用关键字new创建对象)。
- 示例代码:
-
//抽象方法,需要放在抽象类里面 abstract class Animal{ public abstract void eat();//抽象方法 public void sleep(){ System.out.println("zzzzzzzzzzz"); } } //子类继承抽象的父类,必须重写其抽象方法 class Dog extends Animal{ @Override public void eat() { System.out.println("狗狗吃骨头...."); } }
-
- 要点:
- 有抽象方法的类只能定义抽象类。
- 抽象类不能实例化,即不能用new来实例化抽象类。
- 抽象类可以包含属性,普通方法,抽象方法,构造方法,但是构造方法不能用来new实例,只能用来被子类调用。
- 抽象类只能用来继承。
- 抽象方法必须被子类实现。
-
public abstract class Car { String type;//属性 //构造方法 public Car(String type){ this.type = type; } //普通方法 public void run(){ } //抽象方法 public abstract void stop(); }
-
// 父类的构造器调用 class aCar extends Car { public aCar(String type) { super(type);// 父类构造器的调用 } @Override public void stop() { } }
- 抽象方法的意义:
- 方法的设计和实现分离了。
- 什么是接口
- 一种特殊的抽象类
- 接口中只有抽象方法和常量。
- 关键字interface
- 一个类如果实现了一个接口,必须实现其接口中的每一个抽象方法!
- 实现关系
- 一个Java类只能有一个父类,可以有多个接口。
- (单继承,多实现)
- 一个父类的引用,只能访问该父类中定义的方法,而不能随意访问子类中特有的方法。
- 一个Java类只能有一个父类,可以有多个接口。
- 为什么要使用接口
- 接口定义规范,Java中单继承,多实现。
- 一个类可以实现多个接口,也就是遵循多个规范。
- 接口和抽象类的区别
- 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。
- 如果你是汽车,则必须能跑。
- 如果你是销售人员,则必须能准守销售章程。
- 接口的本质是契约,就像法律,制定好后大家准守。
- 项目中的具体需求是多变的,我们必须以不变应万变才能从容开发,此处“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程。
- 接口定义的格式是:
- 【访问修饰符】 interface 接口名 [extends 父接口1,父接口2,...]{
- 常量定义 //总是:public static final
- 方法定义 //总是:public abstract
- }
- 【访问修饰符】 interface 接口名 [extends 父接口1,父接口2,...]{
- 怎么使用接口:
- 子类通过implements 实现接口中的规范。
- 接口不能创建实例,但是可用于声明引用变量类型。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
- 接口支持多继承,“接口”可以继承一个或多个“接口”。
- 例如:A继承,B继承,C继承
- instanceof关键字使用方法
- 用来判断一个引用是否属于一个类的类型
- 判断结果就是true或者false
- instanceof案例
-
Vehicles v1 = new Car("BMW", "蓝色", 5); if (v1 instanceof Truck) { Truck t2 = (Truck) v1; t2.showTruck(); }else{ System.out.println("这个交通工具不是卡车"); } if (v1 instanceof Car) { Car c1 = (Car) v1; c1.showCar(); }else{ System.out.println("这个交通工具不是小汽车"); }
-
未完待续,下一篇文章见。