前言:抽象类与接口是学习java基础的一个难点,也是必须要掌握的一个重要知识点,本文就介绍了抽象类与接口的重点知识
目录
一、抽象类与接口的概念
二、抽象类与接口的区别与联系
三、 java8中关于接口的新规范
概念:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类,抽象类是对整个类整体进行抽象,包括属性、行为
1、abstract:抽象的
2、abstract可以用来修饰的结构:类、方法3、abstract修饰类:抽象类
>此类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作4、abstract修饰方法:抽象方法
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是一个抽象类。反之,抽象类当中可以没有抽象方法
>若子类重写了父类当中所有的抽象方法,则此子类方可实例化;>若子类没有重写父类中所有的抽象方法,则子类仍是一个抽象类,需要abstract修饰
>抽象类是为了继承而存在的,所有子类不能全部都是抽象类,这样的话与面向对象编程就相违背。一定要有能够实现所有抽象方法的普通类
【!!!】5、同名同参数的方法要么都声明为非static的(才考虑重写),要么都声明为static的(不是重写)
6、abstract使用上的注意点:
>abstract不能用来修饰:属性,构造器等
>abstract不能用来修饰私有方法、静态方法、final修饰的方法、final修饰的类
abstract class Person {
String name;
int age;
// 有大括号就不能称为是抽象方法
public void eat1() {
System.out.println("人会吃饭");
}
//抽象方法
public abstract void eat();
//普通方法
public void waik() {
System.out.println("人会走路");
}
}
概念:接口是对行为的抽象,也可以说是对类局部(行为)的抽象。
接口的使用
1.接口使用interface来定义
2.Java中,接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员
3.1 JDK7以及以前,只能定义全局常量和抽象方法
全局常量:public static final修饰,但是书写时可以省略不写
抽象方法:public abstrac修饰
3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
4.接口中不能定义构造器,说明接口不可实例化5.Java开发中,接口通过让类去实现(implements)的方式来使用的
>如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍是一个抽象类6.Java类可以实现多个接口----->弥补了Java单继承的局限性
格式:class A extends superclass implements B,C,D
7.接口与接口之间是允许多继承的
接口的使用:
* 1.接口使用上也满足多态性
* 2.接口,实际上就是定义了一种规范
public class USBTest {
public static void main(String[] args) {
Computer com = new Computer();
// 1.创建了接口的非匿名实现类的非匿名对象
Flash flash = new Flash();
com.transferData(flash);
System.out.println("--------------");
// 2.创建了接口的非匿名实现类的匿名对象
com.transferData(new Printer());
System.out.println("--------------");
// 3.创建了接口的匿名实现类的非匿名对象
USB u = new USB() {
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
};
com.transferData(u);
System.out.println("--------------");
// 4.创建了接口的匿名实现类的匿名对象
com.transferData(new USB() {
@Override
public void start() {
System.out.println("mp3开始工作");
}
@Override
public void stop() {
System.out.println("mp3结束工作");
}
});
}
}
class Computer {
public void transfer data(USB usb) {
usb.start();
System.out.println("具体传输数据的细节");
usb.stop();
}
}
interface USB {
// 常量:定义了长、宽、最大最小的传输速度等
public static final int MAX_SPEED = 1270;
void start();
void stop();
}
class Flash implements USB {
@Override
public void start() {
System.out.println("U盘开启工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
class Printer implements USB {
@Override
public void start() {
System.out.println("打印机开启工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
二、抽象类与接口的区别与联系
1、联系
两者都不能实例化
都可以包含抽象方法
2、区别
接口是对行为的抽象。抽象类是对类整体进行的抽象;
类与类之间是单继承的,但类与接口之间是多继承,一个类可以实现多个接口;
接口中除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(jdk8及以后),
而抽象类当中可以定义抽象方法也可以没有抽象方法,抽象类的成员变量有默认值,可以在子类中被重新赋值或被重新定义
接口只给出方法的声明,没有具体的实现。而抽象类中得抽象方法只有方法的声明,但是一般方法既有声明也有实现
三、 java8中关于接口的新规范
JDK8:除了定义全局常量和抽象方法之外, 还可以定义静态方法,默认方法
1、接口中定义的静态方法,只能通过接口来调用
2、如果实现类重写了接口中的默认方法,调用时,调用的是重写后的方法
3、如果子类(实现类)继承的父类和实现的接口声明了同名同参数的方法,
>那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法-->类优先原则
4、如果实现类实现了多个接口,而这多个接口中定义了同名同参数的方法。
>那么在实现类没有重写此方法的情况下,就会报错-->接口冲突
5、如何在子类(或实现类)的方法中调用父类、接口中被重写的方法?
super.父类中声明的方法;//调用的是父类中声明的
接口名.super.接口中声明的方法;//调用的是接口中声明的方法