Java基础接口

简介: Java基础接口

接口:


1、接口也是一种“引用数据类型”。编译之后也是一个class字节码文件。


2、接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。


3、接口怎么定义,语法是什么?


[修饰符列表] interface 接口名{}

4、接口支持多继承,一个接口可以继承多个接口。


5、接口中只支持两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其它内容。


6、接口中所有的元素都是public修饰的。(都是公开的)。


7、接口中的抽象方法定义时:public abstract修饰符可以省略。


8、接口中的方法都是抽象方法,所以接口中的方法不能有方法体。


9、接口中的常量的public static final 可以省略


总结一句话:三个字“解耦”

面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。

接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)


接口可以解耦合,解开的是谁和谁的耦合!!!

任何一个接口都有调用者和实现者

接口可以将调用者和实现者解耦合

调用者面向接口调用

实现者面向接口编写实现


示例代码:

public class InterfaceTest01{
  public static void main(String[] args){
  //输出常量
  System.out.println(MyMath.PI);
  //编译报错,无法为最终变量PI分配值
  //MyMath.PI = 15.2;
  System.out.println(MyMath.k);
  // MyMath.k = 111;
  }
}
//接口A
interface A{
}
//接口可以单继承
interface B extends A{
}
//接口可以多继承
interface c extends B,A{
}
//我的数学接口
interface MyMath{
  //常量
  public static final double PI = 3.1415926;
  //public static final 可以省略吗?[可以]
  //double PI = 3.1415926;//编译通过
  //k是不是常量???是
  //接口中随便写一个变量就是常量
  //常量:值不能发生改变的常量
  int k = 80;
  //抽象方法
  public abstract int sumInt(int a,int b);
  //public abstract 可以省略并且接口中的方法不能带有主体
    int sum(int x,int b);
}


接口的基础语法:


1、类和类之间叫做继承,类和接口之间叫做实现。

别多想:你仍然可以将"实现"看做“继承”。

继承使用extends关键字完成。

实现使用implements关键字完成。


2、五颗星:当一个非抽象的类实现接口的话,必须将接口中所有的

抽象方法全部实现(覆盖、重写)。


示例代码:

public class InterfaceTest02{
  public static void main(String[] args){
  //接口可以使用多态
  //父类型的引用指向子类型的对象
  MyMath mm = new MyMathImpl();
  //调用接口里面的方法(面向接口编程)
  int result1 = mm.sum(10,20);
  System.out.println(result1);
  int result2 = mm.sub(20,10);
  System.out.println(result2);
  }
}
//特殊的抽象类,完全抽象的,叫做接口
interface MyMath{
  double PI = 3.1415926;
  int sum(int a,int b);
  int sub(int a,int b);
}
// 这样没问题
/*
abstract class MyMathImpl implements MyMath {
}
*/
//编写一个类(这个类是一个“非抽象”的类)
//此类名字随意
//错误:MYMathImpl不是抽象的,并且未覆盖MyMath中的抽象方法sub(int,int)
//class MyMathImpl implements MyMath{}
class MyMathImpl implements MyMath{
  //错误:正在尝试分配更低的访问权限; 以前访问权限为public【访问权限控制符】
  /*
  int sum(int a, int b){
  return a + b;
  }
  */
  // 重写/覆盖/实现 接口中的方法(通常叫做实现。)
  public int sum(int a,int b){
  return a + b;
  }
  public int sub(int a,int b){
  return a - b;
  }
}


接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?


对于计算机来说,一个机箱上有多个接口,一个接口是接键盘的,一个接口是接鼠标的,一个接口是接电源的,一个接口是接显示器的…

重点(五颗星):一个类可以同时实现多个接口。


这种机制弥补了java中的哪个缺陷?


java中类和类只支持单继承。实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷。


接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转。编译器没意见。但是运行时可能出现:ClassCastException


之前有一个结论:


无论向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系编译器会报错。(这句话不适用在接口方面。)最终实际上和之前还是一样,需要加:instanceof运算符进行判断。向下转型养成好习惯。转型之前先if+instanceof进行判断。

示例代码:

public class InterfaceTest03{
  public static void main(String[] args){
    // 多态该怎么用呢?
    // 都是父类型引用指向子类型对象
    A a = new D();
    B b = new D();
    C c = new D();
    //a.m2(); // 编译报错。A接口中没有m2()方法。
    // 这个编译没问题,运行也没问题。
    // 调用其他接口中的方法,你需要转型(接口转型。)
    B b2 = (B)a;
    b2.m2();
    // 直接向下转型为D可以吗?可以
  D d = (D)a;
  d.m2();
       m m = new e();
    // 经过测试:接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转。
    // 但是一定要注意,运行时可能会出现ClassCastException异常。
    // 编译没问题,运行有问题。
    //k k = (k)m;
       if(m instanceof k){
     k k = (k)m;
    }    
  }
}
interface X{
}
interface Y{
}
interface Z extends X,Y{ //接口和接口支持多继承。
}
interface k{
}
interface m{
}
class e implements m{
}
interface A{
  void m1();
}
interface B{
  void m2();
}
interface C{
  void m3();
}
// 实现多个接口,其实就类似于多继承。
class D implements A,B,C{
    public void m1(){
  }
    public void m2(){
  System.out.println("m .....");
  } 
  public void m3(){
  } 
}


继承和实现都存在的话,代码应该怎么写?


extends 关键字在前。implements 关键字在后。


示例代码:


public class InterfaceTest04{
  public static void main(String[] args){
  // 创建对象(表面看Animal类没起作用!)
  Flyable f = new Cat();//多态。
  f.fly();
  // 同一个接口
  Flyable f2 = new Fish();
  // 调用同一个fly()方法,最后的执行效果不同。
  f2.fly();
  }
}
// 动物类:父类
class Animal{
}
// 可飞翔的接口(是一对翅膀)
// 能插拔的就是接口。(没有接口你怎么插拔。)
// 内存条插到主板上,他们之间有接口。内存条可以更换。
// 接口通常提取的是行为动作。
interface Flyable{
  void fly();
}
// 动物类子类:猫类
// Flyable是一个接口,是一对翅膀的接口,通过接口插到猫身上,让猫变的可以飞翔。
class Cat extends Animal implements Flyable{
  public void fly(){
  System.out.println("我是一只猫,我在太空翱翔,我喜欢飞!");
  }
}
// 蛇类,如果你不想让它飞,可以不实现Flyable接口
// 没有实现这个接口表示你没有翅膀,没有给你插翅膀,你肯定不能飞。
class snake extends Animal{
}
// 想飞就插翅膀这个接口。
// 鱼(默认实际上是存在继承的,默认继承Object。)
/*
class Fish extends Object implements Flyable{
}
*/
class Fish implements Flyable{//没写extends,也是有的,默认继承Object。
  public void fly(){
  System.out.println("我是一只鱼,我学会了飞!(六眼飞鱼!)");
  }
}
相关文章
|
22天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
35 6
|
22天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
31 2
|
1天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
2天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
11 1
|
8天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
33 4
|
14天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
12天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
13天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
16 1
|
18天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
14 3
|
18天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
29 2