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