Java基础_抽象类和接口

抽象类和接口

一、抽象类(abstract)

介绍抽象类

  1. 什么是抽象类?

    • 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。
    • 类本身是不存在的,所以抽象类无法创建对象(无法实例化)
  2. 抽象类属于什么类型?

    • 抽象类也属于引用数据类型。
  3. 抽象类怎么定义?

    • 语法:
      [修饰符列表] abstract class 类名{
        类体;

      }

  4. 抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。

  5. final和abstract不能联合使用,这两个关键字是对立的。

  6. 抽象类的子类可以是抽象类,也可以是非抽象类

  7. 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

  8. 抽象类关联到一个概念:抽象方法。什么是抽象方法呢?

    • 抽象方法表示没有实现的方法,没有方法体的方法。例如:
      • public abstract void run () ;
      • 抽象方法特点是:
        特点1:没有方法体,以分号结尾。
        特点2:前面修饰符列表中有abstract关键字。
  9. 抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

    • 抽象类中可以存在非抽象方法,即:可以有普通方法
  10. 一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。

  • 类到对象是实例化,对象到类是抽象。

2

  • 抽象类无法实例化,无法创建对象, why ?

    • 抽象类是:类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了 抽象类。由于类本身是不存在的,所以抽象类无法创建对象。
  • 抽象类和抽象类实际上可能还会有共同特征,还可以进一步再抽象。

package com.mike.test;

public class Test {
    public static void main(String[] args) {
        //错误: Account是抽象的;无法实例化
        //Account act = new Account();
    }
}

//银行账户类
abstract class Account{
}

//子类继承抽象类,子类可以实例化对象
class CreditAccount extends Account {

}
//抽象类的子类可以是抽象类吗?可以
//abstract class CreditAccount extends Account {
//}

关于抽象类中的抽象方法重写的问题

package com.mike.test;

public class Test {
    public static void main(String[] args) {

        new Bird().move();//匿名内部类写法
        //也可以这样new对象
//        Bird bird1 = new Bird();
//        bird1.move();
        
        //能不能使用多态?
        //当然是可以,父类型引用指向子类型对象。
        //Animal a=new Bird();//这就是面向抽象编程。

//这就是面问抽象编程。OCP
//以后你都是调用的a.xxx
//a的类型是Animal, Animal是抽象的
//面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。
//这种编程思想符合OCP原则。
    }
}

//动物类(抽象类)
abstract class Animal{
    //抽象方法
    public abstract void move();

}

//子类(非抽象类)
class Bird extends Animal{

    //如果父类存在抽象方法,但是子类继承父类然后不重写父类的抽象方法,那么这个子类必须定义为抽象类
    //下面这个操作是子类重写了父类中存在的抽象方法,子类就不用定义为抽象类
    @Override
    public void move() {
        System.out.println("咕咕咕~");
    }
}

面试题(判断题):

  • java语言中凡是没有方法体的方法都是抽象方法。
    • 不对,错误的。
    • object类中就有很多方法都没有方法体,都是以“;"结尾的,但他们
      都不是抽象方法,例如:
    • public native int hashCode () ;
    • 这个方法底层调用了C++写的动态链接库程序。
    • 前面修饰符列表中没有: abstract。 有一个 native。表示调用JVM本地程序。

二、接口

1、接口基础语法

  1. 接口也是一种''引用数据类型"。编译之后也是一个class字节码文件。
  2. 接口是完全抽象的。(抽象类是半抽象)或者也可以说接口是特殊的抽象类。
  3. 接口怎么定义,语法是什么?
    [修饰符列表] interface 接口名{}
  4. 接口支持多继承,一个接口可以继承多个接口
  5. 接口中只包含两部分内容,一部分是常量,一部分是抽象方法。接口中没有
    其它内容了,只有以上两部分。
  6. 接口中所有的元素都是public修饰的。( 都是公开的。)
  7. 接口中的抽象方法定义时: public abstract修饰符可以省略。
  8. 接口中的常量的public static final可以省略。
  9. 接口中的方法都是抽象方法,所以接口中的方法不能有方法体。
  • 类和类之间叫做继承,类和接口之间叫做实现。
  • 别多想:你仍然可以将"实现"看做"继承"。
  • 继承使用extends关键字完成。
  • 实现使用implements关键字完成。
package com.mike.test;

public class Test {
    public static void main(String[] args) {

    }
}
interface A{}

interface B extends A{}

interface C extends A,B{}

interface MyMath{
    //抽象方法
    public abstract int sum(int a,int b);
}

2、接口在开发中的作用

  • 注意:接口在开发中的作用,类似于多态在开发中的作用。

  • 多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力。

  • 接口在开发中的作用?

    • 接口是不是完全的?是。
    • 而我们以后正好要求,面向抽象编程。
    • 面向抽象编程这句话以后可以修改为:面向接口编程。
    • 有了接口就有了可插拔。可插拔表示扩展力很强。不是焊接死的。

主板和内存条之间有插槽,这个插槽就是接口,内存条坏了,可以重新买一个换下来。这叫做高扩展性。( 低耦合度。)

三、抽象类和接口的区别

总结:类和接口

一、面向对象(接口的概述及其特点)
  • A:接口概述

    • 从狭义的角度讲就是指java中的interface
    • 从广义的角度讲对外提供规则的都是接口
  • B:接口特点

    • a:接口用关键字interface表示
      • interface 接口名 {}
    • b:类实现接口用implements表示
      • class 类名 implements 接口名 {}
  • c:接口不能实例化,那么,接口如何实例化呢?

    • 按照多态的方式来实例化。
  • d:接口的子类

    • a:可以是抽象类。但是意义不大。
    • b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
二、面向对象(接口的成员特点)
  • 接口成员特点
    • 成员变量;只能是常量,并且是静态的并公共的。 * 默认修饰符:public static final * 建议:自己手动给出。
    • 构造方法:接口没有构造方法。
    • 成员方法:只能是抽象方法。 * 默认修饰符:public abstract * 建议:自己手动给出。
三、面向对象(类与类,类与接口,接口与接口的关系)
  • 类与类,类与接口,接口与接口的关系
    • a:类与类:
      • 继承关系,只能单继承,可以多层继承。
    • b:类与接口:
      • 实现关系,可以单实现,也可以多实现。并且还可以在继承一个类的同时实现多个接口。
    • c:接口与接口:
      • 继承关系,可以单继承,也可以多继承。
四、面向对象(抽象类和接口的区别)
  • A:成员区别
    • 抽象类:
      • 成员变量:可以变量,也可以常量
      • 构造方法:有
      • 成员方法:可以抽象,也可以非抽象
    • 接口:
      • 成员变量:只可以常量
      • 构造方法:没有
      • 成员方法:只可以抽象
  • B:关系区别
    • 类与类
      • 继承,单继承
    • 类与接口
      • 实现,单实现,多实现
    • 接口与接口
      • 继承,单继承,多继承
  • C:设计理念区别
    • 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
    • 接口被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。

修饰符

3

  • 范围从大到小排序: public >protected>默 认>private

  • 访问控制权限修饰符可以修饰什么?

    • 属性(4个都能用)
    • 方法( 4个都能用)
    • 类(public和默认能用,其它不行。)
    • 接口(public和默认 能用,其它不行。)
posted @ 2022-03-05 16:17  海边蓝贝壳  阅读(36)  评论(0编辑  收藏  举报