目录
接口的概念
接口指用interface关键字定义的特殊类,也称接口类型,他描述系统对外提供的服务,但不包含具体实现
接口定义了多个类的共同行为规范,这些行为是对象与外部交流的通道,接口体现了规范与实现分离的设计原则,提高了系统的可扩展性和可维护性
定义接口:
【修饰符】 interface 接口【extends 父接口列表】{
//(1)声明静态常量
//(2)声明抽象方法
//(3)定义默认方法
//(4)定义静态方法
}
(1)声明静态常量的默认修饰符public final static ,也声明为final static
(2)声明抽象方法的默认修饰符public abstract
(3)定义默认方法的默认修饰符default,该方法是实体方法,在实现接口的子类可以调用
(4)定义静态方法的修饰符static,该方法是实体方法,用接口名直接调用
package h.j.k;
interface MyInterface{//接口
double pt = 3.14;//静态常量,默认修饰符public final static
void show(String meg);//抽象方法,默认修饰符public abstract
public default void printX(){//默认方法(Java 8)
System.out.println("接口默认方法");
}
public static void printY(){//静态方法(Java 8)
System.out.println("接口静态方法");
}
}
子类实现接口:
class 子类名 implements 接口a,接口b,接口c……{
//数据成员
//成员方法
//实现接口的所有抽象方法
}
class MyClass implements MyInterface{//子类实现接口
void display(){
System.out.println("子类方法");
}
@Override
public void show(String meg) {//覆写接口的抽象对象
System.out.println("覆写接口的抽象方法");
}
}
接口:
接口简单的说是一类行为的集合,接口不创建对象,接口内可以有抽象方法、常量、默认方法、静态方法
package h.j.k;
interface MyInterface{//接口
double pt = 3.14;//静态常量,默认修饰符public final static
void show(String meg);//抽象方法,默认修饰符public abstract
public default void printX(){//默认方法(Java 8)
System.out.println("接口默认方法");
}
public static void printY(){//静态方法(Java 8)
System.out.println("接口静态方法");
}
}
class MyClass implements MyInterface{//子类实现接口
void display(){
System.out.println("子类方法");
}
@Override
public void show(String meg) {//覆写接口的抽象对象
System.out.println("覆写接口的抽象方法");
}
}
public class Show {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.show("接口抽象方法");//子类对象调用实现的抽象方法
mc.printX();//通过子类调用接口的默认方法
MyInterface.printY();//通过接口名调用接口的类方法
System.out.println(MyInterface.pt);
}
}
总结:接口内的成员,方法等都必须是抽象的或是public,static,final的。
函数式接口:
什么是函数式接口,函数式接口就是只有一个抽象方法的接口被称为函数式接口
用abstract修饰的类:
含有抽象方法的类,必须是抽象类
抽象类中,未必一定含有抽象方法
抽象类不能实例化对象
定义抽象类
abstract class 抽象类名{
//数据类型
//构造方法
【访问权限】返回值类型 方法名(形参列表){//普通方法
//方法体
【return 返回值】
}
【访问权限】 abstract 返回值类型 方法名(形参列表);//抽象方法,无方法体
}
抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法;
abstract class Animal1{
public void keeper(){}//普通方法
abstract void food();//抽象方法
}
抽象类中可以不定义抽象方法,但抽象方法的类必须是抽象类;
抽象类可以派生子类,如果派生实体子类,实体子类必须实现抽象类中定义的所有抽象方法;如果派生抽象子类,抽象子类可以不实现抽象父类的抽象方法
abstract class Animal1{
public void keeper(){}//普通方法
abstract void food();//抽象方法
}
class Cat1 extends Animal1{//实体子类,覆写父类抽象方法
@Override
void food() {
System.out.println("小猫吃鱼");
}
}
abstract class Dog extends Animal1{//抽象子类,可不覆写父类抽象方法
abstract void eat();
}
抽象类修饰的特点:
抽象对象不能实例化对象,由抽象类派生的实体子类实例化抽象父类对象
虽然抽象类中能定义构造方法,但不能直接调用抽象类的构造方法实例化对象
抽象父类和抽象子类不能有方法名与形参列表相同的抽象方法,即抽象方法不能重载
abstract 与final 不能同时修饰同一个类,因为final 修饰的类不能被继承,如果抽象类不能被继承,就没有子类覆写父类的抽象方法,抽象类的存在就毫无意义
abstract 不能与private、static、final或native等同时修饰一个方法