Java基础-接口

来源:互联网 发布:复旦大学经济学院 知乎 编辑:程序博客网 时间:2024/06/03 13:14
  • 接口的定义与使用
  • 抽象类的使用
  • 接口与抽象类的区别   


1接口的定义与使用

1.1接口的定义

接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合。

一个接口往往只有方法的特征没有方法的实现,因此这些方法可以在不同的类实现时,可以具有不同的行为。接口把方法的特征和方法的实现分割开来,这种分割体现在接口常常代表一个角色(Role),它包装了与该角色相关的操作和属性,而实现这个接口的类便扮演这个角色的演员(类)。一个角色(接口)可以由不同的演员(类)来演,不同的演员(类)之间除了扮演一个共同的角色(接口)之外,并不要求有任何其他的共同之处。

接口定义的一般形式:

[接口修饰符] interface <接口名> {

//成员变量和方法的声明

}

/** * 这是一个接口实例 * @author xiang * */public interface Test {public static final int num = 2; //成员常量具有固定的修饰符:public static finalint num2 = 8;public abstract void method1(); //成员函数具有固定的修饰符:public abstract String getStr();default void defaultMethod(){//接口默认的方法,Java 8带来的特性,接口也可以包含行为,而不仅仅是方法签名System.out.println("这是接口的默认方法");}static void staticMethod(){//static方法System.out.println("这是接口的static方法");}}

1.2 接口的特性

接口里的成员变量默认是public static final类型的,即使不使用这些修饰符修饰成员变量,也会在编译的时候加上。必须被显示初始化,即接口中的成员变量为常量;

接口不能声明为final的,因为final类型必须要实现。接口也不是类,不能使用new运算符实例化一个接口;

一个接口不能实现(implements)另一个接口,但接口可以实现多层继承和多继承,接口与接口之间可以是继承关系;

在Java8中,接口可以有默认的方法(用default关键字),也就是说接口也可以包含行为,而不仅仅是方法签名。默认的方法可以在类的实现里选择性的重写

接口中也可以用static关键字修饰方法,用static修饰的方法必须要有方法体

对于接口中的固定修饰符,可以省略

当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

1.3 接口的使用

public class Demo implements Test {@Overridepublic void method1() {System.out.println("执行了方法method1");}@Overridepublic String getStr() {return null;}@Overridepublic void defaultMethod() {//Test.super.defaultMethod();//.......}public static void main(String[] args) {Test t1 = new Demo();//接口的一个实现t1.method1();Test t2 = new Test() {@Overridepublic void method1() {// TODO Auto-generated method stubSystem.out.println("执行了方法method1....");}@Overridepublic String getStr() {// TODO Auto-generated method stubreturn null;}};t2.method1();}}

1.4 在Java9中的私有接口方法

Java8中有接口的默认方法,若接口上有多个默认方法,代码又几乎相同,会发生什么情况?通常将会重构这些方法,调用一个可复用的私有方法,但是接口中的默认方法不能是私有的,将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法为成为公共API的一部分。使用Java9,可以向接口添加一个私有辅助方法来解决此问题

public interface MyInterface {void nomalInterfaceMethod();default void interfaceMethodWithDefault(){init();}default void anotherDefaultMethod(){init();}//this method is not part of the public API exposed by MyInterfaceprivate void init(){System.out.println("Initializing");}}


2 抽象类的使用

抽象类和一般的类很相似,只是在类中存在一些没有方法体的方法,即抽象方法。抽象类需要其他类继承来实现抽象类中的方法,以及给出更多的方法。抽象类有如下特点:

抽象类一般在父类中使用,而它的子类实现父类中的抽象方法;

如果父类有一个或多个抽象方法,那么父类就必须是抽象类;

抽象类里的抽象方法没有方法体,子类要实现父类所有的抽象方法。如果有部分抽象方法没有实现,则子类也必须为抽象类;

所有的抽象方法都必须声明在抽象类中,抽象类里的抽象方法只有在子类实现之后才能使用;

抽象类中允许有抽象方法和普通方法。

3 接口与抽象类的区别 

 1)抽象类中往往有一个或多个抽象方法,接口中的方法一般全部被修饰为抽象方法,接口里的方法默认修饰为public abstract类型的

 2)如果抽象类的子类有一个没有实现的抽象方法,那么这个类必须是抽象类。一个类只能继承一个抽象类,而一个类却可以实现多个接口。

 3)抽象类中的成员变量可以是各种类型的,而接口中的成员只能是 public static final 类型的常量。


2 0
原创粉丝点击