抽象类和接口
抽象类和接口
目录
抽象类(abstract):
为什么会有抽象(abstract)类?
父类方法不确定性
抽象类的基础:
- 被关键字abstract修饰的类和方法
- 价值更多在于设计,是设计者设计好被子类调用并实现抽象类
细节:
- 抽象类不能实例化
- 抽象类的方法可以不是抽象方法,但是有抽象方法的一定是抽象类
- abstract只能修饰类和方法,不能修饰其他的
- 抽象类本质还是类,类有的它都有
- 抽象方法不能主体
- 当一个类继承了抽象类,要么就必须实现所有的抽象方法,要么你这个类也要声明为抽象类
- 抽象方法不能被private,final,static修饰,因为,抽象方法就是要被重写,而private修饰的方法,被子类继承后不能被重写,final加上后子类不能重写,static,是能被类直接调用的方法,而抽象方法连方法体都没有,被调用没有意义
抽象类的最佳实践----模板设计模式:
测试类:
public class Test {
public static void main(String[] args) {
A a = new A();
com.LiuDeHen.AbStract.a a1 = new a();
a.jisuan();
a1.jisuan();
}
}
A子类:
class A extends c{
int num=0;
@Override
public void work() {
for (int i = 0; i <2000000 ; i++) {
num+=i;
}
}
}
a子类:
class a extends c{
int num=0;
@Override
public void work() {
for (int i = 0; i <1000000 ; i++) {
num+=i;
}
}
}
抽象c父类:
此时a和A子类由于有相同的work方法,但是内容不同,然后除此之外,计算work方法的时间代码他们两相同,
所以可以把工作work当成抽象方法,计算时间方法是普通方法,子类a和A只需要重写自己不同work,然后调用计算方法
abstract class c{
public abstract void work();
public void jisuan(){
long start=System.currentTimeMillis();
work();
long end=System.currentTimeMillis();
System.out.println(end-start);
}
}
总结:
-
什么是抽象类/接口?
-
有抽象方法的类就是抽象类
-
(核心)抽象类除了多了抽象方法其实本质上就是一个普通类
-
-
抽象方法有什么特点?
- 不能被public,final,static修饰
-
抽象怎么用?
- 所以抽象的用处由上就可以总结而来,继承抽象类的子类,可以有相同的属性和方法,但是必须重写抽象方法,也就是两个子类有大量的重复,但是核心代码有不同,这个时候我们可以使用抽象类,就像上面的模板设计模式
接口(interface):
什么是接口:规范
基本概念:
- 有基础属性
- 接口中有普通方法,抽象方法和静态方法,抽象方法省略了public abstract修饰,普通方法必须加上default
细节:
- 普通类实现接口,必须实现接口的所有抽象方法
- 接口不能实例化(就是定义了规范,实例化是为了赋值,没有意义),但实现它的子类能
- 抽象类去实现接口时,可以不实现接口的方法,因为它带abstract
- 一个类可以实现多个接口
- 接口中所有的属性都是public static final修饰的,默认不显示
- 接口不能继承其他类,但是可以继承其他接口
class A{
static int a=10;
}
class B extends A{
}
class C{
public static void main(String[] args) {
System.out.println(B.a);//子类可以调用父类的静态变量
B b = new B();
System.out.println(b.a);//子类的对象调用父类的静态变量
System.out.println(A.a);//调用接口的静态对象
}
}
接口和继承的区别:
例子:小猴子继承了猴子的基本功能,但是它想飞,想游泳想....就要去实现孙悟空的功能,实现72变
可以说实现是对java单继承的补充
继承的价值:解决了代码的复用性和可维护性
接口的价值:设计,设计好各种规范,让其他类实现,更加灵活
更加灵活 例如:继承:小猴子is 猴子(就是猴子),接口:like 鱼(像鱼学习游泳,但不能说它是鱼)
解耦:接口规范性+动态绑定
总的来说:接口就是师傅(可以有多个师傅),继承是爸爸(只能有一个)
接口多态特性:
总结:
-
什么是接口?
- 定义的一种规范
- 跟类是同一个级别
- 是对继承的一种补充,继承是(爹),接口是(师傅),爹只能有一个(继承一个),师傅可以有很多(实现)
-
接口中的成员有什么特点?
- 属性都是public static final修饰(很多源码里,接口里定义了很多,我们都可以调用)
- 接口不能被实现
- 接口中有普通,静态,抽象3种方法
-
接口和多态
- 接口跟类同一级别,所有适用了多态
-
抽象类和接口的区别:
- 其实抽象类和接口,就像是类和接口
- 抽象类只是继承而已,他是继承的一种手段,减少代码重复工作,解耦,说到底它只是一个类
- 而接口就不一样了,他是对继承类(包括抽象类)的补充,你继承抽象类,抽象类还是你的父类
- 就像父类和子类,子类实现了父类的所有功能(儿子学会了爹的所有武功),而抽象类和子类则是(儿子学会所有的武功,并且要讲某些武功进行自己理解改变(抽象方法)),跟接口不冲突,只是都有抽象方法,没有其他共同点了,毕竟接口是师傅
浙公网安备 33010602011771号