四种内部类
四种内部类
实例内部类:直接定义在类当中的一个类,在类前面没有任何修饰符
静态内部类:在内部类前面加static
局部内部类:定义在方法内的类
匿名内部类:属于局部内部类的一种特殊情况
实例内部类:
属于对象的内部类,不属于类的,你使用static修饰的内部类
想要使用内部类,必须得先创建外部类
创建内部类对象当中,会有一个外部类的引用
在内部类当中可以访问外部类当中的成员
在内部类当中,不能有静态成员
外部类不能直接访问内部类当中的成员
package com.xiongda.inner; class Outer { String name = "xiongda"; class Inner { void print() { System.out.println(name); } } } /** * * @author xiongda * @date 2018年8月5日 * @description 创建实例内部类 */ public class InnerClassDemo1 { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.print(); } }
静态内部类:
在内部类前面加上static
静态内部类是不需要创建外部对象
在静态内部类当中,是没有外部类引用的
静态内部类,是可以访问外部类的静态成员
package com.xiongda.inner; class Outer2 { static class Inner { static String name = "xiongda"; String signature = "handsome boy"; } } /** * * @author xiongda * @date 2018年8月5日 * @description 创建静态内部类 访问静态内部类当中的静态成员 访问静态内部类当中的非静态成员 */ public class InnerClassDemo2 { public static void main(String[] args) { // 创建静态内部类 Outer2.Inner inner = new Outer2.Inner(); // 访问静态内部类的静态成员 System.out.println(Outer2.Inner.name); // 访问静态内部类当中的非静态成员 System.out.println(inner.signature); } }
局部内部类:
定义在方法中的内部类
1.不能使用修饰符如 public private
2.局部内部类只能在定义的方法中使用
3.局部内部类当中不能包含静态变量
4.局部内部类当中可以包含局部变量,使用的局部变量的本质是final 常量
package com.xiongda.inner; class Outer3 { void test() { // 这前面的修饰符默认是final类型,是存放在方法区当中 String name = "xiongda"; class Inner { void print() { System.out.println(name); } } Inner inner = new Inner(); inner.print(); } } /** * * @author xiongda * @date 2018年8月5日 * @description 创建局部内部类 */ public class InnerClassDemo3 { public static void main(String[] args) { Outer3 outer = new Outer3(); outer.test(); } }
匿名内部类 :
就是一个没有名字的局部内部类
匿名内部类没有构造器 一个文件对应一个类
当只使用一次的时候,才使用匿名内部类
创建匿名内部类需要借助父类的构造器或者接口
所以匿名内部类必须得有父类或者实现了接口
内部写的代码在new的时候就会自动执行
package com.xiongda.inner; interface OuterDevice { void work(); } class Device { void connectTo(OuterDevice outerDevice) { outerDevice.work(); } } /** * * @author xiongda * @date 2018年8月5日 * @description 创建匿名内部类 */ public class InnerClassDemo4 { public static void main(String[] args) { Device device = new Device(); device.connectTo(new OuterDevice() { @Override public void work() { System.out.println("键盘开始工作!"); } }); device.connectTo(new OuterDevice() { @Override public void work() { System.out.println("鼠标开始工作!"); } }); } }
务实,说实话!