学习目标:
1、了解接口和抽象类的发展过程;
2、掌握抽象类与接口的特点;
3、掌握抽象类与接口的构成;
4、举实例说明。
5、分析两者的区别。
学习内容:
一、抽象类
1.1抽象类的产生
通过先前的学习,我们了解到类由属性和方法构成;类的继承中,子类会继承父类的属性和方法。有时候,子类要实现的方法与父类不同,此时,虽然子类可以重写父类方法,但当继承子类特别多时,每个子类都要重写父类方法,过于繁琐,且父类方法不再重要。那么,我们是不是可以不写父类具体的具体的方法体呢?这就是抽象类的由来。
1.2抽象类的特点(抽象方法)
1.2.1抽象类的特点,在于abstract(抽象)二字上。abstract修饰的方法的被称为抽象方法,这类方法不需要具体的方法体。形如 【修饰符】abstract 返回值类型 方法名(【参数列表】);
拥有抽象方法的类被称为抽象类,抽象类也需要用到abstract修饰。【修饰符】abstract 类名class{}
1.2.2抽象类不能实例化
抽象类由于含有抽象方法,所以他不能直接被实例化。子类继承后,重写抽象方法后,才可以实例化该子类。
1.2.3抽象类中除了抽象方法外,还可以有其他方法;
public abstract Book{
String name;
int price;
public abstract void read();
}
public EnglishBook extends Book{
public void read(){
System.out.println("读英语书");
}
}
public class test{
public static void main(String[] args){
EnglishBook english = new English();
english.read();
}
}
二接口
2.1接口的来历
我们知道抽象类是由于类中含有抽象方法,那么我们可不可以定义一个只有抽象方法的类。
这个只有抽象方法的类被称为接口。
2.2接口的特点
2.2.1接口中没有普通方法,全为抽象方法,默认修饰符为 public abstrace。 jdk8以后,接口中引入了默认方法和静态方法(又称类方法),下文中详细接收。
2.2.2 接口的属性全为final修饰的常量!!!默认修饰符为 public static final
2.2.3 接口的定义不再使用class,而改为interface定义
2.2.4子类使用implement继承接口。同时可以继承多个父接口,这就解决了子类只能继承一个父类的问题,使子类的形成,更加便利。
2.2.5子接口也可以同时继承多个父接口,子接口使用extends继承父接口。
2.3常见的接口定义形式
[修饰符] interface 接口 [extends 父接口1,父接口2]{
//常量一定要进行初始化
【public】【static】【final】常量类型 常量名 = 常量值;
【public】【abstrace】方法返回值类型 方法名(【参数列表】);
[public] default 方法返回值类型 方法名([参数列表]){ //默认方法的方法体};
[public] static 方法返回值类型 方法名(参数列表}){//静态方法的方法体}
}
举例
interface Animal{
//定义常量
String name ="Animal";
//定义抽象方法
public abstract void breath();
}
interface dog extends Animal{
public abstrace void eat();
}
class hashiqi implements dog{
public void breath(){ System.out.println("动物都会呼吸.");}
public void eat(String foot){System,out.println("狗狗吃"+foot);}
}
class test{
public static void mian(String args){
hashiqi erha = new hashiqi();
System.out.println(erha.name);
erha.eat("骨头");
erha.breath();
}
}
2.4静态方法
2.4.1静态方法默认用 static修饰;
2.4.2静态方法允许有方法体;
2.4.3静态方法可以通过 接口.方法名 直接进行调用。有时候程序员希望,在不创建实例对象的情况下,就可以调用接口的某个方法,这时候 静态方法就显得即为重要。 当然,静态方法也可以通过接口的实现类的实例对象来调用;
2.5默认方法
2.5.1接口中的默认方法同父类的方法一样,可以有方法体
2.5.2 默认方法可以被子类重写;
2.5.3默认方法使用default修饰;
2.5.4默认方法只能通过接口的实现类的实例对象来调用。
三 接口和抽象类的区别
1 “有没有”和“是不是”
接口可以多继承,也就是可以有多个接口供子类“有没有“去选择继承;
public interface Sleep {
public static int a = 1;
public static int b = 2;
public void ioSleep(int i);
}
public interface Eat {
public abstract void ioEat();
}
public interface Study {
public void ioStudy();
}
public class Cat implements Sleep,Eat{
@Override
public void ioSleep(int i) {
System.out.println("我是猫,我每天都不用睡觉!!!");
}
@Override
public void ioEat() {
System.out.println("我是猫,我吃猫粮!!!");
}
}
public class Person implements Sleep,Eat,Study{
@Override
public void ioStudy() {
System.out.println("我是人,我每天都要学习");
}
@Override
public void ioEat() {
System.out.println("我是人,我要吃大鱼大肉还要喝酒");
}
@Override
public void ioSleep(int i) {
System.out.println("我是人,我每天要睡24小时");
}
}
而抽象类是单继承,抽象类的多种方法是让子类是不是;
1.抽象类描述的是“是不是”的问题,而接口描述的是“有没有”的问题;
2.在Java中类的继承是“单继承”,可以“多对一”,但是不允许“一对多”。而一个类却可以同时实现多个接口;
3.2
abstract class | Interface | |
---|---|---|
定义 | abstract class关键字 | Interface关键字 |
继承 | 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 | 接口只可以继承接口(一个或多个);子类可以实现多个接口 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
方法实现 | 可定义构造方法,可以有抽象方法和具体方法 | 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现 |
实现方式 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
作用 | 了把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低偶合 |