首页 > 编程语言 >JAVA接口组成更新与方法引用

JAVA接口组成更新与方法引用

时间:2022-09-19 16:56:58浏览次数:68  
标签:JAVA String int void 接口 引用 方法 public

JAVA接口组成更新与方法引用

接口组成

接口组成更新概述

接口的组成

  • 常量

    • public static final (可以省略)
  • 抽象方法

    • public abstract(可以省略)
  • 默认方法(java8后才有)(※)

  • 静态方法(java8后才有)(※)

  • 私有方法(java9后才有)(※)

抽象类的实际意义是描述一类事物,而接口是描述一类事物的一类固有动作

接口中的默认方法

  • 如果一个接口的实现类很多,如果要更新增加接口的新方法就要重写所有的实现类,很麻烦

  • 可选的一种方法则是新建一个接口继承自需要更新的那个接口,让需要使用新功能的实现类实现这个新的继承的接口的新功能就好,但是如果接口的更新很快,会导致整个代码的体系变得庞大难以维护,虽然可以但是还是不够好

所以java8之后提供了更好的方法,就是默认方法


接口中默认方法的定义格式

  • 格式:public default 返回值 方法名(参数列表){ }
  • public可省略
public interface MyInterface01 {
    void show01();

    void show02();

    default void show03(){
        System.out.println("show03");
    }
}

接口中默认方法的注意事项

  • 默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字
  • 接口中的默认方法public可以省略,default不能省略
  • 默认方法用于接口升级不破坏现有代码

接口中的静态方法

接口中静态方法的定义格式

  • 格式:public static 返回值 方法名(参数列表){ }
public interface Inter {
    void show01();

    default void show02(){
        System.out.println("此处是默认方法");
    }
    static void show03(){
        System.out.println("此处是静态方法");
    }
}


public class InterDemo {
  public static void main(String[] args) {
        Inter i = new InterImpl();
        i.show01();
        i.show02();
        Inter.show03();
    }
} 

接口中静态方法的注意事项

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

  • public可省略,static不可省略

  • 如果实现类有多接口,且多接口内含有同名的默认方法,则默认方法必须要重写

  • 如果不重写默认方法,你要使用接口里的默认方法,会用接口名.super.方法名()

接口中的私有方法

接口中私有方法的定义格式

  • 例子,默认方法和静态方法中有相同的输出语句,将相同的输出语句提出来组成一个静态默认或者私有方法,使用时则直接使用私有方法代替相同的部分节省写重复代码的劳作

接口中私有方法的注意事项

  • 默认方法可以调用私有的静态方法和非静态方法
  • 静态方法只能调用静态的私有方法

由于暂时使用java8学习,无法用代码实现

方法引用

体验方法引用

public interface Printable {
    void printString(String s);
}


public class PrintableDemo {
    public static void main(String[] args) {
        usePrintable(s-> System.out.println(s));
        //输出语句可以直接使用sout输出,可以使用方法引用改进
        //方法引用符: ::
        usePrintable(System.out::println);
        //可推导的就是可省略的
        //他把传入的 你好 丢给了 println() 相当于是println("爱生活爱JVA")
    }

    private static void usePrintable(Printable p) {
        p.printString("你好");
    }

}

方法引用符

  • :: 该符号为引用运算符,而它所在的表达式被称为方法引用

推导与省略

  • 如果使用Lambda,那么根据可推导就是可省略的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
  • 如果使用方法引用,也是可以根据上下文推导
  • 方法引用是Lambda的孪生兄弟

引用类方法

常见的引用方式

引用类静态方法
  • 格式:类名::静态方法
  • 范例:Integer::parselnt
    • Integer类的方法:public static int parselnt(String s)将此String转换为int类型数据
public interface Printable {
    int printString(String s);
}


public class PrintableDemo {
    public static void main(String[] args) {
        //使用表达式
        usePrintable(s-> Integer.parseInt(s));

        //使用引用类方法
        usePrintable(Integer::parseInt);
        
        //Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数
    }

    private static void usePrintable(Printable p) {
        int num = p.printString("123");
        System.out.println(num);
    }
}
引用对象的实例方法
  • 格式:对象::成员方法
  • 范例:"HelloWorld"::toUpperCase
    • String类中的方法:public String toUppCase()将此String所以字符转换为大写
public interface Printable {
    void printString(String s);
}
    
    
 

public class Printable1 {
    public void printer(String s){
        String s1 = s.toUpperCase();
        System.out.println(s1);
    }
}
    
    
    
