java包类
1.把字符串类型的值转换为基本类型的值的两种方法
利用包装类提供的parseXXX(String s) 静态方法 (除了Character之外的所有包装类都提供了该方法)
int it1 = Integer.parseInt(intStr);
利用包装类提供的xxx(String s)构造器
int it2 = new Integer(intStr);
//把一个float变量转换成String变量 String ftStr = String.valueOf(2.345f); //把一个boolean变量转换成String变量 String boolStr = String.valueOf(true);
Objects类提供的toString()方法总是返回该对象实现类的“类名+@+hashCode”值,这个返回值不能真正实现“自我描述”的功能,因此必须重写Objects类的toString()方法
2.内部类
a.内部类提了很好的封装
b.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员;但外部类不能访问内部类的实现细节
c.匿名内部类适合用于创建那些仅需要使用一次的类
d.内部类比外部类可以多使用三个修饰符:private/protect/static,外部类不可以使用此三个
e.非静态内部类不能拥有静态成员。
3.java 8改进的匿名内部类
规则:new 实现接口() | 父类构造器(实参列表) { //匿名内部类的类体部分 }
(1)匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类
(2)匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器需要完成的事情。
注:定义匿名内部类时无须class关键字,而是在定义匿名内部类时直接生成该匿名内部类的对象
如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰;
4.java 8新增的Lambda表达式
Lambda表达式支持将代码块作为方法参数,允许用更简洁的代码来创建只有一个抽象方法的接口(称为函数式接口)
Lambda表达式主要作用就是代替匿名内部类的烦琐的语法,由三部分组成:
a.形参列表 允许省略形参类型,如果形参列表只有一个参数,甚至形参列表的圆括号也可以省略
b.箭头 (->) 必须用英文中画线和大于号组成
c. 代码块 如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,Lambda表达式代码块只有一条return 语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return语句,Lambda表达式会自动返回这条语句的值。
Lambda表达式与函数式接口
Lambda表达式类型,也称为“目标类型”,Lambda表达式的目标类型必须是“函数式接口”,函数式接口只包含一个抽象方法的接口,函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法;
由于Lambda表达式的结果就是被当成对象,因此程序中完全可以使用Lambda表达式进行赋值
Lambda表达式有如下限制:
(1)Lambda表达式的目标类型必须是明确的函数式的接口
(2)Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,只能有一个抽象的方法的接口创建对象。
为保证Lambda表达式的目标类型是一个明确的函数式接口,有如下三种常见方式:
(1)将Lambda表达式赋值给函数式接口类型的变量;
(2)将Lambda表达式作为函数式接口类型的参数传给某个方法;
(3)使用函数式接口对Lambda表达式进行强制类型转换;
5.Lambda表达式支持的方法引用和构造器引用:
如果Lambda表达式代码块中只有一条语句,还可以使用方法引用和构造器引用
a.引用类方法
b.引用特定对象的实例方法interface Converter{ Integer convert(String from); } //下面代码使用Lambda表达式创建Converter对象 Convertr converter1 = from -> Integer.valueOf(from); Integer va1 = converter1.convert("99"); System.out.println(va1); //方法引用代替Lambda表达式 Conveter conveter1 = Integer::valueOf;
//下面使用Lambda表达式创建Converter对象 Converter converter2 = from ->"fkit.org".indexOf(from); //调用convert()方法将字符串转换成整数了 Integer value = converter2.convert("it"); Systen.out.println(value);
//方法引用代替Lambda表达式:引用特定对象的实例方法
c.引用某类对象的实例方法Converter converter2 = "fkit.org"::indexOf;
d.引用构造器interface MyTest { String test(String a,int b, int c); } //使用Lambda 表达式创建MyTest对象 MyTest mt = (a,b,c) -> a.substring(b,c); //调用mt对象的test()方法 String str = mt.test("java i love you",2,9); System.out.println(str); //方法引用代替Lambda表达式:引用某类对象的实例方法 MyTest mt = String::substring;
interface YourTest { JFrame win(String title); } //使用Lambda表达式创建YourTest对象 YourTest yt = (String a)-> new JFrame(a); //调用yt对象的win()方法, JFrame jf = yt.win("我的窗口"); System.out.println(jf); //构造器引用代替Lambda表达式 YourTest yt = JFrame::new;