1.接口(interface)

接口是一种引用数据类型。

引用数据类型:数组,类,接口。

接⼝的使⽤,它不能创建对象,但是可以被实现( implements ,类似于被继承)。

1.定义

public interface 接⼝名称 {

// 抽象⽅法
// 默认⽅法
// 静态⽅法
// 私有⽅法
}

2.抽象方法

抽象⽅法:使⽤ abstract 关键字修饰,可以省略,没有⽅法体。该⽅法供⼦类实现使⽤。

public interface InterFaceName {

public abstract void method();
}
3.默认方法和静态方法
默认⽅法:使⽤ default 修饰,不可省略,供⼦类调⽤或者⼦类重写。
静态⽅法:使⽤ static 修饰,供接⼝直接调⽤。
public interface InterFaceName {
public default void method() {
// 执⾏语句
}
public static void method2() {
// 执⾏语句
}
}
4.私有方法和私有静态方法
私有⽅法:使⽤ private 修饰,供接⼝中的默认⽅法或者静态⽅法调⽤
public interface InterFaceName {
private void method() {
// 执⾏语句
}
}
5.实现
类与接⼝的关系为实现关系,即类实现接⼝,该类可以称为接⼝的实现类,也可以称为接⼝的⼦
类。实现的动作类似继承,格式相仿,只是关键字不同,实现使⽤ implements 关键字。
⾮抽象⼦类实现接⼝:
1. 必须重写接⼝中所有抽象⽅法。
2. 继承了接⼝的默认⽅法,即可以直接调⽤,也可以重写。
class 类名 implements 接⼝名 {
// 重写接⼝中抽象⽅法【必须】
// 重写接⼝中默认⽅法【可选】
}
6.使用
  • 抽象方法的使用:必须在实现类里重写所有的抽象方法,创建实现类对象后来调用重写后的方法。
  • 默认方法的使用:可以继承也就是实现,可以重写,⼆选⼀,但是只能通过实现类的对象来调⽤。
  • 静态方法的使用:静态与 .class ⽂件相关,只能使⽤接⼝名调⽤,不可以通过实现类的类名或者实现类的对象调⽤。
  • 私有方法的使用:
    私有⽅法:只有默认⽅法可以调⽤。
    私有静态⽅法:默认⽅法和静态⽅法可以调⽤。

    注意:如果⼀个接⼝中有多个默认⽅法,并且⽅法中有重复的内容,那么可以抽取出来,封装到私有⽅法中,供默认⽅法去调⽤。