public class PrintableDemo {  
    public static void main(String[] args) {
        //Lambda表达式
        usePrintable(s ->
//            String s1 = s.toUpperCase();
//            System.out.println(s1);
            System.out.println(s.toUpperCase()));

        //引用类的实例
        Printable1 p1 = new Printable1();
        usePrintable(p1::printer);
        //剖析此处如下
        //相当于使用有相同功能的其他类的成员方法替代掉上面Lambda表达式堆对接口的方法重写部分
        Printable1 p1 = new Printable1();
        usePrintable(new Printable() {
            @Override
            public void printString(String s) {
                p1.printer(s);
            }
        });
    }

    private static void usePrintable(Printable p) {
        p.printString("rrrqqqwww");
    }
}
引用类的实例方法
  • 格式:类名::成员方法
  • 范例:String::substring
    • String类中的方法:public String substring(int beginlndex,int endlndex)
    • 从beginlndex开始到endlndex结束,截取字符串,返回一个子串,字串的长度endlndex-beginlndex
public interface Printable {
    String printString(String s,int x,int y);
}



public class PrintableDemo {
    public static void main(String[] args) {
        usePrintable((s,x,y)->s.substring(x,y));

        //直接引用String类下的substring方法处理3个参数,省略了新建匿名内部类+传输形参的步骤
        usePrintable(String::substring);
        //Lambda表达式被类的实例方法替代的时候
        //第一个参数作为调用者
        //后面的参数全部传递给该方法作为参数
    }

    private static void usePrintable(Printable p) {
        String s1 = p.printString("nihaodqwdqwdq",2,5);
        System.out.println(s1);
    }
}

引用构造器

引用构造器其实就是引用构造方法

  • 格式:类名::new
  • 范例:Student::new
public interface Printable {
    Student printString(int id, String name, int age);
}



public class Student {
    private int id;
    private String name;
    private int age;

    public Student() {
    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}



public class PrintableDemo {
    public static void main(String[] args) {
//        //Lambda表达式
        usePrintable((id,name,age)-> new Student(id,name,age));

        //引用构造器方法
        usePrintable(Student::new);
        //Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数
    }

    private static void usePrintable(Printable p) {
        Student s1 = p.printString(001,"xuzhiyuan",22);
        System.out.println(s1.getId()+","+s1.getName()+","+s1.getAge());

    }
}

标签:JAVA,String,int,void,接口,引用,方法,public
From: https://www.cnblogs.com/joeximu/p/16708244.html

相关文章

  • java入门
      成功了编译是javac加那个文件名Hello.java   这个是代码......
  • java毕业生就业管理系统 高校毕业生就业服务平台 就业管理系统 高校就业统计系统 java
    ......
  • 力扣92(java&python)-反转链表Ⅱ(中等)
    题目:给你单链表的头指针head和两个整数 left和right,其中 left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例1:输入:head=......
  • VBA中使用JAVASCRIPT
    PrivateSubCommandButton1_Click()DimjsstrDimsbAsStringDimoSCAsObjectDimiAsIntegerSetoSC=CreateObjectx86("MSScriptControl.ScriptControl")'......
  • 模拟音频接口
    模拟音频接口麦克风接口电路手持话柄及免提麦克风建议采用内置射频滤波双电容(如10pF和33pF)驻极体麦克风,从干扰源头滤除射频干扰,会很大程度改善耦合TDD噪音。33pF电容......
  • Javaweb学习笔记第九弹
    MyBatis案例--环境准备1、依据之前在Navicat建立数据表的方法,新建立一个数据表2、将数据表的相关内容表现在Java文件的实例上:即成员变量和set、get成员方法3、new一个测......
  • Java的 static关键字
    通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法   声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法。 · 它们只......
  • Javascript_DOM操作
    Javascript_DOM操作一、关于Javascript与DOM1.JavaScriptJavaScript简称JS,是一种解释型脚本语言。JavaScript是一种轻量级编程语言。JavaScript是可插入HTML页面的编......
  • Java学习单例式设计
    单例设计模式:1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例2.如何实现?饿汉式vs懒汉式3.区分饿汉式和懒汉......
  • Java复制Word文档
    MicrosoftWord提供了许多易于使用的文档操作工具,同时也提供了丰富的功能集供创建复杂的文档使用。在使用的时候,你可能需要复制一个文档里面的内容到另一个文档。本文介绍......