一、接口的实现
1、接口中是没有静态代码块和构造方法
2、一个类的直接父类只有一个,但是一个类可以实现多个接口
3、如果实现类,所实现的多个接口中,存在重复的抽象方法,那么只需要覆盖重写一次即可
4、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类必须是一个抽象类
5、如果实现类所实现的多个接口中,存在重复的默认方法,那么实现类一定要对默认方法进行覆盖重写
6、一个类,如果直接父类当中的方法和接口当中的默认方法产生了冲突,优先使用父类中的方法
二、接口的继承
1、类和类之间的是单继承,直接父类只有一个
2、类和接口之间是多实现的,一个类可以实现多个接口
3、接口和接口之间是多个继承的
注意事项
1、多个父接口中的抽象方法如果重复,没有关系
2、多个父接口当中的默认方法重复
三、练习
第一个包:
1、
package demo01;
/*
* java 7
* 1、常量
* 2、抽象方法
* java 8
* 1、默认方法
* 2、静态方法
* java 9
* 私有方法
*
*
* 接口中是可以定义 成员变量 但是必须用public static final 关键字修饰
* 从效果上来看,就相对于是一个常量
*
* 1、接口中的常量,用public static final来修饰,是可以省略这三个关键字的
* 2、相当于是常量,因此只能初始化的生活进行赋值,后面不能更改
*
*/
public class Demo01A {
int num=5;
public void method() {
}
}
2、
package demo01;
// static final
public interface Demo01B {
public static final int NUM_OF_CLASS=5;
}
第二个包:
1、
package demo02;
/*
* 1、接口中是没有静态代码块和构造方法
* 2、一个类的直接父类只有一个,但是一个类可以实现多个接口
* 3、如果实现类,所实现的多个接口中,存在重复的抽象方法,那么只需要覆盖重写一次即可
* 4、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类必须是一个抽象类
* 5、如果实现类所实现的多个接口中,存在重复的默认方法,那么实现类一定要对默认方法进行覆盖重写
* 6、一个类,如果直接父类当中的方法和接口当中的默认方法产生了冲突,优先使用父类中的方法
*
*/
public class Demo02A {
public static void main(String[] args) {
Zi zi=new Zi();
zi.method();
}
}
2、
package demo02;
public class Fu {
public void method() {
System.out.println("我是父类方法");
}
}
3、
package demo02;
public interface My {
public default void method() {
System.out.println("我是接口里面的默认方法");
}
}
4、
package demo02;
public interface MyA {
//错误写法:接口中不能有静态代码块
//static{
// }
//错误写法:接口中不能有构造方法
//public MyA(){
// }
public abstract void methodA();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默认方法AAAA");
}
}
5、
package demo02;
public interface MyA {
//错误写法:接口中不能有静态代码块
//static{
// }
//错误写法:接口中不能有构造方法
//public MyA(){
// }
public abstract void methodA();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默认方法AAAA");
}
}
6、
package demo02;
public interface MyB {
public abstract void methodB();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默认方法BBBB");
}
}
7、
package demo02;
public class Mylmp implements MyA,MyB {
@Override
public void methodA() {
}
@Override
public void methodB() {
}
@Override
public void methodAbs() {
}
@Override
public void methodDefault() {
MyA.super.methodDefault();
}
}
8、
package demo02;
public class Zi extends Fu implements My {
}
第三个包:
1、
package Demo03;
/*
* 1、类和类之间的是单继承,直接父类只有一个
* 2、类和接口之间是多实现的,一个类可以实现多个接口
* 3、接口和接口之间是多个继承的
*
*
* 注意事项
* 1、多个父接口中的抽象方法如果重复,没有关系
* 2、多个父接口当中的默认方法重复
*/
public class Demo03R {
//My my=new My();
}
2、
package Demo03;
/*
*
*/
public interface My extends MyA,MyB {
public abstract void method();
@Override
default void methodDefault() {
MyA.super.methodDefault();
}
}
3、
package Demo03;
public interface MyA {
public abstract void methodA();
public abstract void methodCommon();
public default void methodDefault() {
System.out.println("AAAAA");
}
}
4、
package Demo03;
public interface MyB {
public abstract void methodB();
public abstract void methodCommon();
public default void methodDefault() {
System.out.println("BBBB");
}
}
5、
package Demo03;
public class Mylmp implements My{
@Override
public void methodA() {
}
@Override
public void methodCommon() {
}
@Override
public void methodB() {
}
@Override
public void method() {
}
}
第四个包:
1、
package demo04;
/*
* java 中有四种权限修饰符:
* public protected (default) private
* 同一个类中 yes yes yes yes
* 同一个包中 yes yes yes no
* 同一个包中的子类 yes yes yes no
*
*
*
* 不同包子类 yes yes no no
* 不同包的非子类 yes no no no
*/
public class Demo01M {
}
2、
package demo04;
public class MyAnother {
public void anotherMthode() {
MyClass myclass=new MyClass();
//System.out.println(myclass.num);
}
}
3、
package demo04;
public class MyClass {
private int num=5;
public void method() {
System.out.println(num);
}
int sum=num+1;
}
4、
package demo04;
public class MySon extends MyClass {
public void method() {
//System.out.println(super.num);
}
}
第五个包:
1、
package demo05;
import demo04.MyClass;
public class MySon2 extends MyClass {
public void method() {
//System.out.println(num);
}
}
2、
package demo05;
import demo04.MyClass;
public class Stranger {
public void methodStranger() {
MyClass myclass=new MyClass();
//System.out.println(myclass.num);
}
}