抽象类
什么是抽象类
-
随着继承层次中 一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫做抽象类
abstract关键字的使用
-
abstract:抽象的
-
abstract可以用来修饰的结构:类、方法
-
abstract修饰类:抽象类
-
此类不能实例化
-
抽象类中一定有构造器,便于子类对象实例化的时候调用(涉及:子类对象实例化的过程)
-
开发中,都可以提供抽象类的子类,让子类对象实例化,完成相关操作
-
-
abstract修饰方法:抽象方法
-
抽象方法只有方法的声明,没有方法体
-
包含抽象方法的类,一定时一个抽象类
-
若子类重写了父类中的所有的抽象方法后,此子类方可实例化
-
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
-
abstract使用上的注意点:
-
abstract不能用来修饰:属性、构造器等结构
-
abstract不能用来修饰私有方法、静态方法、final的方法、final的类
接口
接口的概述:
-
一方面,有时必须从几个类中派生出一个子类,继承他们所有的属性和方法。但是,Java不支持多重继承。有了接口就可以得到多重继承的效果。
-
另一方面,有时必须从几个类中抽取出一些共同的行为特征,而他们之间又没有is-a(不是继承的关系)的关系,仅仅时具有相同的行为特征而已。例如:鼠标、硬盘、打印机、扫描仪、摄像头、充电器、MP3、手机、数码相机、移动硬盘等都支持USB连接
-
接口就是规范,定义的时一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个“是不是”的关系,而接口实现则是"能不能"的关系
-
接口的本质是契约,标准,规范,就像我们的法律一样。制定号后大家都要遵守
接口的使用
-
接口使用interface来定义
-
Java中,接口和类是并列的两个接口
-
如何定义接口:定义接口中的成员
-
JDK7及以前:之恩呢定义全局常量和抽象方法
-
全局常量:public static final的,但是书写时,可以省略不写
-
抽象方法:public abstract的
-
-
JDK8:除了定义全部常量和抽象方法之外,还可以定义静态方法、默认方法(略)
-
-
接口中不能定义构造器!意味着接口不可以实例化
-
Java开发中,接口通过让类去实现(implements)的方式来使用。
-
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
-
如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍为一个抽象类
-
-
Java类可以实现多个接口---->弥补了Java单继承性的局限性
格式:class AA extends BB implements CC,DD,EE
-
接口与接口之间可以继承,而且可以多继承
-
接口的具体使用,体现多态性
-
接口,实际上可以看做时一种规范
面向接口编程
-
定义Java类的语法格式:先写extends,后写implements
-
class SubClass extends SuperClass implements InterfaceA{}
-
-
一个类可以实现多个接口,接口也可以继承其他接口
-
实现接口的类中必须提供接口总所有方法的具体实现内容,方可实例化。否则,仍为抽象类
-
接口的主要用途就是被实现类实现(面向接口编程)
-
与继承关系类似,接口与实现类之间存在多态性
-
接口和类是并列关系,过着可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量的方法和定义(JDK7.0之前),而没有变量和方法的实现。
接口的应用:代理模式(拓展)
-
应用场景:
-
安全代理:屏蔽对真实角色的直接访问
-
远程代理:通过代理类处理远程方法调用(RMI)
-
延迟加载:先加载轻量级的代理对象,真正需要在加载真实对象
-
-
分类
-
静态代理(静态定义代理类)
-
动态代理(动态生成代理类)
JDK自带的动态代理,需要反射等知识
-
概述:
代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。
接口的应用:工厂模式(拓展)
工厂模式:实现了创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
其实设计模式的面向对象设计原则都是为了使得开发项目更加容易扩展和维护,解决方式就是一个”分工“
工厂模式的分类:
-
无工厂模式
package com.atguigu.pattern.factory.nofactory;
interface Car{
void run;
}
class Audi implements Car{
public void run(){
System.out.println("奥迪再跑");
}
}
class BYD implements Car{
public void run(){
System.out.println("比亚迪在跑");
}
}
----------------------------------------------
public class Client01{
public static void main(String[] args){
Car a=new Audi();
Car b=new BYD();
a.run();
b.run();
}
}
-
简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
package com.atguigu.pattern.factory.nofactory;
interface Car{
void run;
}
class Audi implements Car{
public void run(){
System.out.println("奥迪再跑");
}
}
class BYD implements Car{
public void run(){
System.out.println("比亚迪在跑");
}
}
----------------------------------------
//工厂类
class CarFactory{
public static Car getCar(String type){
if("奥迪".equals(type)){
return new Audi();
}else if("比亚迪".equals(type)){
return new BYD();
}else{
return null;
}
}
}
public class Client02{
public static void main(String[] arge){
Car a =CarFactory.getCar("奥迪");
a.run();
Car b = CarFactory.getCar("比亚迪");
b.run();
}
}
-
工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
package com.atguigu.pattern.factory.nofactory;
interface Car{
void run;
}
class Audi implements Car{
public void run(){
System.out.println("奥迪再跑");
}
}
class BYD implements Car{
public void run(){
System.out.println("比亚迪在跑");
}
}
-----------------------------------------
//工厂接口
interface Factory{
Car getCar();
}
//两个工厂类
class AudiFactory implements Factory{
public Audi getCar(){
return new Audi();
}
}
class BydFactory implements Factory{
public BYD getCar(){
reutnr new BYD();
}
}
public class Client{
public static void main(String[] args){
Car a = new AudiFactory().getCar();
Car b =new BydFactory().getCar();
a.run();
b.run();
}
}
-
抽象工厂模式:用来生产不同产品族的全部产品(对于增加的产品,无能为力;支持增加产品族)
-
抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最抽象、最具一般性的。
-
抽象工厂模式的用意为:给客户提供一个接口,可以创建多个产品族中的产品对象。
-
而且使用抽象工厂模式还要满足以下条件:
-
系统中有多个产品族,而系统一次只可能消费其中一族产品。
-
同属于同一个产品族的产品而以其使用。
-
-