- 接口的定义与使用
- 抽象类的使用
- 接口与抽象类的区别
1接口的定义与使用
1.1接口的定义
接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合。
一个接口往往只有方法的特征没有方法的实现,因此这些方法可以在不同的类实现时,可以具有不同的行为。接口把方法的特征和方法的实现分割开来,这种分割体现在接口常常代表一个角色(Role),它包装了与该角色相关的操作和属性,而实现这个接口的类便扮演这个角色的演员(类)。一个角色(接口)可以由不同的演员(类)来演,不同的演员(类)之间除了扮演一个共同的角色(接口)之外,并不要求有任何其他的共同之处。
接口定义的一般形式:
[接口修饰符] interface <接口名> {
//成员变量和方法的声明
}
/**
* 这是一个接口实例
* @author xiang
*
*/
public interface Test {
public static final int num = 2; //成员常量具有固定的修饰符:public static final
int 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 {
@Override
public void method1() {
System.out.println("执行了方法method1");
}
@Override
public String getStr() {
return null;
}
@Override
public void defaultMethod() {
//Test.super.defaultMethod();
//.......
}
public static void main(String[] args) {
Test t1 = new Demo(); //接口的一个实现
t1.method1();
Test t2 = new Test() {
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("执行了方法method1....");
}
@Override
public String getStr() {
// TODO Auto-generated method stub
return 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 MyInterface
private void init(){
System.out.println("Initializing");
}
}
2 抽象类的使用
抽象类和一般的类很相似,只是在类中存在一些没有方法体的方法,即抽象方法。抽象类需要其他类继承来实现抽象类中的方法,以及给出更多的方法。抽象类有如下特点:
抽象类一般在父类中使用,而它的子类实现父类中的抽象方法;
如果父类有一个或多个抽象方法,那么父类就必须是抽象类;
抽象类里的抽象方法没有方法体,子类要实现父类所有的抽象方法。如果有部分抽象方法没有实现,则子类也必须为抽象类;
所有的抽象方法都必须声明在抽象类中,抽象类里的抽象方法只有在子类实现之后才能使用;
抽象类中允许有抽象方法和普通方法。
3 接口与抽象类的区别
1)抽象类中往往有一个或多个抽象方法,接口中的方法一般全部被修饰为抽象方法,接口里的方法默认修饰为public abstract类型的
2)如果抽象类的子类有一个没有实现的抽象方法,那么这个类必须是抽象类。一个类只能继承一个抽象类,而一个类却可以实现多个接口。
3)抽象类中的成员变量可以是各种类型的,而接口中的成员只能是 public static final 类型的常量。