接口
什么是接口?
接口是java语言中的一个抽象类型,用于定义对象的公共行为。接口的创建使用的关键字是interface,在接口的实现中可以定义方法和常量,接口中的普通方法不能有方法体。在jdk8之后,接口中可以创建 static 和 default 方法,并且这两种方法可以有默认的方法实现,示例代码如下:
接口代码:
public interface InterfaceDemo1 {
/**
* 接口中定义的成员变量都是默认 static final修饰的静态常量
*/
int COUNT = 1314;
/**
* 普通方法
*/
void sayHello();
/**
* default方法(实现类可以重写此default方法,也可以不重写)
*/
default void defaultMethod() {
System.out.println("我是接口中的default方法,具有方法体");
}
/**
* static方法
*/
static void staticMethod() {
System.out.println("我是接口中的static方法,具有方法体");
}
}
上面接口的实现类:
public class InterfaceDemo1Impl implements InterfaceDemo1 {
@Override
public void sayHello() {
System.out.println("你好呀");
}
/**
* 注意:接口中的 default方法可以选择实现也可以选择不进行实现
*/
@Override
public void defaultMethod() {
InterfaceDemo1.super.defaultMethod();
}
public static void main(String[] args) {
// 对接口实现类的实例化
InterfaceDemo1Impl impl = new InterfaceDemo1Impl();
impl.sayHello();
// 调用接口中的 static方法
InterfaceDemo1.staticMethod();
// 调用接口中的 常量
System.out.println(InterfaceDemo1.COUNT);
// 调用接口中的 default方法
impl.defaultMethod();
}
}
程序执行结果:
**着重说一句:**接口中的普通方法实现类中必须进行重写,否则报错;接口中的default方法实现类可以选择进行重写也可以选择不进行重写,都可以的;对于static方法是没有办法进行重写的,只能通过接口名称进行调用。
接口的总结:
- jdk8中接口中可以定义 static 和 default 方法,并且这两种方法可以有具体的方法体。
- 类实现接口使用的关键字是 implements。
- 接口不能进行实例化,可以实例化接口的实现类。
- 接口中定义的成员变量默认为 public static final类型。
- 实现类可以选择性的重写或者不重写接口中的 default方法,不重写是不能进行调用的。
- 接口中的 static方法不能进行重写,可以通过接口的名称进行调用。
抽象类
什么是抽象类?
在java中被 abstract关键字修饰的类称为抽象类,被 abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,并没有方法体。抽象类和接口类似,也是用来定义对象的公共行为的,并且也不能被直接实例化。子类使用 extends关键字继承父类(抽象类)。
抽象类示例代码:
public abstract class AbstractDemo {
/**
* 定义普通成员变量
*/
int count = 520;
/**
* 定义私有成员变量
*/
private static final int TOTAL = 666;
/**
* 定义抽象方法
*/
public abstract void abstractMethod();
/**
* 定义普通方法
*/
public void normalMethod() {
System.out.println("我是抽象类中的普通方法,我有方法体");
}
}
子类示例代码:
public class AbstractDemoSon extends AbstractDemo {
@Override
public void abstractMethod() {
System.out.println("在子类中重写了父类中的抽象方法");
}
public static void main(String[] args) {
AbstractDemoSon sonClass = new AbstractDemoSon();
// 给抽象类中的成员变量进行重写赋值
sonClass.count = 1040;
System.out.println(sonClass.count);
// 调用抽象类中的抽象方法
sonClass.abstractMethod();
// 调用抽象类中的普通方法
sonClass.normalMethod();
}
}
程序运行结果:
抽象类的总结:
- 抽象类使用 abstract关键字声明。
- 抽象类不能直接实例化。
- 抽象类可以包含普通方法和抽象方法,抽象方法不能有方法体。
- 子类需使用 extends关键字实现对父类的继承。
- 子类继承抽象类必须重写抽象类(父类)中的抽象方法,否则报错。
- 在子类中可以选择重写抽象类(父类)中的普通方法,也可以选择不重写。
- 抽象类中的属性访问修饰符无限制,可以定义private类型的属性。
区别
接口和抽象类的区别:
- 定义使用的关键字不同:接口使用关键字 interface来定义。抽象类使用关键字 abstract来定义。
- 继承或实现的关键字不同:接口使用 implements关键字定义具体实现。抽象类使用 extends关键字实现继承。
- 子类扩展的数量不同:一个类可以多实现,但只能单继承。
- 属性(变量)访问修饰符不同:接口中的属性修饰符只能是 public。抽象类中的属性访问修饰符无限制,可以为任意修饰符。
- 方法访问修饰符不同:接口中的方法默认修饰符是 public,并且不能定义为其他修饰符。抽象类中的方法修饰符无限制,但抽象方法不能使用 private修饰符。
- 方法实现不同:接口中普通方法不能有方法体。抽象类中普通方法必须有方法体。
- 静态代码块使用不同:接口中不能使用静态代码块。抽象类中可以使用静态代码块。