洞房记得初相遇。便只合、长相聚。何期小会幽欢,变作离情别绪。

——柳永《昼夜乐》

## 1. 内部类

1.1 成员内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Demo01 {
public static void main(String[] args) {
Body body = new Body();
// 如果外部类以外的地方使用内部类,需要先创建外部类的对象 然后在创建内部类的对象。
// Body.Heart heart = new Body().new Heart();
Body.Heart heart = body.new Heart();
heart.beat();

// 底层实现是使用内部类Node内部类,作用是只在其外部类中使用
LinkedList list = new LinkedList();

}
}

// Body是外部类
class Body{
// 成员属性
private String name;

// Heart是内部类(用public和private )
public class Heart{
public void beat(){
System.out.println("嘭嘭嘭");
System.out.println("name = " + name);
}
}

public void methodBody(){
// 在外部类的方法中可以直接创建内部类的对象。
Heart heart = new Heart();
heart.beat();
}

}

1.2 局部内部类

  1. 方法中的属性全部都不能用修饰符修饰,所以局部内部类不能使用修饰符来修饰。

  2. jdk8版本以后,局部内部类中调用的属性,如果没写final修饰,默认会自动添加final

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Outer{
    public void method(){
    final int num =520;
    class Inner{
    public void methodInner(){
    System.out.println("num = " + num);
    }
    }
    Inner inner = new Inner();
    inner.methodInner();
    }
    }

1.3 匿名内部类【重点】

  1. 匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的`` 匿名的 子类对象。开发中,最常用到的内部类就是匿名内部类了。
  2. 反射用的到,jdk8 lambda表达式也用得到。(箭头表达式)

前提

  1. 匿名内部类必须继承一个父类或者实现一个父接口

以接口举例,当你使用一个接口时,似乎得做如下几步操作:

  1. 定义子类
  2. 重写接口中的方法
  3. 创建子类对象
  4. 调用重写后的方法

我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快

捷方式。

格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Demo {
public static void main(String[] args) {
USB usb = new USB() {
@Override
public void open() {
System.out.println("插入");
}

@Override
public void close() {
System.out.println("拔出");
}
};
//匿名内部类
usb.open();
usb.close();

}
}
interface USB{
void open();
void close();
}

2. 包装类

基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:

  1. 装箱:从基本类型转换为对应的包装类对象。

  2. 拆箱:从包装类对象转换为对应的基本类型。

由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。

  1. Integer i = 4; 自动装箱。相当于Integer i = Integer.valueOf(4);
  2. i = i + 5; 等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;加法运算完成后,再次装箱,把基本数值转成对象。

2.1 基本类型与字符串之间的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:

public static byte parseByte(String s) :将字符串参数转换为对应的byte基本类型。

public static short parseShort(String s) :将字符串参数转换为对应的short基本类型。

public static int parseInt(String s) :将字符串参数转换为对应的int基本类型。

public long parseLong(String s) :将字符串参数转换为对应的long基本类型。

public static float parseFloat(String s) :将字符串参数转换为对应的float基本类型。

public static double parseDouble(String s) :将字符串参数转换为对应的double基本类型。

public static boolean parseBoolean(String s) :将字符串参数转换为对应的boolean基本类型。

2.2 引用数据类型

  1. 基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。

  2. class作为成员变量

  3. interface可以作为对象的成员变量。

  4. (多态的形式接收对象),interface也可以作为方法的返回值类型存在。

3. 权限修饰符

  1. private 修饰的方法,只能在本类中调用

  2. public 修饰的方法,在任何地方都可以调用

  3. protected修饰的方法在不同包里面,只有子类对象可以调用。

public protected default private
同一个类
同一个包 ×
不同的包子类 × ×
不同包非子类 × × ×