包装类:Java为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类。
自动装箱:把一个基本类型变量直接赋给对应的包装类变量。
自动拆箱:允许直接把包装类对象直接赋给一个对应的基本类型变量。
基本类型变量和字符串之间的转换:
1. 利用包装类提供的parseXXX(String s)静态方法
2. 利用包装类提供的valueOf(String s)静态方法
"hello"和new String("hello")有什么区别:
当Java程序直接使用形如"hello"的字符串直接量,JVM将会使用常量池来管理这些字符串;当使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。
当final修饰基本类型变量时,不能对基本类型变量重新赋值。但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象本身完全可以发生改变。
接口和抽象类
1. 接口不能包含普通方法,抽象类可以包含。
2. 接口只能定义静态常量,不能定义普通成员变量,抽象类可以定义普通成员变量。
3. 接口不包含构造器,抽象类可以包含。抽象类的构造器不是用于创建对象,而是让其子类调用这些构造器用来完成属于抽象类的初始化操作。
4. 接口里不包含初始化块,抽象类可以包含。
5. 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口弥补Java单继承的不足。
Lambda:
Lambda表达式的目标类型必须是函数式接口。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。
方法引用和构造器引用
如果Lambda表达式的代码块只有一条代码,则可以省略代码块的花括号,同时还可以在代码块中使用方法引用和构造器引用。
1. 引用类方法
如:from->Integer.valueOf(from) 等同于 Interger::valueOf
2. 引用特定对象的实例方法
如:from->"xxxx".indexOf(from) 等同于"xxxx"::indexOf
3. 引用某类对象的实例方法
如:(a,b,c)->a.substring(b,c) 等同于String::substring
4. 引用构造器
如:a->new JFrame(a) 等同于JFrame::new
Lambda表达式与匿名内部类的联系和区别
联系:
1. 都可以直接访问effectively final的局部变量,以及外部类的成员变量。
2. 都可以直接调用从接口中继承的默认方法。
区别:
1. 匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现所有抽象方法即可;但Lambda表达式只能为函数式接口创建实例。
2. 匿名内部类可以为抽象类甚至普通类创建实例;但Lambda表达式只能为函数式接口创建实例。
3. 匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法。
网友评论