精华内容
下载资源
问答
  • 方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。一、方法引用的三种语法格式1. 对象::实例...

    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。

    一、方法引用的三种语法格式

    1. 对象::实例方法名

    lamdba写法:

    @Testvoid test1(){    Consumer con = x -> System.out.println(x);}

    方法引用写法:

    @Testvoid test2(){    PrintStream out = System.out;    Consumer con = out::println;}

    consumer接口:

    @FunctionalInterfacepublic interface Consumer {    void accept(T t);}

    注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

    2. 类::静态方法名

    lamdba写法:

    @Testvoid test3(){    Comparator com = (x, y) -> Integer.compare(x,y);}

    方法引用写法:

    @Testvoid test4(){    Comparator com = Integer::compare;}

    Comparator接口:

    @FunctionalInterfacepublic interface Comparator {    int compare(T o1, T o2);}

    Integer类部分内容:

    public final class Integer extends Number implements Comparable { public static int compare(int x, int y) {        return (x < y) ? -1 : ((x == y) ? 0 : 1);    }}

    注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

    3. 类::实例方法名

    lamdba写法:

    @Testvoid test5(){    BiPredicate bp = (x,y) -> x.equals(y);}

    方法引用写法:

    @Testvoid test6(){    BiPredicate bp = String::equals;}

    BiPredicate接口:

    @FunctionalInterfacepublic interface BiPredicate {    boolean test(T t, U u);}

    注意:第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数时,就可以使用这种语法。

    二、构造器引用

    类::new

    lamdba写法:

    @Testvoid test7(){    Supplier supplier = ()->new Person();}

    构造器引用写法:

    @Testvoid test8(){    Supplier supplier = Person::new;}

    Supplier接口:

    @FunctionalInterfacepublic interface Supplier {    T get();}

    Person类:

    @Datapublic class Person implements Serializable {    private static final long serialVersionUID = -7008474395345458049L;    private String name;    private int age;    public Person() {    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }}

    注意:person类中有两个构造器,要调用哪个构造器是函数式接口决定的,也就是Supplier接口中的get()方法是无参的,那么就调用的是person中的无参构造器。

    三、数组引用

    Type::new

    lamdba写法:

    @Testvoid test9(){    Function fun = x -> new String[x];}

    数组引用写法:

    @Testvoid test10(){    Function fun = String[]::new;}

    Function接口部分内容:

    @FunctionalInterfacepublic interface Function {    R apply(T t);}

    总结

    • 方法应用及构造器引用其实可以理解为lamdba的另一种表现形式
    • 方法引用被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致
    • 方法引用中使用类::实例方法的条件是第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数
    • 构造器引用需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致

    分享

    8cf0dd7a-fb22-eb11-8da9-e4434bdf6706.png
    8ef0dd7a-fb22-eb11-8da9-e4434bdf6706.png

    上面是本人在学习路上整理的一些比较干货的java资料,如果有需要的兄弟可以先关注我,私信我回复【资料】即可。

    展开全文
  • 方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。一、方法引用的三种语法格式1. 对象::实例...

    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。

    一、方法引用的三种语法格式

    1. 对象::实例方法名

    lamdba写法:

    @Test

    void test1(){

    Consumer con = x -> System.out.println(x);

    }

    方法引用写法:

    @Test

    void test2(){

    PrintStream out = System.out;

    Consumer con = out::println;

    }

    consumer接口:

    @FunctionalInterface

    public interface Consumer {

    void accept(T t);

    }

    注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

    2. 类::静态方法名

    lamdba写法:

    @Test

    void test3(){

    Comparator com = (x, y) -> Integer.compare(x,y);

    }

    方法引用写法:

    @Test

    void test4(){

    Comparator com = Integer::compare;

    }

    Comparator接口:

    @FunctionalInterface

    public interface Comparator {

    int compare(T o1, T o2);

    }

    Integer类部分内容:

    public final class Integer extends Number implements Comparable {

    public static int compare(int x, int y) {

    return (x < y) ? -1 : ((x == y) ? 0 : 1);

    }

    }

    注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

    3. 类::实例方法名

    lamdba写法:

    @Test

    void test5(){

    BiPredicate bp = (x,y) -> x.equals(y);

    }

    方法引用写法:

    @Test

    void test6(){

    BiPredicate bp = String::equals;

    }

    BiPredicate接口:

    @FunctionalInterface

    public interface BiPredicate {

    boolean test(T t, U u);

    }

    注意:第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数时,就可以使用这种语法。

    二、构造器引用

    类::new

    lamdba写法:

    @Test

    void test7(){

    Supplier supplier = ()->new Person();

    }

    构造器引用写法:

    @Test

    void test8(){

    Supplier supplier = Person::new;

    }

    Supplier接口:

    @FunctionalInterface

    public interface Supplier {

    T get();

    }

    Person类:

    @Data

    public class Person implements Serializable {

    private static final long serialVersionUID = -7008474395345458049L;

    private String name;

    private int age;

    public Person() {

    }

    public Person(String name, int age) {

    this.name = name;

    this.age = age;

    }

    }

    注意:person类中有两个构造器,要调用哪个构造器是函数式接口决定的,也就是Supplier接口中的get()方法是无参的,那么就调用的是person中的无参构造器。

    三、数组引用

    Type::new

    lamdba写法:

    @Test

    void test9(){

    Function fun = x -> new String[x];

    }

    数组引用写法:

    @Test

    void test10(){

    Function fun = String[]::new;

    }

    Function接口部分内容:

    @FunctionalInterface

    public interface Function {

    R apply(T t);

    }

    总结

    方法应用及构造器引用其实可以理解为lamdba的另一种表现形式

    方法引用被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致

    方法引用中使用类::实例方法的条件是第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数

    构造器引用需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致

    展开全文
  • Object类中有getClass()方法通过这个方法可以获得一个实例对象在内存中的实际类型。类名.class介绍通过类名引用取得在内存中该类型的实际类型。Class.forName("包xx.类名xx")介绍通过"包+类名"的方式...

    1.介绍

    getClass()介绍

    java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类;

    Object类中有getClass()方法,通过这个方法就可以获得一个实例对象在内存中的实际类型。

    类名.class介绍

    通过对类名的引用取得在内存中该类型的实际类型。

    Class.forName("包名xx.类名xx")介绍

    通过"包名+类名"的方式同样可以取得在内存中该类型的实际类型。

    2.区别

    第一,类的加载方式不同

    Class.forName()属于动态加载类,在代码运行时加载指定类;

    Class.class属于静态加载类,在代码编译时加载指定类;

    object.getClass()取决于对象的产生方式:

    既可以是静态加载类(通过new创建的对象),也可以是动态加载类(通过Class.forName(xx.xx)创建的对象,对象可能不存在)。

    Class.forName("bbb").newInstance().getClass();

    第二,Class对象的创建方式不同

    Class.forName()

    运行阶段:JVM使用类装载器, 将类装入内存中,并对类进行初始化(静态代码块、非静态代码块、构造函数调用及静态变量);

    最后返回Class的对象。

    类名.class

    编译阶段:JVM使用类装载器, 将类装入内存中,并对类进行初始化操作;

    最后返回Class的对象。

    实例对象.getClass()

    当调用getClass()方法时,该对象的类已经被加载到内存中并且完成了初始化操作;

    直接返回Class的对象,没有其它操作。

    第三,对象与类的关系不同

    通过类创建对象:

    Class.forName(xxx.xx.xx)和Class.class返回的是一个类,调用newInstance()后才创建一个对象;

    // 获取类

    Class c = String.class;

    // 通过类创建对象

    String s = c.newInstance();

    通过对象获取类:

    object.getClass();

    // 获取类

    Class c = String.class;

    // 通过类创建对象

    String s = c.newInstance();

    // 通过对象获取类

    Class extends String> c2 = s.getClass();

    3.测试

    公用代码

    /**

    * class类加载

    * @explain

    * @author Marydon

    * @creationTime 2018年10月19日上午9:26:29

    * @version 1.0

    * @since

    * @email marydon20170307@163.com

    */

    public class ClassLoader2 {

    /**

    * 构造函数

    * @explain 在类每次被实例化时执行

    */

    public ClassLoader2() {

    System.out.println("--------调用构造函数--------");

    }

    /**

    * 静态的参数初始化

    * @explain 在类初次被加载到内存中时执行

    */

    static {

    System.out.println("--------执行静态代码块--------");

    }

    /**

    * 非静态的参数初始化

    * @explain 在类每次被实例化时执行

    */

    {

    System.out.println("--------执行非静态代码块--------");

    }

    }

    注意:

    展开全文
  • Object类中有getClass()方法通过这个方法可以获得一个实例对象在内存中的实际类型。类名.class介绍通过类名引用取得在内存中该类型的实际类型。Class.forName("包xx.类名xx")介绍通过"包+类名"的方式...

    1.介绍

    getClass()介绍

    java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类;

    Object类中有getClass()方法,通过这个方法就可以获得一个实例对象在内存中的实际类型。

    类名.class介绍

    通过对类名的引用取得在内存中该类型的实际类型。

    Class.forName("包名xx.类名xx")介绍

    通过"包名+类名"的方式同样可以取得在内存中该类型的实际类型。

    2.区别

    第一,类的加载方式不同

    Class.forName()属于动态加载类,在代码运行时加载指定类;

    Class.class属于静态加载类,在代码编译时加载指定类;

    object.getClass()取决于对象的产生方式:

    既可以是静态加载类(通过new创建的对象),也可以是动态加载类(通过Class.forName(xx.xx)创建的对象,对象可能不存在)。

    Class.forName("bbb").newInstance().getClass();

    第二,Class对象的创建方式不同

    Class.forName()

    运行阶段:JVM使用类装载器, 将类装入内存中,并对类进行初始化(静态代码块、非静态代码块、构造函数调用及静态变量);

    最后返回Class的对象。

    类名.class

    编译阶段:JVM使用类装载器, 将类装入内存中,并对类进行初始化操作;

    最后返回Class的对象。

    实例对象.getClass()

    当调用getClass()方法时,该对象的类已经被加载到内存中并且完成了初始化操作;

    直接返回Class的对象,没有其它操作。

    第三,对象与类的关系不同

    通过类创建对象:

    Class.forName(xxx.xx.xx)和Class.class返回的是一个类,调用newInstance()后才创建一个对象;

    // 获取类

    Class c = String.class;

    // 通过类创建对象

    String s = c.newInstance();

    通过对象获取类:

    object.getClass();

    // 获取类

    Class c = String.class;

    // 通过类创建对象

    String s = c.newInstance();

    // 通过对象获取类

    Class extends String> c2 = s.getClass();

    3.测试

    公用代码

    /**

    * class类加载

    * @explain

    * @author Marydon

    * @creationTime 2018年10月19日上午9:26:29

    * @version 1.0

    * @since

    * @email marydon20170307@163.com

    */

    public class ClassLoader2 {

    /**

    * 构造函数

    * @explain 在类每次被实例化时执行

    */

    public ClassLoader2() {

    System.out.println("--------调用构造函数--------");

    }

    /**

    * 静态的参数初始化

    * @explain 在类初次被加载到内存中时执行

    */

    static {

    System.out.println("--------执行静态代码块--------");

    }

    /**

    * 非静态的参数初始化

    * @explain 在类每次被实例化时执行

    */

    {

    System.out.println("--------执行非静态代码块--------");

    }

    }   注意:

    展开全文
  • 方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。一、方法引用的三种语法格式1. 对象::实例...
  •  Object类中有getClass()方法通过这个方法可以获得一个实例对象在内存中的实际类型。  类名.class介绍  通过类名引用取得在内存中该类型的实际类型。  Class.forName("包xx.类名xx")介绍 ...
  • 方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。一、方法引用的三种语法格式1. 对象::实例...
  • Java8——方法引用

    2020-07-14 08:59:42
    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。 一、方法引用的三种语法格式 1. 对象::实例...
  • 面向对象02

    2020-11-27 22:59:26
    类名 对象名,例如:Car bm,这句话的意思是以Car为模板创建一个对象,可以暂时理解为变量名。 new 类型(),例如:new Car(),这句话的意思是创建一个对象实体,可以暂时理解为值。 基本类型的值是一个数字,一个...
  • 方法名或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是 跟实例方法和属性不太一样,存在“隐藏”的这种情况。 多态之所以能够实现是依赖于 继承 接口和 重写 、重载(继承和重写最为关键)。有了...
  • 面向对象知识点

    2020-08-26 16:19:40
    但是其他静态方法只有通过对象才能调用它。 在不同类中: 静态方法/非静态方法调用静态方法 类名.方法名 调用即可 静态方法/非静态方法调用非静态方法 实例化这个类 即new一个实例化对象 eg: 一个类只能有一个...
  • 构造方法

    2020-09-01 11:07:08
    没有写构造方法的话系统会提供默认无参构造方法 ...可以直接通过类名调用 用类名调用: Penguin.print(); static可以用来修饰属性、 方法和代码块 static修饰与非static修饰的区别 静态的方...
  • python面向对象

    2018-06-12 18:01:37
    静态变量可以通过类名.变量名或对象.变量名访问,但引用对象.变量名赋值等操作时会创造一个与静态变量同名的实例变量。例如class Province: country = "china" def __init__(self, name): self.name = ...
  • 3.30

    2021-03-30 21:37:51
    static 关键字 static属性被所有对象共享,此属性先于对象存在的 ...可以通过对象引用或类名访问静态成员 block块 方法中({})自成作用域 静态块static{}运行中最先执行,只执行一次 构造快{},在新建对象new时执行,执
  • 而类的实例就是对象,那么对象名就是一个新的变量名,对象名之后给的类可以理解为在内存中复制了一个类的引用中的内容. 添加类成员 添加方法: 在类的内部直接声明函数,而且函数第一个参数一般自动为self(这个参数具有...
  • 【05-面向对象(下)】

    2018-07-03 21:42:31
    • 抽象类不能被实例化,可以通过其子类给他赋值,普通类里有的抽象里也有,定义抽象方法只需在普通方法上增 加abstract修饰符,并把普通方法方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加...
  • 便可以通过**引用名+静态方法名或静态变量名**来使用它,这也是最常见的类的使用方法,但对于静态方法或变量,一定要记住**静态方法和静态变量的产生不依赖于对象**,也就是说我们**可以不用引用名+静态方法名或静态...
  • 对很多没有其他语言基础的初学者来说,可能学到 python 的类定义的时候会苦恼很久 ...方法名()” 引用或使用相关的属性或方法 >>> class I: def text(self,x): print('%d'%(x**2)) >>> O = I() >>> O.text <bou
  • 【04-面向对象(上)】

    2018-07-03 21:41:30
    •如果访问权限允许,类里定义的属性和方法可以通过实例来调用, •有static 修饰的访求和属性,既可通过类来调用,也可以通过实例来调用. 对象.引用和指针 •Person p = new Person();,这行代码创建了一个...
  • 个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也称对象引用对象。 6.如何去使用对象中的成员 上面看到PHP 对象中的成员有两种一种是成员属性,一种是成员方法对象我们以经可以...
  • 静态类:1:仅包含静态变量和静态方法。 2:无法实例化。 3:不能包含实例构造函数。4:是密封的。非静态类:1....2.每次实例化都是一个新的对象...4.也可以通过 类名.方法名或变量名 访问静态成员静态方法:1.静态方法
  • java中static的用法(二)静态方法

    千次阅读 2007-05-14 13:59:00
    在类被加载的时候被初始化,可以通过类名对象名进行调用,在类内部可以直接调用。仅该方法不需要实例化对象,即可调用。 在静态方法中只能调用静态的成员变量。 不能在一个静态的方法中调用一个非静态的方法,不...
  • 通过类名(非对象名)来引用静态变量和静态函数,这样可增加代码的可读行,减少错误。 因为构造函数总是用来构建特定对象,所以构造函数是实例函数。在实例函数中可以调用静态变量静态函数,但是不能在静态函数中...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

方法可以通过对象名或类名引用