抽象类和接口的详解

目录

第一部分:抽象类

1.抽象类:

2.抽象方法:

注意事项:

          3.abstract关键字的冲突:(它们不能共存)

第二部分:接口

接口的定义:(传达规则->制造者制定规则   使用者遵守规则)

注意

第三部分:抽象类与接口的对比

成员变量:

成员方法:

构造方法:

使用场景


第一部分:抽象类

1.抽象类:

定义的格式:

public/protect abstract class 类名{}

抽象类是一种特殊的父类

特殊的原因:内部允许编写抽象方法

2.抽象方法:

       当我们将共性的方法抽取到父类之后,发现这个方法在父类中无法给出具体的描述,即每一个子类重写方法的时候,实现方法的内容各不相同,所有无法进行具体性描述。而且这个方法还是子类必须要有的方法就可以设计为抽象方法。抽象方法存在于抽象类中(存在抽象方法的类必须为抽象类)

定义格式

public abstract 返回值类型 方法名(参数列表);

抽象方法只需要声明,不需要实现,抽象方法没有定义方法体,方法名后面直接跟分号即可

注意事项:

1.抽象类的子类必须强制重写抽象类(父类)的所有抽象方法;

2.抽象类不能实例化:不能创建对象,如果实例化,就会调用内部没有方法体的抽象方法,无意义;

3.抽象类存在构造方法:

抽象方法既然不能实例化,构造方法存在的意义何在?

       1.父类优先于子类存在,子类实例化时,优先执行构造方法,子类的每一个构造方法中会默认调用父类的无参构造,因为子类的构造方法的第一句隐藏了super(),它由系统自动调用,这种情况是父类只有抽象方法,无成员变量       

        2.还有由子类的构造方法调用父类的有参构造方法完成子类的实例化,这种情况是当父类抽取子类共有的成员变量时,子类可以在自己的有参构造中,调用父类的无参构造,完成自身实例化,

4.抽象类中可以存在普通方法:让子类继承使用

5.抽象类的子类要么重写抽象类中的所有抽象方法,要么自己变为抽象类,即交给自己的儿子重写爸爸没有重写的爷爷的抽象方法,或者爸爸还有一些特别嘱托(抽象方法)交给儿子

3.abstract关键字的冲突:(它们不能共存)

final :修饰的方法不允许被子类重写

private:修饰的方法不允许被子类重写  

static:修饰的方法可以通过类名调用,类名调用抽象方法无意义

public abstract class Aabstract {  //父类->抽象类
    public abstract void work();   //抽象方法(每个子类工作的内容不同,
故无法具体描述,定义为抽象方法)
}

//class people extends Aabstract{    //子类1//继承抽象方法(父类),
//对抽象方法不进行重写则会报错
//}

class student extends Aabstract{  //子类2

    @Override //重写抽象方法
    public void work() {
        System.out.println("好好学习,天天向上!");
    }
}
class teacher extends Aabstract{  //子类3
    @Override //重写抽象方法
    public void work() {
        System.out.println("教书育人!");
    }
}

第二部分:接口

接口的定义:(传达规则->制造者制定规则   使用者遵守规则)

一个抽象类中全部是抽象方法(唯一价值,声明规则),故将次抽象方法设计为接口

接口定义的格式:

[public] interface 接口名 [extends 其它类名]{

}

注意

1.接口不允许实例化

2.实现接口(规则)的类称为实现类,即接口的子类

接口的子类:

1.重写接口中的所有抽象方法

2.在不想实现接口的前提下,可以将实现类定义为抽象类,为接口中的抽象方法提供存活环境即提供抽象方法(把接口可以当作实现类的干爹)(但一般不这样做)

3.接口中成员的特点:

  • 成员变量(大写):只能定义常量,因为系统会默认加入三个关键字public static final三个关键字,无顺序关系,接口内定义变量成员会默认转为常量
  • 成员方法:只能为抽象方法,系统默认加入public abstract
  • 构造方法:没有构造方法。 

实现类(子类)的构造方法中隐藏父类的无参构造super,既然没有构造方法,这无参构造super从哪里来?

答:接口可以认为是干爹,其实实现类默认会继承object()祖先类,祖先类提供super;

4.接口与类的关系:

  • 1.回顾一下类与类的关系:继承关系,只支持单继承,不支持多继承,但可以多层继承;

  • 2.类与接口的关系:实现关系(类实现接口的抽象方法)通过implements关键字来完成

可以单实现,也可以多实现,甚至可以继承一个类的同时,实现多个接口(无冲突,因为接口只是声明,没有具体化,无代码逻辑)

多实现:

//多继承:
interface A{   //接口1
    void fun1();
}
interface B{   //接口2
    void fun2();
}
public class Iinterface implements A,B{   //实现类,实现多个接口
    @Override
    public void fun1() {
    }
    @Override
    public void fun2() {
    }
}

继承一个类的同时,实现多个接口

class fu   //父类
{
    public void fun()
    {
        System.out.println("我是fun()方法");
    }
}
interface A{   //接口1
    void fun();
}
interface B{   //接口2
    void fun();         //同名不产生冲突
}
class zi extends fu implements A,B{   //实现类(子类),继承了fu类的fun方法,实现多个接口的重写
}
  • 3.接口与接口的关系:

      继承关系,可以单继承,也可以多继承

interface A{   //接口1
    void fun1();
}
interface B{   //接口2
    void fun2();
}
interface C extends A,B{   //接口3,继承接口1.2
    void fun3();
}
public class Iinterface implements C{   //实现类,实现接口3时,不仅要实现接口3,而且接口3继承的其他接口也要实现
    @Override
    public void fun1() {
    }
    @Override
    public void fun2() {
    }
    @Override
    public void fun3() {
        
    }
}

第三部分:抽象类与接口的对比

  • 成员变量:

抽象类:常量,变量都可

接口:只能常量

  • 成员方法:

抽象类:具体方法,抽象方法

接口:抽象方法

  • 构造方法:

抽象类:有(子类super访问)

接口:无(子类干爹,由子类的祖先(object)或爹(子类存在继承关系)负责实现子类中的抽象方法super)

  • 使用场景

抽象类:对事物进行抽象(描述事物,包括行为和属性)

接口:负责对行为做抽象,制定规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值