java开发三年,Java中接口的使用你得知道,不然你凭什么涨薪
接口概述:
接口是Java语言中的一种引用类型,是方法的"集合",所以接口的内部主要就是定义方法,包含常量,抽象方法(JDK 7及以前),额外增加默认方法和静态方法(JDK 8),额外增加私有方法(jdk9)。
接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。
public class 类名.java–>.class
public interface 接口名.java–>.class
接口的使用,它不能创建对象,但是可以被实现(implements ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。
定义格式
public interface 接口名称 {
// 常量
// 抽象方法
// 默认方法(jdk8)
// 静态方法(jdk8)
// 私有方法(jdk9)
}
案例
public interface IA {
// 常量 默认修饰符 public static final 这三个修饰符可以省略
public static final int NUM1 = 10;
int NUM2 = 20; // 抽象方法 默认修饰符 public abstract 这2个修饰符可以省略
public abstract void method1();
void method2(); // 默认方法 默认修饰符 public default public修饰符可以省略,default不可以省略
public default void method3(){
System.out.println("默认方法 method3");
} default void method4(){
System.out.println("默认方法 method4");
} // 静态方法: public static修饰 static修饰符不可以省略 public可以省略
public static void method5(){
System.out.println("静态方法 method5");
} // 私有静态方法 使用private static修饰 不可以省略
private static void method6(){
System.out.println("私有静态方法 method6");
} // 私有非静态方法 使用private修饰
private void method7(){
System.out.println("私有静态方法 method7");
}
} public class Test {
public static void main(String[] args) { System.out.println(IA.NUM1);// 10
} // 类中的默认方法,使用默认权限修饰符(空)
void method(){ }
}
接口中成员的访问特点
接口中成员访问特点概述
接口中成员的访问特点:
接口中的常量: 主要是供接口直接使用
接口中的抽象方法: 供实现类重写的
接口中的默认方法: 供实现类继承的(实现类中可以直接调用,实现类对象也可以直接调用)
接口中的静态方法: 只供接口直接调用,实现类继承不了
接口中的私有方法: 只能在接口中直接调用,实现类继承不了
案例演示
public interface IA {
// 接口中的常量: 主要是供接口直接使用
public static final int NUM = 10; // 接口中的抽象方法: 供实现类重写的
public abstract void method1(); // 接口中的默认方法: 供实现类继承使用(实现类中可以直接调用,实现类对象也可以直接调用)
public default void method2(){
System.out.println("默认方法method2");
method4();
method5();
} // 接口中的静态方法: 只供接口直接调用,实现类继承不了
public static void method3(){
System.out.println("静态方法method3");
method5();
} // 接口中的私有方法: 只能在接口中直接调用,实现类继承不了
private void method4(){// 只能在接口的默认方法中调用
// 方法体
method5();
} private static void method5(){//
// 方法体
}
} 实现类: public class ImpA implements IA{ /* @Override
public void method2() { }*/ @Override
public void method1() {
System.out.println("重写接口中的method1抽象方法");
}
} 测试类: public class Test {
public static void main(String[] args) { System.out.println(IA.NUM);// 10 // 创建实现类对象,访问NUM常量
ImpA ia = new ImpA();
System.out.println(ia.NUM);// 10 // 调用method2方法
ia.method2(); // 通过接口名调用接口中的静态方法
IA.method3();
//ia.method3();// 编译报错,
}
}
多实现时的几种冲突情况
公有静态常量的冲突: 多个父接口中,相同的常量不能被继承 - 公有抽象方法的冲突: 实现类必须重写一次
公有默认方法的冲突: 实现类必须重写
公有静态方法的冲突: 无影响,因为静态方法实现类不能继承
私有方法的冲突: 无影响,因为私有方法只能在本接口中直接访问,实现类不能继承
实现类重写接口中的默认方法,不需要加default
公有静态常量的冲突
实现类不继承冲突的变量
interface IA{
public static final int a = 10;
public static final int b= 20;
}
interface IB{
public static final int a = 30;
}
class Zi implements IA,IB{
//只继承了b,没有继承a,因为a冲突了
} public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
// System.out.println(z.a);//编译错误
System.out.println(z.b);
}
}
公有抽象方法的冲突
实现类只需要重写一个
interface IA{
public static final int a = 10;
public static final int b= 20;
}
interface IB{
public static final int a = 30;
}
class Zi implements IA,IB{
//只继承了b,没有继承a,因为a冲突了
} public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
// System.out.println(z.a);//编译错误
System.out.println(z.b);
}
}
公有默认方法的冲突
实现类必须重写一次最终版本
interface IA{
public default void show(){
System.out.println("IA");
}
}
interface IB{
public default void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{
@Override
public void show() {//必须重写一次的show()
System.out.println("Zi的show()....");
}
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
公有静态方法的冲突
静态方法是直接属于接口的,不能被继承,所以不存在冲突
interface IA{
public static void show(){
System.out.println("IA");
}
}
interface IB{
public static void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{ }
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();//编译错误,show()不能被继承。
}
}
私有方法的冲突
私有方法只能在本接口中直接使用,不存在冲突
接口和接口的关系
接口可以“继承”自另一个“接口”,而且可以“多继承”
interface IA{}
interface IB{}
interface IC extends IA,IB{//是“继承”,而且可以“多继承”
}
接口继承接口的冲突情况
公有静态常量的冲突: 不能被继承,使用不了
公有抽象方法的冲突: 只继承一个
公有默认方法的冲突: 必须重写一次
公有静态方法和私有方法的冲突 : 无影响,因为不能被子接口继承
公有静态常量的冲突
interface IA{
public static final int a = 10;
public static final int b = 30;
}
interface IB{
public static final int a = 20;
}
interface IC extends IA,IB{//没有继承a
}
//测试:
main(){
System.out.println(IC.a);//错误的
}
公有抽象方法冲突
interface IA{
public void show();
}
interface IB{
public void show();
}
interface IC extends IA,IB{//IC只继承了一个show()
}
class Zi implements IC{
//重写一次show()
public void show(){
}
}
公有默认方法的冲突
interface IA{
public default void d1(){
}
}
interface IB{
public default void d1(){
}
}
interface IC extends IA,IB{//必须重写一次d1()
public default void d1(){
}
}
公有静态方法和私有方法
不冲突,因为静态方法是直接属于接口的,只能使用接口直接访问,而私有方法只能在接口中访问,也没有冲突
实现类继承父类又实现接口时的冲突
定义格式
public class 实现类名 extends 父类名 implements 接口名1,接口名2,...{ }
实现类继承父类又实现接口时的冲突:
公有静态常量的冲突–>没有继承
公有抽象方法的冲突—>重写
公有默认方法的冲突—>优先父类
公有静态方法---->优先父类
私有方法的冲突—> 没有冲突
父类和接口的公有静态常量的冲突
class Fu{
public static final int a = 10;
}
interface IA{
public static final int a = 20;
}
class Zi extends Fu implements IA{//没有继承a变量
}
public class Demo {
public static void main(String[] args) {
System.out.println(Zi.a);//编译错误
}
}
父类和接口的抽象方法冲突
abstract class Fu{
public abstract void show();
}
interface IA{
public void show();
}
class Zi extends Fu implements IA{// 必须重写 }
//测试:
main(){
Zi z = new Zi();
z.show();//a
}
父类和接口的公有默认方法的冲突
class Fu{
public void show(){
System.out.println("a");
}
}
interface IA{
public default void show(){
System.out.println("b");
}
}
class Zi extends Fu implements IA{
}
//测试:
main(){
Zi z = new Zi();
z.show();//a
}
父类和接口的公有静态方法
class Fu{
public static void show(){
System.out.println("fu...");
}
}
interface IA{
public static void show(){
System.out.println("IA...");
}
}
class Zi extends Fu implements IA{//只继承了"父类"的静态方法,没有继承接口的静态方法 }
public class Demo {
public static void main(String[] args) {
Zi.show();//fu…
}
}
父类和接口的私有方法
不存在冲突
最后
大家看完有什么不懂的可以在下方留言讨论,也可以关注我私信问我,我看到后都会回答的。也欢迎大家关注我的公众号:前程有光,金三银四跳槽面试季,整理了1000多道将近500多页pdf文档的Java面试题资料,文章都会在里面更新,整理的资料也会放在里面。谢谢你的观看,觉得文章对你有帮助的话记得关注我点个赞支持一下!
java开发三年,Java中接口的使用你得知道,不然你凭什么涨薪的更多相关文章
- JAVA开发工具eclipse中@author怎么改
1:JAVA开发工具eclipse中@author怎么改,开发的时候为了注明版权信息. 用eclipse开发工具默认的是系统用户,那么怎么修改呢 示例如图所示 首先打开Eclipse--->然后 ...
- java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器
java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...
- 混淆器:java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器
java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...
- 自学 Java开发(Java后台开发|Java后端开发)的书籍推荐
java编程思想java并发编程实战深入理解java虚拟机函数式编程思维tcp/ip详解鸟哥的linux私房菜spring mvc +mybatis开发从入门到精通spring技术内幕elastics ...
- java开发之匿名内部类,接口的使用
下面的例子是Java.JDK7学习笔记上的 打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息 1.Client.java public class Client { pri ...
- Java开发学习--Java 中基本类型和包装类之间的转换
Java 中基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之 ...
- Java开发工具(Eclipse中内容辅助键的使用)
* A:Alt+/ 起提示作用* B:main+alt+/,syso+alt+/,给出其他提示* C:补充输出语句,选中需要输出的部分,alt+/选择最后一项即可* C:定义自己的alt + / * ...
- day11<Java开发工具&常见对象>
Java开发工具(常见开发工具介绍) Java开发工具(Eclipse中HelloWorld案例以及汉化) Java开发工具(Eclipse的视窗和视图概述) Java开发工具(Eclipse工作空间 ...
- 阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO
前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找 ...
随机推荐
- django—Form组件校验方法(is_valid)执行流程
1.从is_valid方法入手 def is_valid(self): """Return True if the form has no errors, or Fals ...
- wait/sleep的区别
相同: 暂停线程,哪里停哪里开始 不同: wait 释放锁等待 sleep 不释放锁等待 wait .notfy. notfyAll 都是属于Object sleep 属于Thread
- Class的继承
Class 的继承 简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. class Point { } class ColorPoint ...
- vue响应式原理整理
vue是数据响应性,这是很酷的一个地方.本文只为理清逻辑.详细请看官方文档 https://cn.vuejs.org/v2/guide/reactivity.html vue的data在处理数据时候, ...
- E. Xenia and Tree 解析(思維、重心剖分)
Codeforce 342 E. Xenia and Tree 解析(思維.重心剖分) 今天我們來看看CF342E 題目連結 題目 給你一棵樹,有兩種操作,把某點標成紅色或者查詢離某點最近的紅點有多遠 ...
- 4G DTU是什么?
要从任何设备(个人计算机.平板电脑或智能手机)访问Internet,需要DTU或热点.大多数宽带和移动DTU在"4G"或第四代网络系统上运行.虽然互联网连接的许多基本原则与4G D ...
- Docker(11)- docker ps 命令详解
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 列出容器 语法格式 doc ...
- 力扣 - 232. 用栈实现队列.md
目录 题目 思路 代码实现 复杂度分析 题目 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列的支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void ...
- XJOI NOIP501/511训练22 ttt学字符串
ttt学字符串 题目大意 大法师ttt 最近在学习字符串,有一天他看到魔力xtx左手拿着A字符串,右手拿着B字符串,两个字符串的长度都是一样的,而且都由abc三种字符构成,大法师ttt的灵力值为C,现 ...
- CF777E Hanoi Factory
DP单调栈优化 看到这道题可以很自然的想到DP 设$dp[i]$表示最后一个$ring$为$i$的最大高度 首先将$b$为第一关键字,$a$为第二关键字,升序排序元素 那么对于$i$来说,它下面的$r ...