代码说明
import day08.In01.Interface01;
import day08.In01.InterfaceTest01;public class Main01 {public static void main(String[] args) {//主方法里创建的是InterfaceTest01的对象,调用的是实现接口Interface01,InterfaceTest01重写的m1抽象方法InterfaceTest01 in01 = new InterfaceTest01();//因为被重写,所以就可以直接调用抽象方法in01.m1();//默认方法可以继承,可以重写,二选一,但是只能通过实现类的对象来调用。in01.m2();//要使用静态方法需 接口名.方法名 调用Interface01.m3();//私有方法只能通过默认方法或者静态方法调用//1.私有调用 只有默认方法可以调用。in01.m5();//重写后的默认私有in01.m6();//2.私有静态调用 默认方法跟静态方法都能调用in01.m6();//里面调用了私有,还有静态私有Interface01.m7();//静态私有 接口名.方法名Interface01.m8();}
}
//实现类
import day08.In01.Interface01;//实现接口 就必须重写接口里的所有抽象方法
public class InterfaceTest01 implements Interface01 {@Override//重写抽象方法public void m1() {System.out.println("InterfaceTest01实现接口Interface01中的抽象方法m1");}@Override//重写默认方法public void m2() {Interface01.super.m2();System.out.println("InterfaceTest01重写接口Interface01中的默认方法m2");}@Override//也可以重写m5public void m5() {Interface01.super.m5();System.out.println("开开心心快快乐乐健健康康生活");}
}
//接口
/*
* 接口不是类(class)
* 是引用数据类型 :数组,类,接口
* 但可以把它看做一个抽象类
* 接口不能new对象,但可以被实现(implements,可以看做被继承,但它不是继承哦)
*
* */
public interface Interface01 {//接口无法定义成员变量,只有静态常量默认使用public static final 修饰public static final int a = 10;//因为是常量所以必须初始化//因为看做是抽象类,所以含有抽象方法//抽象方法没有方法体哦public abstract void m1();//接口没有构造方法,因为不能new对象//jdk1.7之前 接口中含有抽象方法//jdk1.8就添加了默认方法跟静态方法//jdk1.9还添加了私有方法//默认方法public default void m2(){System.out.println("Interface01 的默认方法m2");}//静态方法public static void m3(){System.out.println("Interface01 的静态方法m3");}//私有方法private void m4(){//默认方法中相同部分System.out.println("开开心心快快乐乐健健康康");System.out.println("Interface01 的私有方法m4");}//1.默认私有:只有默认方法能调用// 当多个默认方法中有许多公共的属性,行为就可以提取到私有方法中,// 再在接口中的默认方法里调用私有方法,然后去主方法里调用默认方法//就可以使用接口中的默认私有方法了public default void m5(){//System.out.println("开开心心快快乐乐健健康康");m4();//调用私有方法}public default void m6(){// System.out.println("开开心心快快乐乐健健康康");m4();m9();//默认调用静态私有}//2.静态私有://默认方法跟静态方法都能调用public static void m7(){// System.out.println("2233");m9();}public static void m8(){// System.out.println("2233");}//私有静态方法private static void  m9(){//静态方法相同部分System.out.println("静态相同部分2233");}}

7.接口的多实现

之前学过,在继承体系中,⼀个类只能继承⼀个⽗类。⽽对于接⼝⽽⾔,⼀个类是可以实现多个
接⼝的,这叫做接⼝的多实现。并且,⼀个类能继承⼀个⽗类,同时实现多个接⼝。
class 类名 [extends ⽗类名] implements 接⼝名1,接⼝名2,接⼝名3... {
// 重写接⼝中抽象⽅法【必须】
// 重写接⼝中默认⽅法【不重名时可选】
}
  • 抽象方法:接⼝中,有多个抽象⽅法时,实现类必须重写所有抽象⽅法。如果抽象⽅法有重名的,只需要重 写⼀次。
  • 默认方法:接⼝中,有多个默认⽅法时,实现类都可继承使⽤。如果默认⽅法有重名的,必须重写⼀次。
  • 静态方法:接⼝中,存在同名的静态⽅法并不会冲突,原因是只能通过各⾃接⼝名访问静态⽅法
  • 优先级:当⼀个类,既继承⼀个⽗类,⼜实现若⼲个接⼝时,⽗类中的成员⽅法与接⼝中的默认⽅法重 名,⼦类就近选择执⾏⽗类的成员⽅法。

8.接口的多继承

⼀个接⼝能继承另⼀个或者多个接⼝,这和类之间的继承⽐较相似。接⼝的继承使⽤ extends 关
键字,⼦接⼝继承⽗接⼝的⽅法。如果⽗接⼝中的默认⽅法有重名的,那么⼦接⼝需要重写⼀
次。
代码说明
//类 接口 继承 实现的关系
public class Main {public static void main(String[] args) {//父类先实现接口A,子类再继承父类Zi1 zi1 = new Zi1();zi1.A1();//调用抽象方法zi1.A2();//默认方法//Afu1111//InterfaceA的默认方法A2//子类先继承父类,再实现接口A,B,上面的方式也能实现多个接口Zi2 zi2 = new Zi2();zi2.A1();zi2.A2();//Azi222//InterfaceA的默认方法A2zi2.B1();zi2.B2();//Bzi222//InterfaceB的默认方法B2zi2.AB();//调用重写后的AB接口相同抽象方法 必须重写// 重写后的AB相同的抽象方法ABzi2.AB2();//调用重写后的AB接口相同默认方法 此时必须重写 没有重复的就可以选择是否重写//InterfaceA的默认方法AB2//重写后的AB相同的默认方法AB2}
}
//父类
//1.可以先让父类实现接口,再通过被继承,使子类也有接口的抽象方法跟默认方法
public class Fu1 implements InterfaceA{@Overridepublic void A1() {System.out.println("Afu1111");}@Overridepublic void AB() {}
}
//子类继承父类,也有接口的方法
public class Zi1 extends Fu1 {}
public interface InterfaceA {//抽象方法public abstract void A1();//默认方法public default void A2(){System.out.println("InterfaceA的默认方法A2");}//AB接口相同抽象方法public abstract void AB();//AB接口相同默认方法public default void AB2(){System.out.println("InterfaceA的默认方法AB2");}}
//父类2
public class Fu2 {
}
//2.子类2是先继承父类2,再实现接口
public class Zi2 extends Fu2 implements InterfaceA,InterfaceB{@Overridepublic void A1() {System.out.println("Azi222");}@Overridepublic void B1() {System.out.println("Bzi222");}@Override//AB接口有相同的抽象方法,就只用重写一次public void AB() {System.out.println("重写后的AB相同的抽象方法AB");}@Override//AB接口有相同的默认方法,就必须重写一次public void AB2() {InterfaceA.super.AB2();//前面的 InterfaceA也能改成B,因为方法都一样,可能内容不一样,看需求System.out.println("重写后的AB相同的默认方法AB2");}
}
public interface InterfaceB {public abstract void B1();public default void B2(){System.out.println("InterfaceB的默认方法B2");}//AB接口相同抽象方法public abstract void AB();//AB接口相同默认方法public default void AB2(){System.out.println("InterfaceB的默认方法AB2");}
}

9.当接口作为方法参数、返回值类型使用

import java.util.Arrays;public class Main {public static void main(String[] args) {Test01 t01 = new Test01();InterfaceAImpl in01 = new InterfaceAImpl();t01.method01(in01);//使用的方法参数也是接口A的实现类//重写的抽象方法A1Test02 t02 = new Test02();InterfaceA i = t02.method02();//用接口类型接收t02.method02();方法返回过来的数据System.out.println(i);//day08.In03.InterfaceAImpl@f5f2bb7  这是接口A的实现类的地址值}
}//接口
public interface InterfaceA {//抽象方法public abstract void  A1();
}//实现类
public class InterfaceAImpl implements InterfaceA{@Overridepublic void A1() {System.out.println("重写的抽象方法A1");}
}
//将接口作为方法参数public class Test01 {//成员方法//此时方法参数是接口A类型public void method01(InterfaceA a){a.A1();//相当于InterfaceA a = new InterfaceAImpl();}
}
import java.util.Arrays;//将接口类型作为返回值
public class Test02 {public InterfaceA method02(){//返回的是一个接口A类型的  in02InterfaceAImpl in02 = new InterfaceAImpl();in02.A1();// 重写的抽象方法A1 调用实现类中的A1方法return in02;//对于这个in02 其实返回的是InterfaceA的实现类}
}

注意:

1.接⼝中,⽆法定义成员变量,但是可以定义常量,其值不可以改变,默认使⽤ public
static final 修饰。
2.接⼝中,没有构造⽅法,不能创建对象。
3.接⼝中,没有静态代码块。
4.接口和类的关系:
    类 和 类(单继承): 1 v 1  extends 继承
    接口 和 类: 没有此关系
    类 和 接口(多实现): 1 v n implements 实现
    接口 和 接口(多继承): 1 v n  extends 继承
5.接口作为方法参数和返回值使用的情况:
    1).接口作为方法参数使用:
        可以传所有实现类对象,所以具体使用的都是接口的实现类对象。
    2)接口作为返回值类型使用:
        可以返回所有实现类对象,所以具体返回的都是接口的实现类对象。

2.多态

多态是继封装、继承之后,⾯向对象的第三⼤特性。

1.定义

是指统一行为,具有多个不同表现形式。

2.多态出现的前提
    继承:必须存在父子类关系;实现;二选一
    向上造型:在多要中需要将子类型的引用赋值给父类型对象
    重写:必须 子类重写父类中的方法

3.多态的实现

⽗类类型 变量名 = new ⼦类对象;
变量名.⽅法名();
⽗类类型:指⼦类对象继承的⽗类类型,或者实现的⽗接⼝类型。
当使⽤多态⽅式调⽤⽅法时,⾸先检查⽗类中是否有该⽅法,如果没有,则编译错误;如果有,
执⾏的是⼦类重写后⽅法。
4.多态的好处
实际开发的过程中,⽗类类型作为⽅法形式参数,传递⼦类对象给⽅法,进⾏⽅法的调⽤,更能
体现出多态的扩展性与便利。
5.引用类型转换
分为向上造型和向下转型两种:
向上造型多态本身是⼦类类型向⽗类类型向上转换的过程,这个过程是默认的。
⽗类类型 变量名 = new ⼦类类型();
向下转型:⽗类类型向⼦类类型向下转换的过程,这个过程是强制的。
⼦类类型 变量名 = (⼦类类型) ⽗类变量名;
6.转型的异常

为了避免 ClassCastException(类型转换异常)的发⽣,Java提供了 instanceof 关键字,给引⽤变量做类型的校验。
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
代码说明
public class Main {public static void main(String[] args) {Dog dog = new Dog();//这样的是创建一个对象,实例化dog.age = 2;dog.eat();//null吃饭//骨头真好吃//多态Animal d = new Dog();//向上造型//父类 变量名 = new 子类();d.name = "小狗欢欢";d.eat();//调用的是父类,但是运行的是被子类重写过的//小狗欢欢吃饭//骨头真好吃System.out.println(d.age);//4  父类的成员变量//向下转型(强制转型)//int a = (int)2.1;if(d instanceof Dog) {//判断引用名是否是Dog类型,避免了强转出现ClassCastException ,类型转换异常这个错误Dog dd = (Dog) d;System.out.println(dd.age);//5子类的age}}
}//父类
public class Animal {//成员变量int age = 4;String name;//成员方法public void eat(){System.out.println(name+"吃饭");}}
//子类
public class Dog extends Animal {int age = 5;@Overridepublic void eat() {super.eat();System.out.println("骨头真好吃");}
}

注意:

成员变量:编译看左边,运行看左边

成员方法:编译看左边,运行看右边 --> 主要是看有没有被重写,没有就运行原来的,反之运行之后的。

静态方法:编译看左边,运行看左边

JAVA day08 接口(interface),多态,instanceof相关推荐

  1. Java 中接口 interface 实例介绍

    接口(interface) 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值 ...

  2. C# 类实现接口(Interface) 多态 多继承

    什么是接口 接口在程序中起到规范代码的作用,例如:电脑的USB接口,这些都是已经定义好的了,制造鼠标键盘U盘等厂家就按这种规格做出来的成品在任何电脑上都可以直接使用,而不需要进行适配,这就是规范的使用 ...

  3. java继承类长方形面积_java_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法,本文实例讲述了java用接口、多 - phpStudy...

    java用接口.多态.继承.类计算三角形和矩形周长及面积的方法 本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** ...

  4. java继承求三角形圆形面积_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法...

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 ...

  5. 【Java4】实例初始化,类初始化,/接口,多态,final/static,权限修饰符/native

    文章目录 1.实例初始化过程:有几个构造器,就会有几个实例初始化方法 2.实例初始化和类初始化结合:先类(静态)后实 3.接口:只有abstract可省 3.1 鸟类案例:Flyable相当于父类的一 ...

  6. 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)

    JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...

  7. 【一起来学Java】继承,多态,抽象,接口

    一起来认识Java--继承 我们发现,一些相似的类会用到一些相同的功能. 所以,为了方便起见,就把这些常用到的类的功能单独放在一起,就可以被其他的类所调用了. 继承的定义 父类和子类 父类是被继承的类 ...

  8. (十)Core Java 面向对象(封装,继承,多态,接口) -02 (96)

     目录 :        24 ). 面向对象(聚集关系) 25 ). 面向对象(子父类中变量的特点) 26 ). 面向对象(子父类中函数的特点-覆盖) 27 ).  面向对象(子父类中构造函数的特点 ...

  9. 【Java语言基础】面向对象之封装、继承、抽象类、接口、多态综合知识习题及总结day11

    这几天逐渐被idea所折服,越来越喜欢这个优雅又强大的代码编辑器,有很多人说idea对很多初学者不友好,但是在我看来,只要你足够自律,并且英语不会太差,语法上关键的几个单词没什么大问题,idea对初学 ...

最新文章

  1. PCA主成分分析以及Python实现(阅读笔记)
  2. 使用Visual Studio 2019开发Qt程序
  3. ML之xgboost:利用xgboost算法(结合sklearn)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
  4. python列表操作
  5. css的一种预处理器 sass
  6. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
  7. 大学计算机需要论文吗,关于大学计算机论文范文.docx
  8. 【数据结构与算法】浅谈队列的应用
  9. Flask 蓝图机制及应用
  10. 疯狂电商购物节日,设计师受虐加班? | 美妆促销页面设计技巧
  11. Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
  12. 《编码规范和测试方法——C/C++版》作业 ·002——函数返回地址、static关键词用法整理
  13. 高性能 TCP amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布
  14. Wiener维纳滤波基本原理及其算法实现
  15. 【PL/SQL】 学习笔记 (3)if 语句使用
  16. Office Word Excel PPT Addin 插件开发
  17. ntp server 配置参数_NTP时间服务器的配置
  18. 和10位CIO,聊了聊他们今年的OKR
  19. 软件测试中的白盒测试的工具,软件测试人员该如何选择白盒测试工具?常用的白盒测试工具汇总...
  20. 电脑重装系统后数据恢复的方法

热门文章

  1. 超材料技术行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  2. vue如何让自定义函数挂到全局
  3. Epic融资20亿,离元宇宙更进一步
  4. 底层I/O性能大PK:Python/Java被碾压,Rust有望取代C++
  5. 过半中国人是工具类 App 活跃用户,为什么变现却这么难?
  6. 汉字不能编程?别闹了,只是看着有点豪横,容易被开除!| 原力计划
  7. 如何将 Python 的一个类方法变为多个方法?
  8. @程序员,除了女朋友你还要带什么回去?
  9. Python 分析谁才是「权利的游戏」真正的主角?
  10. 联想杨元庆:没必要做操作系统和芯片;华为Mate 20 Pro被迫退出安卓 Q Beta;GitHub推赚钱新利器 | 极客头条...