Java – 面向对象(抽象与接口)
简介
Java 是一款面向对象的编程语言,它提供了抽象类和接口,抽象和接口更像是一种约束,要求继承它的类,必须按照指定的规定进行编写代码。
抽象类abstruct
定义格式
抽象方法的定义格式:
public abstract 返回值类型 方法名(参数列表);
抽象类的定义格式:
public abstract class 类名 {}
注意:
1.抽象类不能实例化
2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3.可以有构造方法
不能实例化,但是构造方法是给子类创建实例的时候给子类初始化成员变量的
4.抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
接口
接口就是一种规则。约束开发过程中必须实现某些功能
在我们平时的开发中,开发多个类时,容易忽略了一些开发规范,比如开发方法时的命名方式,方法实现等等,也能规范多态应用中类方法不规范的问题。
定义接口
1.接口用关键字 interface 接口名 {}
2.接口不能实例化
3.接口和类之间是实现关系,通过 implements 关键字表示
public class 类名 implements 接口名 {}
4.接口的子类称为实现类
要么重写接口中的所有抽象方法
要么是抽象类
注意:
1.接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements 接口名1,接口名2 {}
2.实现类还可以再继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1,接口名2 {}
接口中成员的特点
成员变量
接口中的成员只能是常量,而且默认修饰符public static final
修饰
构造方法
接口中是没有构造方法的
成员方法
接口中的成员方法只能是抽象方法
默认修饰符:public abstuct
public interface Inter {
/* 显式声明 public static final */
public static final String b = "abc";
/* 成员变量如果不写,Java 也会帮你自动带上,而且只能是 public static final */
String a = "abc";
/* 显式声明 public abstract*/
public abstract void Methods();
/* 方法体如果不声明,Java 会帮你自动带上,而且只能是 public abstract */
void Method();
}
在JDK 7以前,接口中只能定义抽象方法
JDK8新特性:接口中可以定义有方法体的方法。
JDK9的新特性:接口中可又定义私有方法。
接口和类之间的关系
类和类的关系
继承关系,只能单继承,不能多继承,但是可以多层继承
class Zi extends Fu {}
类和接口的关系
实现关系,可以单实责,也可以多实现,还可以在继承一个类的同时实现多个接口。
class Person implements Inter {}
class Student extends Person implements Inter {}
当多个接口中存在相同名称的接口名时,实现类中只需要实现一次就可以。
接口和接口的关系
继承关系,可以单继承,也可以多继承
// 声明接口1,里面有一个方法约束 Method1
public interface Inter1 {
public abstract void Method1();
}
// 声明接口2,里面有一个方法约束 Method2
public interface Inter2 {
public abstract void Method2();
}
// 声明接口3,它继承了接口1和接口2,里面有一个方法约束 Method3
public interface Inter3 extends Inter1,Inter2 {
public abstract void Method3();
}
// 在实现 接口3 时,需要把 接口3 继承的方法约束也必须实现
public class InterEmpl implements Inter3{
@Override
public void Method1() {
}
@Override
public void Method2() {
}
@Override
public void Method3() {
}
}
JDK8 新增特性
接口可以明确约束类对于方法体的实现规范,但有个问题,接口就成为一个非常重要且大局的事情,因为它关系到下面所有实现该接口的类,如果这个接口增加一个新的接口方法,那么所有实现这个接口的类都会报错。
默认方法
JDK8中提供了一种新的方式,允许在接口中声明有方法体的方法,这样当接口需要新增方法时,使用这种方法体方法,不会使实现接口的类报错,且这个接口方法体是可选实现,类只需要到需要使用这个接口方法时,才去重写就可以。
接口中默认方法的定义格式
格式:public default 返回值类型 方法名(参数列表){ }
范例:public default void show(){ }
接口中默认方法的注意事项
1.默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉 default 关键字
2.public 可以省略,default 不能省略
3.如果实现了多个接口,多个接口中存在相同名字的的默认方法,子类就必须对该方法进行重写。
public interface Inter1 {
// 定义了一个 show 默认方法
public default void show(){
System.out.println("Inter1中的默认接口方法");
}
}
public interface Inter2 {
// 定义了一个 show 默认方法
public default void show(){
System.out.println("Inter2中的默认接口方法");
}
}
public class InterEmpl implements Inter1,Inter2{
// 类必须要重写 show 方法,因为两个接口存在相同默认方法,类在没有重写的情况下,被调用时会分不清该执行那个接口的默认方法
public default void show(){
System.out.println("Inter2中的默认接口方法");
}
}
静态方法
允许在接口中定义静态方法,需要用 static 修饰
接口中静态方法的定义格式
格式:public static 返回值类型 方法名(参数列表){ }
范例:public static void show(){ }
注意
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
public 可以省略,default 不能省略
JDK9 新增的方法
私有方法
JDK9中给接口提供了 private 私有方法,可以定义私有方法,供接口自己调用。
因为JDK8中,Java提供了接口的默认方法,默认方法有方法体,所以意味着有重复代码在每个方法体中,如果把相同代码抽取出来放到另一个方法中供各个默认方法调用,但方法只能定义 public ,而我并不想外面的类调用这个属于接口自己使用的方法。
JDK9提供的私有方法,可以解决这样的问题。
定义格式
普通的私有方法,给默认的方法服务的
格式1:private 返回值类型 方法名(参数列表){}
范例1:private void show(){}
静态的私有方法,给私有方法服务的
格式2:private static 返回值类型 方法名(参数列表){}
范例2:private static void show(){}
接口的应用
接口多态
接口可像父类那样,只要类实现了接口的方法,那么我们可以把这个接口看作是这个类的父类,可以使用多态的方式传递类实例
// 定义了一个接口
public interface Inter3 extends Inter1,Inter2 {
public abstract void Method3();
}
// 在类中实现了 Inter3 接口,那么我们可以把 Inter3 看作是 InterEmpl 类的父类
public class InterEmpl implements Inter3{}
我们就可以使用接口名来接收
Inter3 empl = new InterEmpl();
getInter( empl )
// 定义要传入的类的时候,也可以传入类实现的接口的类型
public static void getInter(Inter3 intempl){ }
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态
共有 0 条评论