1.内部类场景
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
2.内部类特点
声明为内部类可以直接使用访问外部类的所有的成员,包括私有的.
3.源代码示例:
JRE核心类库集合的迭代器大量使用内部类;每一个集合实现类都有个迭代器内部类
(1) 静态内部类
(2)非静态内部类:
声明的位置:在类中方法外
格式如下:
[修饰符] class 外部类{ [修饰符] class 成员内部类{ } }
1.在外部类中使用成员内部类
2.在外部类的外面使用成员内部类
package com.innerclass.member; public class TestMemberClass { public static void main(String[] args) { Outer out = new Outer(); out.outerMethod(); Outer.Inner oi = out.new Inner(); oi.innerMethod(); Outer.Inner obj = out.getInner(); obj.innerMethod(); } } class Outer{ private int value = 5; public static void outerStaticMethod(){ /*Inner in = new Inner();//错误 in.innerMethod();*/ } public void outerMethod(){ System.out.println("外部类的方法"); /*Inner in = new Inner();//可以 in.innerMethod();*/ } class Inner{ public void innerMethod(){ System.out.println("内部类的方法"); System.out.println("内部类的方法访问外部类的私有成员:"+value); } } //通过外部类的某个方法返回内部类的对象 public Inner getInner(){ return new Inner(); } }
声明的位置:在类中方法外
格式如下:
[修饰符] class 外部类{ [修饰符] static class 静态内部类{ } }
package com.innerclass.staticinner; public class TestStaticInnerClass { public static void main(String[] args) { Outer.StaticInnerClass.innerStaticMethod(); Outer.StaticInnerClass os = new Outer.StaticInnerClass(); os.innerMethod(); } } class Outer{ public static void outerStaticMethod(){ StaticInnerClass.innerStaticMethod(); StaticInnerClass si = new StaticInnerClass(); si.innerMethod(); } public static void outerMethod(){ StaticInnerClass.innerStaticMethod(); StaticInnerClass si = new StaticInnerClass(); si.innerMethod(); } static class StaticInnerClass{ public static void innerStaticMethod(){ System.out.println("内部类的静态方法"); } public void innerMethod(){ System.out.println("内部类的非静态方法"); } } }
声明的位置:在外部类的方法或代码块中
格式如下:
[修饰符] class 外部类{ 方法{ class 局部内部类{ } } }
package com.innerclass.local; public class TestLocalInnerClass { public static void main(String[] args) { Outer out = new Outer(); Object obj = out.outerMethod(); System.out.println(obj); } } class Outer{ int value = 5; public Object outerMethod(){ final int localValue = 10; class LocalInnerClass{ public void innerMethod(){ System.out.println("局部内部类的方法"); System.out.println("局部内部类的方法可以使用外部类的成员:"+value); System.out.println("局部内部类的方法可以使用外部类的局部变量:"+localValue); } } //先声明后使用 LocalInnerClass li = new LocalInnerClass(); li.innerMethod(); return li; } }
声明的位置:任何可以创建对象的语句中
格式如下:
new 父类/父接口(){ .... }
意思是创造一个实现(继承)了接口(父类)的类的对象。
三种使用方法:
package com.innerclass.anonymous; import java.util.Arrays; import java.util.Comparator; public class TestAnonymous { public static void main(String[] args) { //继承式 Car car = new Car(250){ public void run(){ System.out.println("改进型:" + getSpeed()); } }; Car[] cars = new Car[3]; cars[0] = car; cars[1] = new Car(120); cars[2] = new Car(140); for (Car c : cars) { c.run(); } //接口式 Comparator com = new Comparator() { @Override public int compare(Object o1, Object o2) { Car c1= (Car) o1; Car c2= (Car) o2; return c1.getSpeed() - c2.getSpeed(); } }; Arrays.sort(cars,com); //参数式 Arrays.sort(cars,new Comparator() { @Override public int compare(Object o1, Object o2) { Car c1= (Car) o1; Car c2= (Car) o2; return c1.getSpeed() - c2.getSpeed(); } }); for (Car c : cars) { c.run(); } } } class Car{ private int speed; public Car() { super(); } public Car(int speed) { super(); this.speed = speed; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public void run(){ System.out.println("标准发动机助跑" + speed); } }