java接口(interface)

接口

  • 接口概念
    在java语言中接口是一个抽象类型,是抽象方法的集合。
  • 接口定义语法
【访问修饰符】interface 接口名称 【extends 其它的接口名】【implements 其它的接口名】{
		//声明变量
		//抽象方法
}
  • 接口的理解
    (1)一个接口通过继承接口的方式,从而来继承接口的抽象方法。
    (2)接口不是类,编写接口的方式和类很相似,但是它们属于不同的概念,类描述对象的属性和方法。接口则包含类要实现的方法。
    (3)除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
    (4)接口无法被实例化,但是可以实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
    (5)重点在java中,接口类型可以用来声明一个变量,它们可以成为一个空指针(即引用对象类型,默认值是null),或者被绑定在一个以此接口实现的对象。
interface Ex1{
    public void show();
}

interface Ex2{
    public abstract void deal();
}

public  class OwnInterface implements Ex1,Ex2{
    //绑定接口类型变量,Ex1为null
    private Ex1 ex1;
    private Integer i;
    @Override
    public void show() {
        System.out.println("i am ex1");
    }
    @Override
    public void deal() {
        System.out.println("i am ex2");
    }
    public static void main(String[] args) {
        Ex1 ex1 = new OwnInterface();
        ex1.show();

    }
}
  • 接口与类的区别
    (1)接口不能用于实例化对象(new)
    (2)接口没有构造方法
    (3)接口中所有方法都必须为抽象方法
    (4)接口不能包含实例变量,除了static和final变量
    (5)接口不是被类继承,而是要被实现
    (6)接口支持多继承

接口中定义的实例变量就是常量.

  • 抽象类与接口区别
    (1)抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行
    (2)抽象类的成员变量可以是各种类型,而接口的成员变量只能是public static final 类型的
    (3)接口中不能含有静态代码块以及静态方法(用static修饰的方法),而抽象类是可以有静态代码块和静态方法
    (4)一个类只能继承一个抽象类,而一个类可以实现多个接口

  • 接口的多继承
    public interface A{}
    public interface B{}
    public interface C extends A,B{}

  • 接口的实现
    (1)implements关键字
    类使用implements关键字实现接口。在类声明中,implements关键字放在class声明后面。
    (2)子类实现接口
    一个类可以同时实现多个接口。
    一个类只能继承一个类,但是能实现多个接口。
    一个接口能继承一个接口,这和类之间的继承比较相似。

  • 接口作用
    (1)简单规范性
    如果一个项目比较庞大,那么就需要一个能理清业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你要实现的哪些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致其它程序员无法看明白)。
    (2)重要性
    在java语言中,abstract class和interface是支持抽象定义的两种机制。正式由于这两种机制的存在,才赋予java强大的面向对象能力。
    (3)维护、扩展性
    (4)安全、严密性
    接口是实现软件松耦合的重要手段,它描述了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(大多软件服务商考虑的比较多)

接口与default


/**
 * Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方
 * 法,或者虚拟扩展方法(Virtual extension methods)。
 * Default方法是指,在接口内部包含了一些默认的方法实现
 * (也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),
 * 从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
 */
interface MyInterface{

      public default Object defaultMethod(){
        class Cpu{
            int num;
            String name;
            A(int num,String name){
				this.num=num;
				this.name=name;
			}
        }
        return new Cpu(2,"Inter");

    }
}

new 接口或抽象类

在一些程序中,我们可以看到new 接口或抽象类的写法,初一看认为接口和抽象类可以实例化,其实不然,下面就来讨论接口或者实现类被new到底发生了什么?

见代码:


//声明一个接口
public interface TargetInterface {
         void showInfo();
}

//创建一个类new接口
public final class RunningThread {
    public static void main(String[] args) {
        //获取当前线程的名字
        System.out.println(Thread.currentThread().getName());   
        new TargetInterface() {
            @Override
            public void showInfo() {
                System.out.println(this.getClass());
                System.out.println("running...");
            }
        };
    }
}

通过执行RunningThread,查看该RunningThread类class资源发现有两个class文件。
一个是RunningThread.class,另一个是RunningThread$1.class.
回想内部类的时候,也是生成两个字节码文件。

再一次深究,通过javap RunningThread$1.class
反编码后的文件为:
final class demo.thread.RunningThread$1 implements demo.thread.TargetInterface {
  demo.thread.RunningThread$1();
  public void showInfo();
}

说明new针对的还是普通的class(虽然内部类和普通类有很大不一样),只不过这个RunningThread$1.class的写法稍有不同,它是编译器帮我们从匿名内部类中提取的。
结论:接口和抽象类(原理和接口一样,字节码文件也差不多,不再赘述)不可以被new!
不能从字面上就证明可以对interface或者abstract class使用new。
匿名内部类只是一种写法上的迷惑而已。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接口是一种特殊的抽象类,它只包含常量和方法的定义,没有变量和方法的实现。在Java中,使用关键字"interface"定义接口。一个类可以通过实现接口来具体实现接口中定义的方法。 接口的语法格式如下: ``` interface InterfaceName { // 常量定义 // 抽象方法定义 } ``` 接口可以继承其他接口,使用关键字"extends"。一个接口可以继承多个接口,形成多继承的关系。 接口的主要作用是被实现类实现,实现类必须提供接口中所有方法的具体实现内容才能实例化。接口和实现类之间存在多态性的关系。 在强制类型转换中,如果类转换成接口类型,类和接口之间不需要存在继承关系,也可以进行转换。 Java接口中的常量定义使用关键字"public static final",常量的值不能被重新赋值。 下面是一个示例代码,展示了接口的语法和用法: ```java // 定义一个接口 interface MyInterface { // 常量定义 public static final int CONSTANT = 100; // 抽象方法定义 public abstract void method();} // 实现接口 class MyClass implements MyInterface { // 实现接口中的方法 public void method() { // 方法的具体实现 System.out.println("Method implementation"); } } // 测试类 public class Test { public static void main(String[] args) { // 创建实现类的实例 MyClass myObj = new MyClass(); // 调用实现类中的方法 myObj.method(); // 访问接口中的常量 System.out.println(MyInterface.CONSTANT); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值