在一个类中定义一个新的类,这种类叫嵌套类。
嵌套类分为:
内部类
外部类可以调用内部类的方法和属性(即便是私有属性),内部类也可以使用外部类的属性和方法(即便是私有属性),如果属性名或方法名相同,则以外部类名.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(){ 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(){ List<String> list = Arrays.asList(this.strArray); Comparator<String> comparator =new Comparator<>() { public int compare(String o1, String o2) { return o1.length()-o2.length(); } }; Collections.sort(list,comparator);
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("叫声"); } }
|