抽象类、接口

1. 抽象类

语法:

[修饰符列表] abstract class 类名{
    //类体
}

注意,final与abstract不能同时的修饰类,他们之间是冲突的,final修饰的类是不能被继承的。

抽象类的命名:不一定非要这样

AbstractXXX
BaseXXX

普通类中能够定义的成员抽象类中也能定义
抽象类不能创建对象,但是也是有构造器的
代码块,静态的都有

抽象类的两种子类:
普通的子类,必须实现抽象类的所有的抽象方法
抽象类,可以根据需求实现
注意:抽象类还可以继承与普通类

abstract只能用来修饰类和方法
不能与 private final static一起修饰方法

2. 接口

一种全新的数据类型

1.不强调属性,只强调行为的抽象,"继承"它表示功能的扩展。
2.在一个类继承某个类后,还能继续"继承",不受Java单继承限制。
3.没有"is-a"这种继承关系的限制。

接口的定义

[访问权限修饰符] interface 接口名{}

接口的访问修饰权限public 和缺省

接口的使用语法:

 [访问权限修饰符] class 类名 extends 类名 implements 接口名 {}

一个类可以实现多个接口,有继承,是先继承再实现;

接口的优点

接口不受单继承限制,这是接口非常重要的优点。
接口不是类,它和它的实现类,也不需要存在"is-a"关系,接口比抽象类的使用更加灵活。
程序开发中将接口和它的实现类之间的关系,称之为"like-a"关系。只要是实现了Xxx的功能,就像Xxx。
接口表示一种开发标准,一种规范。表示对功能的扩展,它只关注行为,不关注属性。

3.1 接口的特点

(1)不能使用final修饰,天生就是abstract修饰的,隐藏了,不能创建自身的对象
(2)public是不能更改的
(3)接口中的全局常量必须显式赋值,不能用静态代码块赋值,因为接口没有静态代码块
(4)在Java8之前,接口中的方法默认都是public abstract修饰的成员方法,即只能定义抽象方法。
(5)接口没有构造方法,没有构造代码块,也没有静态代码块。
(6)接口的子类可以是;普通类,抽象类

继承(extends)是不能跨越种族的,类和类继承,接口和接口继承,接口和类之间没有继承关系。

普通类继承一个抽象类,需要实现里面的所有抽象方法。
抽象类继承一个抽象类,按需实现里面的抽象方法。
抽象类继承一个普通类,是可以的。
接口在继承一个接口后,会得到接口的所有抽象方法。
类的继承是单继承的,接口的继承是多继承的。
实现(implements),必须发现在类与接口之间,接口和类是没有任何关系的。

普通类实现接口,必须实现所有抽象方法
抽象类实现接口,按需实现抽象方法

3.2 java8中的默认方法和静态方法

(1)默认方法的语法

// 默认方法的语法:
default 返回值类型 方法名(形参列表){
    //方法体
}

修饰权限public 无法更改
作用:

抽象类中的实现方法是用来作为子类的默认实现的,但是接口不具备这个功能。
接口表示对功能的扩展,它更多的是一种标准和规范,多数情况下它不需要实现方法。
Java8仍然新增了默认方法,主要是两个角度考虑:

接口中一旦有了默认实现方法,程序设计接口的灵活性就增加了。在没有默认方法时,接口中一旦新增任何方法,子类都必须实现它。而现在有了默认方法,就不需要这么做:

需要实现的就自己重写,不需要的就直接继承。代码的兼容性和灵活性就增加了。
Java8中引入了Lambda表达式和StreamAPI,接口中的默认方法可以作为它们的实现,完成函数式编程。(这个仅了解,后面会讲Lambda表达式)

代码:

public class Demo01 {
    public static void main(String[] args) {
        Person p1 = new B();
        p1.test();
    }

}
interface Person{
    default void test(){
        System.out.println("我是默认方法,实现类可以选择重写,也可以直接继承!");
    }

}
class B implements Person{
    @Override
    public void test() {
        System.out.println("重写了默认的方法!!");
    }
}

(2)静态方法
语法:

static 返回值类型 方法名(形参列表){
    //方法体
}
接口中的静态方法也是默认public修饰的,不可更改。
它的调用方式是用接口名.静态方法名。
接口中的静态方法也是为了配合Lambda表达式和StreamAPI使用的,其余场景不多见。
接口自从Java8以后有了静态方法,甚至可以写一个main方法。
接口中的静态实现方法,只能自己用,不能用实现类类名调用。

代码:

public class Demo01 {
    public static void main(String[] args) {
        //只能自己调用
        Person.test1();       
    }

}
interface Person{  
    static void test1(){
        System.out.println("静态方法,只能自己调用,实现类不能调用");
    }

}
class B implements Person{
}

4. 抽象类和接口的区别

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长安有故里y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值