在一个类中定义一个新的类,这种类叫嵌套类。

嵌套类分为:

  • 静态嵌套类
  • 非静态嵌套类(内部类)

内部类

外部类可以调用内部类的方法和属性(即便是私有属性),内部类也可以使用外部类的属性和方法(即便是私有属性),如果属性名或方法名相同,则以外部类名.this.来区分。

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
package org.example;

public class ClassDemo {
public static void main(String[] args) {
Demo demo=new Demo("测试");
Demo.Demo2 demo2=demo.new Demo2("测试2");
demo.getName();
demo2.getName();
}
}
class Demo{
private String name;
private String DemoName;
public Demo(String name){
this.DemoName=name;
}
public void getName(){
System.out.println(name);
}
class Demo2{
private String name;
public Demo2(){

}
public Demo2(String name){
Demo.this.name=name;
this.name=DemoName;
}
public void getName(){
System.out.println(name);
}
}
}

静态嵌套类

静态嵌套类实例并不依赖于任何外部类实例。静态嵌套类只能访问外部类的静态属性和静态方法。

作用:做外部类的辅助类

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
package org.example;

public class ClassDemo {
public static void main(String[] args) {
Animals.dog dog=new Animals.dog("小白");
dog.say();
Animals.dog.DogSay();
dog.Animals();
}
}
class Animals{
String name;
public Animals(String name){
this.name = name;
}
static class dog{
String name;
public dog(String name){
this.name = name;
}
public void say(){
System.out.println(this.name);
}
static void DogSay(){
System.out.println("汪汪汪");
}
public void Animals(){
System.out.println("这不是外部类");
}
}
}

局部类

声明在方法内部的类叫做局部类。局部类可以访问外部类的属性和方法,但局部类无法用访问修饰符来修饰。

局部类可以访问方法体内声明的属性,但只能是声明为final或者其值不会变动的属性。

局部类不能是static,哪怕在static方法中。

作用:规定某个类只能某个方法使用

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
package org.example;

public class ClassDemo {
public static void main(String[] args) {
Animals animal = new Animals();
animal.name();
}
}
class Animals{
String name;
public void name(){
String name="小米";
class Cat{
public Cat(String name){
Animals.this.name=name;
}
public void name(){
//此处的name是String name="小米"
System.out.println(name);
}
}
Cat cat=new Cat("cat");
cat.name();
}
}

匿名类

  • 只有实现了某个接口或者继承了某个超类的局部类才能匿名化。
  • 继承超类或者实现接口的匿名类只能重写接口或者超类定义的方法,无法新定义方法。

区别:继承超类可以调用超类的构造方法,而实现接口则没有构造方法。

实现接口:

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
35
36
37
38
39
40
41
package org.example;

import java.util.*;

public class ClassDemo {
public static void main(String[] args) {
StringArrayUtils str=new StringArrayUtils(new String[]{"add","delete","list","save","updateToSave"});
System.out.println(str);
str.sortByLen();
System.out.println(str);
}
}
class StringArrayUtils{
private String[] strArray;
public StringArrayUtils(String[] strArray) {
this.strArray = strArray;
}
void sortByLen(){
//1、将对数组的排序转化为list的排序
List<String> list = Arrays.asList(this.strArray);
//2、使用排序函数,这里的new Comparator<>()是接口,而非实例化Comparator
Comparator<String> comparator =new Comparator<>() {
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
Collections.sort(list,comparator);
//更简洁的方法
// Collections.sort(list,new Comparator<>() {
// public int compare(String o1, String o2) {
// return o1.length()-o2.length();
// }
// });

//3、将排序后的结果重新放回数组
list.toArray(this.strArray);
}
public String toString(){
return Arrays.toString(this.strArray);
}
}

继承超类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package org.example;

import java.util.*;

public class ClassDemo {
public static void main(String[] args) {
Animal dog=new Animal("小黄狗"){
@Override
public void say(){
System.out.println("汪汪汪");
}
};
dog.say();
}
}
class Animal{
String name;
public Animal(String name){
this.name = name;
}
public void say(){
System.out.println("叫声");
}
}