10 : 抽象类和接口

抽象类
概念

Java中可以定义没有方法体的方法,该方法由其子类来具体的实现

没有方法体的方法我们称之为抽象方法

含有抽象方法的类我们称之为抽象类

抽象类可以理解为是一个只有方法声明没有方法体的特殊类

abstract 修饰符 返回值 方法名(参数列表)

 

抽象的 class Animal{

    抽象的 public void eat(); //父类方法体提供了显得多余,那就不提供方法体,没有方法体的方法  -- 抽象方法

}

class Cat extends Animal{

    @Override

    public void eat(){

       syso("猫吃鱼");

    }

}

class Dog extends Animal {

}

特点
  • 通过java关键字abstract实现
  • 可以修饰方法或者类
  • 抽象类中可以没有抽象方法(由子类去实现)【此时将此类定义为抽象类仅仅是不希望该类被实例化】
  • 如果类中有抽象方法,那该类必须定义为一个抽象类
  • 子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
  • 多用于多态中
  • 抽象类不可以被实例化
抽象类的用法
构造函数

常用于子类的实例化

package cn.tedu.abstractdemo;

//抽象类的用法

public class Test2_UseAbstract {

    public static void main(String[] args) {

       //TODO 创建多态对象测试

       Animal a = new Dog();

    }

}

//创建父类

abstract class Animal{

    //TODO 抽象类提供构造方法:不是为了创建抽象类的对象(也不能创建),而是为了创建子类对象

    public Animal() {

       System.out.println("构造方法");

    }

}

//创建子类

class Dog extends Animal{

    public Dog() {

       super();//默认就有

    }   

}

成员变量

既可以有变量,也可以有常量。

package cn.tedu.abstractdemo;

//抽象类的用法

public class Test2_UseAbstract {

    public static void main(String[] args) {

       //TODO 创建多态对象测试

       Animal a = new Dog();

    }

}

//创建父类

abstract class Animal{

    //TODO 提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象

    public Animal() {

       System.out.println("构造方法");

    }

    int sum ;//抽象类中可以写变量

    final int count = 10;//抽象类中可以写常量  

}

//创建子类

class Dog extends Animal{

    public Dog() {

       super();//默认就有

    }

}

成员方法

抽象类里,既可以有普通方法,有可以有抽象方法

abstract关键字注意事项

抽象方法要求子类继承后必须重写

abstract关键字不可以和哪些关键字一起使用呢?

以下关键字,在抽象类中。用是可以用的,只是没有意义了

  • private:被私有化后,子类无法重写,与abstract相违背
  • static:静态的,优先于对象存在。而abstract是对象间的关系,存在加载顺序问题
  • final:被final修饰后,无法重写,与abstract相违背
案例

接口
概念

Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现

Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现

OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性.

就必须是面向接口的编程,面向抽象的编程,

正确地使用接口、抽象类这些太有用的抽象类型做为java结构层次上的顶层

interface 接口名{  代码…  }

特点
  • 接口中都是抽象方法
  • 通过interface关键字创建接口
  • 只有public默认可以用来修饰接口
  • 通过implements让子类来实现 class Student implements Person
  • 可以理解成,接口是一个特殊的抽象类,特殊在,接口中都是抽象方法
  • 接口突破了java的单继承的局限性class Student implements Person,Human
  • 接口和类之间可以多实现,接口和接口之间可以多继承interface A extends B,C
  • 接口是对外暴露的规则,是一套开发规范
  • 接口提高了程序的功能扩展,降低了耦合性
接口的用法
构造方法

接口里是没有构造方法的。

在创建实现类的对象时默认的super(),是调用的默认Object的无参构造。

成员变量

接口里没有成员变量,都是常量。所以,你定义一个变量没有写修饰符时,默认会加上:

public static final

成员方法

接口里的方法,默认就都是抽象的,如果你不写明是abstract的,那会自动补齐

例如:public abstract void save

案例

接口文件

主程序文件与执行结果

总结
类与类的关系
  • 单继承
  • 子类可以使用父类的全部资源(除了私有成员)
  • 子类可以重写父类的方法(函数声明完全一致)
  • 重写不会影响父类的方法,只改变子类自己的方法
类与接口的关系
  • 多实现(接口之间用逗号隔开)
  • 类必须重写所实现接口的全部抽象方法,否则就需要被声明为抽象类
  • 类可以在继承的同时多实现
接口与接口的关系
  • 多继承
  • 继承接口的接口可以拥有被继承接口的全部功能
抽象类
  • 是一个特殊的类
  • 不能实例化
  • 可以有变量,也可以有常量
  • 抽象类中有构造方法(是为了给子类创建对象)
  • 可以有抽象方法,也可以有一般方法
  • 可以全是抽象方法
  • 可以全是一般方法(此时仅仅是为了不被实例化)
接口
  • 是一个特殊的抽象类(特殊在接口里的方法都是抽象方法)
  • 无构造方法(子类创建对象时默认调用Object类的构造方法)
  • 只有抽象方法(默认添加 abstract public)
  • 只有常量(默认添加 public static final)
接口和抽象类的异同
  • 接口和抽象类都不能直接实例化(new),果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
  • 接口需要被实现,抽象类需要被继承
  • 接口之间可以多继承,抽象类之间只能单继承
  • 接口必须全是抽象方法(只能定义声方法,不能实现方法),抽象类可以有一般方法,甚至全是一般方法
  • 接口是设计的结果 ,抽象类是重构的结果
  • 抽象类可以实现接口,反之不能
  • 接口中没有变量只有常量,抽象类中可以有变量有常量
  • 接口没有构造函数,抽象类有构造函数
  • 抽象类和接口里的抽象方法必须全部被子类重写,否则该子类为抽象类
  • 抽象类里可以没有抽象方法
  • 如果一个类里有抽象方法,那么这个类只能是抽象类
  • 抽象方法要被实现,所以不能是静态的,也不能是私有的

猜你喜欢

转载自www.cnblogs.com/aqin1012/p/12184542.html