看完这里,Java可以说事熟练和精通的状态
1. 代码块 #
- 静态代码块
- 使用
static{}执行一次, - 作用:完成类的初始化
- 使用
- 实例代码块
- 使用
{},每次创建对象都执行,在构造器之前执行 - 做用: 与构造器一样,完成对象的初始化
- 使用
2. 内部类 #
2.1 成员内部类 #
类中的一个普通成员,对象持有,与其他类一样使用
// 创建格式
Out.Inner oi = new Outer().new Inner();
2.2 静态内部类 #
有static 修饰,属于外部类自己持有
// 创建格式
public class Outer {
public static class Inner {
}
}
Outer.Inner in = new Outer.Inner();
2.3 局部内部类 #
定义在方法、代码块、构造器等执行体中
2.4 匿名内部类 #
-
认识
是一种特殊的局部内部类,不需要我们对这个类声明类的名称,默认有个隐藏的名字
new 类/接口(){ 类体(方法重写) }; new Animal(){ @oberride public void cry(){} }; -
特点:本质是子类,并创建一个子类对象
-
使用形式
- 作为一个对象参数传给方法
-
应用场景
- 调用别人提供的方法实现需求时,传输匿名对象给参数,需要才会写
JButton btn = new JButton("denglu") btn.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActiobEvent e){ //功能 System.out.println("denglu"); } }); //简化成一行代码 btn.addActionListener(e -> System.out.println("denglu"));
3. 函数式编程 #
3.1 Lambda JDK 8 可似增加的语法形式 #
可以用于替代某些匿名内部类的对象,可读性更好更简洁
(被重写方法的形参列表)-> {
方法体代码
}
注: Lambda只能代替函数式接口的匿名内部类
- 有且只有一个抽象方法的**
接口** - 大部分函数式接口,有
@FunctionalInterface的注解,用来约束当前接口必须是函数式接口
进一步简化
- 参数类型可以不写
- 如果只有一个参数,还能将
()省略,多个参数不能省略 - 如果Lambda表达式只有一行代码,大括号可以不写,同时省略分号
“;”,有return也必须去掉
e -> {方法体代码}
(o1,o2)-> o1.getAge() - o2.getAge()
3.2 方法引用 #
类名::静态方法
- 简化Lambda表达式,如果→两边的参数一致,表达式里知识调用一个静态方法,可以用静态方法引用
(o1,o2)-> o1.getAge() - o2.getAge()
Student::compareByAge
对象名::实例方法
4. 常用API #
4.1 String #
创建、封装、调用API处理字符串对象
- 方式一:直接创建对象
- 方式二:构造器创建字符串对象
//一
String name = "hhh"
// 二 new
public String()//空白字符对象
public String(String s)
public String(char[] chars)
public String(byte[] bytes)
区别
- 方式一:会存储到
字符常量池中,且相同内容字符串只存储一份 - 方式二:通过
new的方式创建字符串,每new一次会产生一个新的对象存储在堆内存中
4.2 ArrayList #
- 数组完成定义后长度固定,集合就不会,大小可变,功能更多
add(E e)//添加数据
add(int index, E e)//指定位置添加数据
get(int index)//获取指定位置的数据
size()//返回集合的元素大小
remove(int index)//删除指定位置的元素,并返回元素
remove(Object o)//直接删除元素,返回是否成功
set(int index, E e)//修改指定位置的元素,并返回被修改的元素