Java基础语法(单例、final、内部类、Lambda、方法引用)

一、单例模式(懒汉式和饿汉式)

/**
 * 懒汉式单例模式
 */
public class Person {
    // 私有的静态的实例变量
    private static Person instance = null;
    // 构造方法私有化
    private Person() {}
    // 公共的静态方法,返回唯一的那个实例
    public static Person getInstance() {
        if (instance == null) { //这里线程不安全
            instance = new Person();
        }
        return instance;
    }
}

/**
 * 饿汉式单例模式,线程安全
 */
public class Person {
    // 私有的静态的实例变量
    private static Person instance = new Person();
    // 构造方法私有化
    private Person() {}
    // 公共的静态方法,返回唯一的那个实例
    public static Person getInstance() {
        return instance;
    }
}

二、final关键字

  • 被final修饰的类:不能被继承
  • 被final修饰的方法:不能被重写
  • 被final修饰的变量:只能被赋值一次
    // 常量的基本写法:一般名字大写
 
    public static final double PI = 3.1415926;
    public  static final int NOT_FOUND = -1;
    private static final int DEFAULT_SIZE = 10;

三、内部类 

public class Person { //外部类 ,顶级类
   
    // 非静态嵌套类(内部类)
    class InnerClass {
        public int age = 10;
    }
}
  1. 跟实例变量、实例方法一样,内部类与外部类的实例相关联
  2. 必须先创建外部类实例,然后再用外部类实例创建内部类实例 
  3. 内部类不能定义除编译时常量以外的任何static成员
  4. 内部类可以直接访问外部类中的所有成员(即使被声明为private)
  5. 外部类可以直接访问内部类实例成员变量、方法(即使被声明为private)
 public static void main(String[] args) {
        Person person = new Person();
        Person.InnerClass innerClass = person.new InnerClass();
        System.out.println(innerClass.age);
    }

 四、静态嵌套类

  • 静态嵌套类:被static修饰的嵌套类
  • 静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中
  • 对比一般的顶级类,静态嵌套类多了一些特殊权限
  1. 可以直接访问外部类中除实例变量、实例方法外的其他成员(即使被声明为private)

public class Person { //外部类 ,顶级类
    // 静态嵌套类
    static class StaticClass {

    }
}
 Person.staticClass staticClass = new Person.staticClass(); // 不报错
public class Person { //外部类 ,顶级类
    
    private static int count = 1;
    private static void run() {}
    
    public static class staticClass {
        public void run() {
            Person.count = 2;
            Person.run();
        }
    }
}

五、Lambda表达式

  • 函数式接口(Functional Interface):只包含1个抽象方法的接口
  • 可以在接口上面加上@FunctionalInterface 注解,表示它是一个函数式接口
  • 匿名类只有一个抽象方法才能进行lambda进行简写
  • 参数列表可以省略参数类型
  • 当只有一条语句时:可以省略大括号、分号、return
  • 当只有一个参数时:可以省略小括号
  • 当没有参数时:不能省略小括号
   Integer[] array = {12, 34, 34, 67};
        Arrays.sort(array, (o1, o2) -> {
            return o1 - o2;
        });

    // 只有一条语句的时候
      Arrays.sort(array, (o1, o2) -> o1 - o2);

六、方法引用(Method Reference) 

如果Lambda中的内容仅仅是调用某个方法,可以使用方法引用来简化

引用静态方法:ClassName::staticMethodName

引用特定对象的实例方法:ObjectName::instanceMethodName

引用特定类型的任意对象实例方法:ClassName::methodName

@FunctionalInterface
public interface Testable {
    int test(int v1, int v2);
}
       Testable test = new Testable() {
            @Override
            public int test(int v1, int v2) {
                return v1 - v2;
            }
        };
        Testable testable = ((v1, v2) -> v1 - v2);
        Testable testable1 = (v1, v2) -> {
            return Math.max(v1, v2);
        };
        Testable testable2 = (v1, v2) -> Math.max(v1, v2);
        Testable testable3 =  Math::max;
        int result = test.test(12,45);
        System.out.println(result);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RiversTree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值