抽象类和接口

抽象类和接口

抽象类(abstract):

为什么会有抽象(abstract)类?

父类方法不确定性

抽象类的基础:

  1. 被关键字abstract修饰的类和方法
  2. 价值更多在于设计,是设计者设计好被子类调用并实现抽象类

细节:

  1. 抽象类不能实例化
  2. 抽象类的方法可以不是抽象方法,但是有抽象方法的一定是抽象类
  3. abstract只能修饰类和方法,不能修饰其他的
  4. 抽象类本质还是类,类有的它都有
  5. 抽象方法不能主体
  6. 当一个类继承了抽象类,要么就必须实现所有的抽象方法,要么你这个类也要声明为抽象类
  7. 抽象方法不能被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):

什么是接口:规范

基本概念:

  1. 有基础属性
  2. 接口中有普通方法,抽象方法和静态方法,抽象方法省略了public abstract修饰,普通方法必须加上default

细节:

  1. 普通类实现接口,必须实现接口的所有抽象方法
  2. 接口不能实例化(就是定义了规范,实例化是为了赋值,没有意义),但实现它的子类能
  3. 抽象类去实现接口时,可以不实现接口的方法,因为它带abstract
  4. 一个类可以实现多个接口
  5. 接口中所有的属性都是public static final修饰的,默认不显示
  6. 接口不能继承其他类,但是可以继承其他接口
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 鱼(像鱼学习游泳,但不能说它是鱼)

解耦:接口规范性+动态绑定

总的来说:接口就是师傅(可以有多个师傅),继承是爸爸(只能有一个)

接口多态特性:

总结:

  1. 什么是接口?

    1. 定义的一种规范
    2. 跟类是同一个级别
    3. 是对继承的一种补充,继承是(爹),接口是(师傅),爹只能有一个(继承一个),师傅可以有很多(实现)
  2. 接口中的成员有什么特点?

    1. 属性都是public static final修饰(很多源码里,接口里定义了很多,我们都可以调用)
    2. 接口不能被实现
    3. 接口中有普通,静态,抽象3种方法
  3. 接口和多态

    1. 接口跟类同一级别,所有适用了多态
  4. 抽象类和接口的区别:

    1. 其实抽象类和接口,就像是类和接口
    2. 抽象类只是继承而已,他是继承的一种手段,减少代码重复工作,解耦,说到底它只是一个类
    3. 而接口就不一样了,他是对继承类(包括抽象类)的补充,你继承抽象类,抽象类还是你的父类
    4. 就像父类和子类,子类实现了父类的所有功能(儿子学会了爹的所有武功),而抽象类和子类则是(儿子学会所有的武功,并且要讲某些武功进行自己理解改变(抽象方法)),跟接口不冲突,只是都有抽象方法,没有其他共同点了,毕竟接口是师傅
posted @ 2022-03-14 18:04  又菜又ai  阅读(54)  评论(0)    收藏  举报