一、内部类:将一个类定义在另一个类或者方法中!
二、内部类可以分为4类:
1、成员内部类
public class SurfaceClass {// 外部类 private static int a = 1; private int b = 2; /** 可以访问我们外部类的所有属性和方法! 如果我们想访问内部类!必须要有外部类! 只能通过外部类来 */ class InnerClass {// 成员内部类 public void hello() { int a = 10; int b = 20; System.out.println(a);// 10 System.out.println(b);// 20 System.out.println(SurfaceClass.this.a);// 1 System.out.println(SurfaceClass.this.b);// 2 } } } /** * 测试类 * @author lzw * 2017-8-4 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔! */ public class InnerClassTest { public static void main(String[] args) { /*访问内部类! 1.创建外部类对象 SurfaceClass surfaceClass = new SurfaceClass(); 2.通过外部类对象创建内部类对象 InnerClass innerClass = surfaceClass.new InnerClass(); 3.调用对应的方法 innerClass.hello(); */ SurfaceClass surfaceClass = new SurfaceClass(); InnerClass innerClass = surfaceClass.new InnerClass(); innerClass.hello(); }
/*注意点:
01.内部类可以拥有private,protected访问权限修饰符!
02.如果外部类和内部类有相同的属性或者方法的时候, 默认是就近原则,取内部类的属性或者方法!
我们想调用外部类的属性和方法使用 ===>外部类名.this.属性/方法名*/
}
2、局部内部类
public class SurfaceClass {// 外部类 // 外部类的方法 public void getInner() { class InnerClass { // 这个类被定义在了一个方法中 ===》局部内部类 public void sayBye() { System.out.println("再见了!老大哥!"); } } InnerClass innerClass = new InnerClass(); // 仅限于本方法中使用 innerClass.sayBye(); } } /** * 测试类 * @author lzw * 2017-8-4 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔! */ public class InnerClassTest { public static void main(String[] args) {
局部内部类
类被定义在一个方法体或者作用域中!
注意点:
001.这个类仅限于当前方法使用!
002.可以理解成局部变量
SurfaceClass surfaceClass = new SurfaceClass(); surfaceClass.getInner(); } }
3、匿名内部类
/** * 匿名内部类的使用 * @author lzw * 2017-8-4 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔! */ public class InnerClassTest { public static void main(String[] args) { /*注意点 001.没有名字 002.只能使用一次 003.前提:必须继承一个类或者实现某个接口 004.接口或者抽象类中的所有抽象方法必须全部实现! 在我们的程序中,有一个类只使用了一次,那么我们没有必要单独去创建一个类!这时候就使用匿名内部类!*/ Thread thread = new Thread(new Runnable() {// 匿名内部类 @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("老大哥辛苦了"); } } }); thread.start(); } }
4、静态内部类
public class SurfaceClass { // 静态内部类 static class InnerClass { public void hello() { System.out.println("InnerClass静态内部类"); } } } /** * 静态内部类的使用 * @author lzw * 2017-8-4 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔! */ public class InnerClassTest { /*静态内部类 就是在内部类的修饰符上加了 static ! 静态了!不依赖于外部类了! 不能访问外部类的所有非静态的属性和方法!*/ public static void main(String[] args) { InnerClass innerClass = new InnerClass(); innerClass.hello(); } }