抽象类与接口
**抽象方法:**在子类继承父类之后,发现有些方法必须进行重写但是如果父类中不编写此方法就没有办法使用多态调用所以必须要写但没必要实现。
一.了解抽象类与普通类的区别
-
抽象类不能被实例化(例:Pet pet = new Pet();不可以创建对象)
但可以作为引用变量去指向子类的对象(例:Pet pet = new Dog(); 父类引用指向子类对象)
可以编写匿名内部类
了解:匿名类
public abstract class Pet{ public abstract void test(); } //匿名内部类:可以将匿名内部类理解为 是该类的一个子类(匿名的) 这个东西只能用一次 Pet pet = new Pet(){ @Override public void test(){ } };
-
抽象类可以有构造方法
他的构造方法用来帮助子类构造对象 例:汽车租赁
-
只要有抽象方法存在,这个类就是抽象类
抽象类可以有抽象方法也可以有普通方法
父债子偿 :一个抽象类的抽象方法必须被子类实现,如果子类不重写,他也是抽象类
二.抽象类为什么不能被实例化
语义上:
抽象类:在自己类的基础上抽象一层
具体类:可以new本身的类
举例:我说那个水果是个抽象的,你不知道拿哪个水果,说的毫无意义,所以抽象类不能被实例化
但我说那个香蕉,你知道要拿香蕉给我,要创建香蕉这个具体的对象
**语法上:**抽象方法无方法体
java虚拟机内部无法运行,所以抽象类也不能创建实例化对象
三.抽象类与抽象方法的使用
-
抽象类中可以没有抽象方法,但包含了抽象方法的类必须定义为抽象类
**问:**既然可以没有抽象方法,可以用普通方法为什么不定义普通类?? **答:**因为一旦有抽象方法我就可以直接添加不需做太大改动([易于程序扩展]())
-
如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
-
没有抽象构造方法,也没有抽象静态方法
问:为什么
**答:**构造方法用来初始化对象的,而抽象方法没有方法体,Java虚拟机内部无法运行所以没有抽象构造方法
而静态方法是和类相关的,直接调用的,如果设置抽象的类去调用他不知调的什么毫无意义(和上面例子的水果相似)
-
抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
四.什么是接口
四.什么是接口
**接口的定义:**一系列方法(函数)的声明,是一些方法(函数)特征的集合
**接口的特点:**一个接口只有方法(函数)的特征没有方法的实现,因此方法可以在不同的地方被不同的类实现,
而实现可以具有不同的行为(功能);
之所以在Java中诞生接口这个概念,其中的原因有:
在日趋庞大的系统中,如果将所有的功能都定义在一个类中,那么必然会导致耦合性的加剧,
还有扩展性的降低,所以我们把一些功能进行聚合,放到接口中,未来谁想用这些功能直接实现此接口即可 。
**举例:**你要开发一个天气App,不需要自己去花费时间等测量实时天气情况,只需要获取一下国家气象局的提供的天气接口即可。
国家气象局的数据收集到之后,开发GG给你写了一个方法,这个方法可以被你调用。 你只需要按照要求传入指定的参数,即可得到指定的结果!
public String getxx(String 地址,Date 时间,String 你想要的天气数据编号等…){
// 实现与你无关
}
五.了解接口的定义
概念上:系统对外提供的所有服务
实在的接口:interface
例子:实现一个防盗门的功能。
门类:开门和关门的功能
锁类:开锁和上锁的功能
防盗门 is a 门 所以可以继承门类,拥有了开门和关门的功能
但是他想拥有开锁和上锁 不能通过继承锁类。 1.防盗门 is not a 锁! 2.Java中是单根继承 只能有一个直接父类。
如果还想拥有锁的功能,这时候就可以使用接口 interface。防盗门 has a 锁。
可理解: 继承:找亲爹
实现接口:认干爹
你只能有一个亲爹,你可以有多个干爹。
接口可以理解成都是子类私有的一个功能我放在一个类中啥时用啥时调。(即有这个功能,又有那个功能并且只能继承一个就想到接口)
例:动物是个父类,猫和狗是子类,做一个动物吃食的方法。
猫吃鱼,狗吃骨头。这里鱼既是动物又是食物,很明显把它放在父类里不合适,这里把他作为一个接口既满足了它是动物也是鱼的食物,而且利于代码的扩展性。
/**
防盗门
2019年2月17日下午16:04
*/
public class ThiefDoor extends Door implements Lock,CatEye{
@Override
public void upLock(){
}
@Override
public void downLock(){
}
}
/**
门:有开和关
*/
public class Door{
public void open(){
System.out.println("开门");
}
public void close(){
System.out.println("关门");
}
}
/**
锁接口
*/
public interface Lock{
//在接口中编写普同方法 只能是抽象的abstract 公共的 public
void upLock();
void downLock();
}
六.了解接口的特点
接口中的成员变量:
-
默认都是 public(公共的))static(静态) final(常量)必须显示初始化
例: String name ; × String name = “ ***”;√ 的赋予一个常量值
复合接口: A接口 —>B接口,A接口也—>C接口
接口中的方法:
-
默认都是public(公共的)abstract(抽象的)
-
除了成员变量和方法不能包含其他(不能有静态方法)
-
接口没有构造方法,不能被实例化(常作为类型使用),但也可编写匿名内部类
应为接口满足 has a 关系相当于把功能单独拆分无法创建对象所以没有构造方法。
接口比抽象类还抽象所以不能实例化
-
一个接口不能实现另一个接口(只有类能实现接口)但可以继承多个其他接口。
只能具体实现类实现接口的方法
-
实现类必须实现接口的所有方法,除非这个类也是抽象类。
implements,多个接口用逗号隔开(实现类可以实现多个接口,Java中的多继承)
判断对错:
public interface Mylnterface{
public myLenterface(); × 接口中不能有构造方法
public void method();
public void method2(){} × 不能有普通方法
private void metheod3(); ×接口中方法必须是public abstract
void method4();
int method5();
int TYPE = 1;
}
七.面向接口编程
接口是一种约定:接口只是定义功能和行为规范,如果一个类实现了一个接口,那么这个类必须遵循这个接口的方法约定,但没有 is a 的关系。
例:把墙壁上的“小学生行为规范”想象成一个接口,那么小学生必须遵守这个规范,但是学生不是”行为规范“
面向接口编程:
程序设计时面向接口的约定而不考虑具体实现(甘心实现类有何功能,而不关心实现细节)
因为接口是你给我就行,我拿来用我不考虑你是怎么做好的
八.抽象类 VS 接口
相同点:
- 都带表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法
不同点:
- 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
- 一个类只能继承一个直接父类,但可以实现多个接口
- 已存在的继承树,可以方便的抽取接口,但是抽取抽象类不容易
注意:将来如果设计程序时接口一旦公布要一定必须稳定
因为抽象类中如果加个功能加个普通方法就行易扩展,而接口中如果扩展功能会造成接口不稳定
他的实现类必须实现,万一有一个实现类不需要会造成程序不合理
接口的使用原则:
-
接口做系统与外界交互的窗口
接口提供服务
-
接口本身一单制定就不允许随意更改
-
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点