1. 接口组成更新
1.1 接口组成更新概述
- 接口的组成:
- 常量
public static final(默认修饰符,可省略) - 抽象方法
public abstract(默认修饰符,可省略) - 默认方法(Java 8)
- 静态方法(Java 8)
- 私有方法(Java 9)
- 常量
1.2 接口中的默认方法
接口中默认方法的定义格式:
- 格式:public default 返回值类型 方法名(参数列表){ }
- 范例:public default void show3(){ }
接口中默认方法的注意事项:
- 默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉 default 关键字
- public 可以省略
接口中的默认方法主要用于来实现接口的升级而不破坏现有的代码
package bug.Interface01;
public interface MyInterface {
void show1();
void show2();
public default void show3(){
System.out.println("show3");
}
}
package bug.Interface01;
public class MyInterfaceImplOne implements MyInterface {
@Override
public void show1() {
System.out.println("one show1");
}
@Override
public void show2() {
System.out.println("one show2");
}
}
package bug.Interface01;
public class MyInterfaceImplTwo implements MyInterface {
@Override
public void show1() {
System.out.println("two show1");
}
@Override
public void show2() {
System.out.println("two show2");
}
@Override
public void show3() {
System.out.println("two show3");
}
}
package bug.Interface01;
/*
需求:
1.定义一个接口MyInterface,里面有两个抽象方法:
void show1();
void show2();
2.定义接口的两个实现类
MyInterfaceImplOne
MyInterfaceImplTwo
3.定义测试类
MyInterfaceDemo
在主方法中,按照多态的方式创建对象并使用
*/
public class MyInterfaceDemo {
public static void main(String[] args) {
//按照多态的方式创建对象并使用
MyInterface my = new MyInterfaceImplOne();
my.show1();
my.show2();
my.show3();
MyInterface my2 = new MyInterfaceImplTwo();
my2.show3();
}
}
1.3 接口中的静态方法
接口中静态方法的定义格式:
- 格式:public static 返回值类型 方法名(参数列表){ }
- 范例:public static void show(){ }
接口中静态方法的注意事项:
- 静态方法只能通过接口名调用,不能通过实现类类名或对象名调用
- public 可以省略
package bug.Interface02;
public interface Inter {
void show();
default void method(){
System.out.println("Inter中的默认方法执行了");
}
public static void test(){
System.out.println("Inter中的静态方法执行了");
}
}
package bug.Interface02;
public interface Flyable {
public static void test(){
System.out.println("Flyable中的静态方法执行了");
}
}
package bug.Interface02;
public class InterImpl implements Inter,Flyable {
@Override
public void show() {
System.out.println("show方法执行了");
}
}
package bug.Interface02;
/*
需求:
1.定义一个接口Inter,里面有3个方法:一个抽象方法,一个默认方法,一个静态方法
void show();
default void method(){ }
public static void test(){ }
2.定义一个接口的实现类
InterImpl
3.定义测试类
InterDemo
在主方法中按照多态的方式创建对象并使用
*/
public class InterDemo {
public static void main(String[] args) {
Inter i = new InterImpl();
i.show();
i.method();
Inter.test();
// i.test(); //报错
// InterImpl.test(); //报错
Flyable.test();
}
}
1.4 接口中的私有方法
Java 9中新增了带有方法体的私有方法,这其实再 Java 8 中就埋下了伏笔: Java 8 允许在接口中定义带方法体的默认方法和静态方法。这样就可能会引发一个问题:当两个默认方法或静态方法中包含一段相同的代码实现时,程序必然考虑将这段代码抽取成一个共性方法,而这个共性方法是不需要让别使用的,因此用私有给隐藏起来,这就是 Java 9 增加私有方法的必然性。
接口中私有方法的定义格式:
- 格式1:private 返回值类型 方法名(参数列表){ }
- 范例1:private void show(){ }
- 格式2:private static 返回值类型 方法名(参数列表){ }
- 范例2:private static void show(){ }
接口中私有方法注意事项:
- 默认方法可以调用私有的静态方法和非静态方法
- 静态方法只能调用私有的静态方法
package bug.Interface03;
public interface Inter {
default void show1(){
System.out.println("show1开始执行");
// System.out.println("初级工程师");
// System.out.println("中级工程师");
// System.out.println("高级工程师");
show();
System.out.println("show1执行结束");
}
default void show2(){
System.out.println("show2开始执行");
// System.out.println("初级工程师");
// System.out.println("中级工程师");
// System.out.println("高级工程师");
show();
System.out.println("show2执行结束");
}
private void show(){
System.out.println("初级工程师");
System.out.println("中级工程师");
System.out.println("高级工程师");
}
static void method1(){
System.out.println("method1开始执行");
// System.out.println("初级工程师");
// System.out.println("中级工程师");
// System.out.println("高级工程师");
method();
System.out.println("method1执行结束");
}
static void method2(){
System.out.println("method2开始执行");
// System.out.println("初级工程师");
// System.out.println("中级工程师");
// System.out.println("高级工程师");
method();
System.out.println("method2执行结束");
}
private static void method(){
System.out.println("初级工程师");
System.out.println("中级工程师");
System.out.println("高级工程师");
}
}
package bug.Interface03;
public class InterImpl implements Inter{
}
package bug.Interface03;
/*
需求:
1.定义一个接口Inter
default void show1(){ }
default void show2(){ }
static void method1(){ }
static void method2(){ }
*/
public class InterDemo {
public static void main(String[] args) {
Inter i = new InterImpl();
i.show1();
System.out.println("-------");
i.show2();
System.out.println("-------");
Inter.method1();
System.out.println("-------");
Inter.method2();
}
}