JAVA day08 接口(interface),多态,instanceof
1.接口(interface)
接口是一种引用数据类型。
引用数据类型:数组,类,接口。
1.定义
public interface 接⼝名称 {
2.抽象方法
public interface InterFaceName {
- 抽象方法的使用:必须在实现类里重写所有的抽象方法,创建实现类对象后来调用重写后的方法。
- 默认方法的使用:可以继承也就是实现,可以重写,⼆选⼀,但是只能通过实现类的对象来调⽤。
- 静态方法的使用:静态与 .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.接口的多实现
- 抽象方法:接⼝中,有多个抽象⽅法时,实现类必须重写所有抽象⽅法。如果抽象⽅法有重名的,只需要重 写⼀次。
- 默认方法:接⼝中,有多个默认⽅法时,实现类都可继承使⽤。如果默认⽅法有重名的,必须重写⼀次。
- 静态方法:接⼝中,存在同名的静态⽅法并不会冲突,原因是只能通过各⾃接⼝名访问静态⽅法
- 优先级:当⼀个类,既继承⼀个⽗类,⼜实现若⼲个接⼝时,⽗类中的成员⽅法与接⼝中的默认⽅法重 名,⼦类就近选择执⾏⽗类的成员⽅法。
8.接口的多继承
//类 接口 继承 实现的关系
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 v 1 extends 继承
接口 和 类: 没有此关系
类 和 接口(多实现): 1 v n implements 实现
接口 和 接口(多继承): 1 v n extends 继承
1).接口作为方法参数使用:
可以传所有实现类对象,所以具体使用的都是接口的实现类对象。
2)接口作为返回值类型使用:
可以返回所有实现类对象,所以具体返回的都是接口的实现类对象。
2.多态
多态是继封装、继承之后,⾯向对象的第三⼤特性。
1.定义
是指统一行为,具有多个不同表现形式。
2.多态出现的前提
继承:必须存在父子类关系;实现;二选一
向上造型:在多要中需要将子类型的引用赋值给父类型对象
重写:必须 子类重写父类中的方法
3.多态的实现
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相关推荐
- Java 中接口 interface 实例介绍
接口(interface) 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值 ...
- C# 类实现接口(Interface) 多态 多继承
什么是接口 接口在程序中起到规范代码的作用,例如:电脑的USB接口,这些都是已经定义好的了,制造鼠标键盘U盘等厂家就按这种规格做出来的成品在任何电脑上都可以直接使用,而不需要进行适配,这就是规范的使用 ...
- java继承类长方形面积_java_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法,本文实例讲述了java用接口、多 - phpStudy...
java用接口.多态.继承.类计算三角形和矩形周长及面积的方法 本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** ...
- java继承求三角形圆形面积_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法...
本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 ...
- 【Java4】实例初始化,类初始化,/接口,多态,final/static,权限修饰符/native
文章目录 1.实例初始化过程:有几个构造器,就会有几个实例初始化方法 2.实例初始化和类初始化结合:先类(静态)后实 3.接口:只有abstract可省 3.1 鸟类案例:Flyable相当于父类的一 ...
- 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)
JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...
- 【一起来学Java】继承,多态,抽象,接口
一起来认识Java--继承 我们发现,一些相似的类会用到一些相同的功能. 所以,为了方便起见,就把这些常用到的类的功能单独放在一起,就可以被其他的类所调用了. 继承的定义 父类和子类 父类是被继承的类 ...
- (十)Core Java 面向对象(封装,继承,多态,接口) -02 (96)
目录 : 24 ). 面向对象(聚集关系) 25 ). 面向对象(子父类中变量的特点) 26 ). 面向对象(子父类中函数的特点-覆盖) 27 ). 面向对象(子父类中构造函数的特点 ...
- 【Java语言基础】面向对象之封装、继承、抽象类、接口、多态综合知识习题及总结day11
这几天逐渐被idea所折服,越来越喜欢这个优雅又强大的代码编辑器,有很多人说idea对很多初学者不友好,但是在我看来,只要你足够自律,并且英语不会太差,语法上关键的几个单词没什么大问题,idea对初学 ...
最新文章
- PCA主成分分析以及Python实现(阅读笔记)
- 使用Visual Studio 2019开发Qt程序
- ML之xgboost:利用xgboost算法(结合sklearn)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
- python列表操作
- css的一种预处理器 sass
- Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
- 大学计算机需要论文吗,关于大学计算机论文范文.docx
- 【数据结构与算法】浅谈队列的应用
- Flask 蓝图机制及应用
- 疯狂电商购物节日,设计师受虐加班? | 美妆促销页面设计技巧
- Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
- 《编码规范和测试方法——C/C++版》作业 ·002——函数返回地址、static关键词用法整理
- 高性能 TCP amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布
- Wiener维纳滤波基本原理及其算法实现
- 【PL/SQL】 学习笔记 (3)if 语句使用
- Office Word Excel PPT Addin 插件开发
- ntp server 配置参数_NTP时间服务器的配置
- 和10位CIO,聊了聊他们今年的OKR
- 软件测试中的白盒测试的工具,软件测试人员该如何选择白盒测试工具?常用的白盒测试工具汇总...
- 电脑重装系统后数据恢复的方法
热门文章
- 超材料技术行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- vue如何让自定义函数挂到全局
- Epic融资20亿,离元宇宙更进一步
- 底层I/O性能大PK:Python/Java被碾压,Rust有望取代C++
- 过半中国人是工具类 App 活跃用户,为什么变现却这么难?
- 汉字不能编程?别闹了,只是看着有点豪横,容易被开除!| 原力计划
- 如何将 Python 的一个类方法变为多个方法?
- @程序员,除了女朋友你还要带什么回去?
- Python 分析谁才是「权利的游戏」真正的主角?
- 联想杨元庆:没必要做操作系统和芯片;华为Mate 20 Pro被迫退出安卓 Q Beta;GitHub推赚钱新利器 | 极客头条...