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{
}