java内部类

java内部类 1.定义内部类在一个类的内部定义一个类。例在A类中定义B类则B类相对A类就是内部类A类相对B类就是外部类。2.成员内部类1.内部类需要通过外部类的对象来创建自己内部类的对象2.内部类能访问外部类的私有属性和方法package base; //外部类 public class Outer { private int id2034; public void out(){ System.out.println(这是外部类的方法); } //成员内部类 public class Inner{ public void in(){ System.out.println(这是内部类的方法); } //成员内部类能访问外部类的私有属性和方法 public void getId(){ System.out.println(id); } } }package base; public class Application { public static void main(String[] args) { Outer outer new Outer(); outer.out(); //通过外部类的对象来创建成员内部类的对象 Outer.Inner inner outer.new Inner(); inner.in(); inner.getId(); } }这是外部类的方法这是内部类的方法20343.静态内部类1.使用static修饰的内部类属于外部类本身而不是外部类的对象。2.静态内部类只能访问外部类的静态变量和方法3.通过new外部类名.内部类名的方式来创建静态内部类的对象package base; //外部类 public class Outer { private static int id2034; public void out(){ System.out.println(这是外部类的方法); } //内部类 public static class Inner{ public void in(){ System.out.println(这是内部类的方法); } //静态内部类只能访问外部类的静态变量和方法 public void getId(){ System.out.println(id); } } }package base; public class Application { public static void main(String[] args) { //通过new外部类名.内部类名的方式来创建静态内部类的对象 Outer.Inner inner new Outer.Inner(); inner.in(); inner.getId(); } }这是内部类的方法20344.局部内部类1.局部内部类定义在方法内的类只能在定义的作用域内使用。2. 局部内部类能访问外部类所有变量和方法访问局部变量方法内的变量时变量必须是final或effectively final还能访问方法的参数。package base; import org.w3c.dom.ls.LSOutput; public class Outer { private int outerVar 10; private void outRun(){ System.out.println(这是外部类的方法); } public void method(final int param) { int localVar 20; //局部变量必须是final或effectively final //局部内部类 class LocalInner { private int innerVar 30; public void display() { //访问外部类所有变量和方法 outRun(); System.out.println(outerVar outerVar); //访问局部变量方法内的变量时变量必须是final或effectively final System.out.println(localVar localVar); //访问方法的参数 System.out.println(param param); } } //局部内部类只能在定义的作用域内使用 LocalInner inner new LocalInner(); inner.display(); } }package base; public class Application { public static void main(String[] args) { Outer outer new Outer(); outer.method(30); } }这是外部类的方法outerVar10localVar20param305.匿名内部类1.没有名字的内部类同时定义和实例化一个类。2.语法格式new 类名/接口名() { 类体 }3.不能定义构造方法因为没有类名package base; public class Application { public static void main(String[] args) { //匿名内部类 new Apple() { //1:创建匿名内部类对象 Override public void eat() { //3:执行eat()方法 System.out.println(匿名内部类吃了一个苹果); // 可以添加额外的方法 peel(); //4:调用peel()方法 } //定义自己的方法 private void peel() { //5:执行peel()方法 System.out.println(先削皮); } }.eat(); //2:调用eat()方法 } } class Apple { public void eat(){ System.out.println(Apple类吃了一个苹果); } }匿名内部类吃了一个苹果先削皮