内部类
内部类定义了各种规则,初学起来感到很复杂,而且很多规则现在还是不清楚。比如说:非静态内部类中不能定义静态变量。不过感觉就是规则,先记住。内部类根据在不同的地方的定义分为了成员内部类,静态内部类,局部内部类和匿名内部类。而匿名内部类的使用才是最多的,所以感觉其它的几项只会在面试的时候出现,而匿名内部类最好还是掌握。
1 package javabase; 2 3 public class Innerclass { 4 /** 5 * 内部类的定义实现多继承,接口的多实现只提供了一种解决途径 6 * 内部类分为:成员内部类,局部内部类,静态内部类,匿名内部类 7 * 8 * 9 * 10 * 成员内部类和静态内部类的例子: 11 * 成员内部类中不能定义静态成员; 12 * 成员内部类中能够访问外部类的所有成员; 13 * 静态内部类包含静态方法,出现了访问局限性,只能访问静态的外部成员。 14 * 15 * public class Outer(){ 16 * private static int i=1; 17 * private int j=2; 18 * private int k=3; 19 * public static void outer_f1(){}; 20 * public void outer_f2(){}; 21 * 22 * class Inner(){ 23 * static int inner_i=10;//成员内部类中不能定义静态变量 24 * int j=20;//内部类中的成员变量能够和外部内中的成员变量同名共存,并且复写外部类中的值 25 * int inner_i=10; 26 * void inner_f1(){ 27 * System.out.println(inner_i); //在内部类中访问内部类自己的变量直接用变量名 28 * System.out.println(this.j); //在内部类中访问内部类自己的变量也可以用this.变量名 29 * System.out.println(Outer.this.j); //在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名 30 * System.out.println(k); //如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量 31 * outer_f1(); 32 * outer_f2(); 33 * } 34 *外部类的非静态方法访问内部类需要建立内部类的对象 35 * public void outer_f3(){ 36 * Inner inner = new Inner(); 37 * inner.inner_f1(); 38 * } 39 *外部类的静态方法访问内部类(1)建立外部类的引用(2)建立内部类的对象(3)访问内部成员 40 * public static void outer_f4(){ 41 * Outer outer=new Outer(); 42 * Inner inner=outer.new Inner(); 43 * inner.inner_f1(); 44 * } 45 * public static void main(String[] args){ 46 * 47 * 48 *创建类对象 49 *若内部类为非静态的 50 *new Outer().new Inner(); 51 *若内部类为静态的 52 *new Outer.Inner() 53 *若内部类为静态的且内部方法为静态的 54 *new Outer.Inner 55 *} 56 * 57 * 58 * 局部内部类的例子 59 * (1)内部类访问局部变量时,被访问的局部变量需要被修饰为最终类型(不明原因) 60 * (2)不可以被成员修饰符修饰 61 * 62 * 63 * 匿名内部类的例子 64 * (1)匿名内部类其实就是内部类的简写格式 65 * (2)定义匿名内部类的前提:匿名内部类必须继承一个类或者实现一个接口 66 * (3)匿名内部类的写法:(正常写法是继承父类、复写父类的方法、创建子类对象、调用子类方法;)一旦变成匿名内部类以后,因为没有了方法名, 67 * 因而书写时直接创建父类的对象、覆盖父类的方法体、调用方法;可以理解为带内容的匿名子类对象 68 * (4)匿名内部类定义的方法不要超过3个,如果过多的话覆盖起来会显得很臃肿,代码段过长,影响阅读。 69 * 70 * 举个例子: 71 * Interface Inner{ 72 * void method(); 73 * } 74 * class Test{ 75 * //补足代码,通过匿名内部类 76 * } 77 * public static void main(String[] args){ 78 * Test.function().method(); 79 * } 80 * 81 * 如果不使用匿名内部类的写法 82 * class Inner implements Inner{ 83 * void method(){}; 84 * } 85 * static Inner function(){ 86 * return new Inner(); 87 * } 88 * 89 * 若使用匿名内部类的写法 90 * static Inner function(){ 91 * return new Inner() 92 * {void method(){}}; 93 * } 94 * } 95 */ 96 }

浙公网安备 33010602011771号