概述:
1、Java8之前接口定义:只可以定义抽象方法,不能定义非抽象方法的特殊类型
2、Java8接口的定义:即可以定义抽象方法,也可以定义非抽象方法
如果需要定义非抽象方法,那么当前方法需要使用static或者default修饰
3、改变的原因:
改变之前:如果定义了一个接口,接口已经参与使用,后续想给接口增加一个功能,只能添加抽象方法,但是接口已经在使用,新增一个抽象方法之后,使用过该接口的类型就报错。
改变之后: 为了保证接口可以新增功能,要保证使用过接口的类型不出问题,jdk1.8之 后接口就重新定义:
接口中既可以定义抽象方法也可以定义非抽象特殊方法。
default修饰的方法
1、定义方式:
直接在在修饰符位置上加上default关键字即可
2、注意事项:
(1)如果某个类型实现两个接口,两个接口中定义了两个相同方法声明的抽象方法, 那么该实现类只需要重写其中一个即可。
(2)如果某个类型实现两个接口,两个接口中定义了两个相同方法声明,不同方法实 现的非抽象方法,那么该实现类必须强制重写或者只能继承其中一个,不能同时继承两个。
强制继承方式:接口名.super.方法名();
(3)如果某个类型即继承一个父类,又实现一个接口,父类和接口中有两个相同的方法声明,不同的实现内容的方法;该类可以选择默认继承父类的方法,或者强制继承接口的方法。 强制继承方式:接口名.super.方法名();
package com.demos;
/**
* @Author lss
* @CreateTime 2023/8/17
* @Description
*/
public class Demo02_jdk8接口 {
public static void main(String[] args) {
Inter inter = new InterImpl();
inter.test();
inter.test1();
System.out.println("-------------");
InterImpl1 interImpl1 = new InterImpl1();
interImpl1.test1();
}
}
interface Inter{
void test();
public default void test1(){
System.out.println("Inter test running....");
}
}
interface Inter1{
void test();
public default void test1(){
System.out.println("Inter1 test running....");
}
}
class InterImpl implements Inter,Inter1{
@Override
public void test() {
System.out.println("test running.....");
}
@Override
public void test1() {
//同时实现了两个接口,两个接口有相同的方法声明的非抽象方法
//对于实现类来说 必须重写一个
//重写的格式:
// 接口名.super.非抽象方法()
Inter.super.test1();
// Inter1.super.test1();
}
}
class Fu{
public void test1(){
System.out.println("fu test1 running......");
}
}
class InterImpl1 extends Fu implements Inter{
@Override
public void test() {
System.out.println("InterImpl1 test......");
}
/**
* 一个类继承了父类,同时实现了一个接口
* 父类和接口中都定义了相同的非抽象方法
* 默认是使用父类的非抽象方法
* 如果要使用接口的非抽象方法 需要强制重写:
* 接口.super.非抽象方法()
*/
@Override
public void test1() {
Inter.super.test1();
}
}
总结:
jdk8 可以定义抽象方法 也可以定义非抽象方法 需要加static或者default关键
* 实现了一个接口 实现类可以直接使用接口的非抽象方法,不需要强制重写
* 实现了两个接口(两个接口都定义了相同的非抽象方法)
* 实现类必须要重写非抽象方法,必须要选择执行一个接口的非抽象方法
* 接口名.super.方法名
*继承了一个类实现了一个接口(父类和接口都定义了相同的非抽象方法)
* 默认 是使用父类的方法
* 也可以强制重写接口的非抽象方法
static修饰的方法
1、父类中定义的静态方法可以被子类继承,但是不能被重写
2、接口中定义的静态方法,实现类不能继承
package com.demos;
public class 接口的静态方法 {
public static void main(String[] args) {
Zi1 zi1 = new Zi1();
//1、子类可以继承父类的静态方法 但不能没法重写父类的静态方法
//2、接口定义的静态方法,实现类不能继承
zi1.test01();
}
}
class Fu1{
public static void test01(){
System.out.println("Fu1的静态方法");
}
}
interface Inter2{
public static void test2(){
System.out.println("Inter2静态方法");
}
}
class Zi1 extends Fu1 implements Inter2{
}

被折叠的 条评论
为什么被折叠?



