静态嵌套类
1 public class StaticNestedTest { 2 private static String name = "javaJohn"; 3 private String id = "X001"; 4 5 static class Person { 6 private String address = "swjtu,chenDu,China"; 7 public String mail = "josserchai@yahoo.com";// 内部类公有成员 8 9 public void display() { 10 // System.out.println(id);//不能直接访问外部类的非静态成员 11 System.out.println(name);// 只能直接访问外部类的静态成员 12 System.out.println("Inner " + address);// 访问本内部类成员。 13 } 14 } 15 16 public void printInfo() { 17 Person person = new Person(); 18 person.display(); 19 // System.out.println(mail);//不可访问 20 // System.out.println(address);//不可访问 21 System.out.println(person.address);// 可以访问内部类的私有成员 22 System.out.println(person.mail);// 可以访问内部类的公有成员 23 24 } 25 26 public static void main(String[] args) { 27 StaticNestedTest staticTest = new StaticNestedTest(); 28 staticTest.printInfo(); 29 } 30 }
1、在静态嵌套类内部,不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。若想访问外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。
2、外部类访问内部类的的成员有些特别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方法默认为静态的了。
3、内部静态类Person只在类StaticNestedTest范围内可见,若在其它类中引用或初始化,均是错误的。
外部类中定义内部类
1 int outer_x = 100; 2 3 class Inner { 4 public int y = 10; 5 private int z = 9; 6 int m = 5; 7 8 public void display() { 9 System.out.println("display outer_x:" + outer_x); 10 } 11 12 private void display2() { 13 System.out.println("display outer_x:" + outer_x); 14 } 15 } 16 17 void test() { 18 Inner inner = new Inner(); 19 inner.display(); 20 inner.display2(); 21 // System.out.println("Inner y:" + y);//不能访问内部内变量 22 System.out.println("Inner y:" + inner.y);// 可以访问 23 System.out.println("Inner z:" + inner.z);// 可以访问 24 System.out.println("Inner m:" + inner.m);// 可以访问 25 InnerTwo innerTwo = new InnerTwo(); 26 innerTwo.show(); 27 } 28 29 class InnerTwo { 30 Inner innerx = new Inner(); 31 32 public void show() { 33 // System.out.println(y);//不可访问Innter的y成员 34 // System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法 35 innerx.display();// 可以访问 36 innerx.display2();// 可以访问 37 System.out.println(innerx.y);// 可以访问 38 System.out.println(innerx.z);// 可以访问 39 System.out.println(innerx.m);// 可以访问 40 } 41 } 42 43 public static void main(String args[]) { 44 InnerClassInOuterClass outerclass = new InnerClassInOuterClass(); 45 outerclass.test(); 46 }
1、对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响。
2、内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。
3、内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。
方法中定义内部类
1 public class InnerClassInMethod { 2 int out_x = 100; 3 4 public void test() { 5 class Inner { 6 String x = "x"; 7 8 void display() { 9 System.out.println(out_x); 10 } 11 } 12 Inner inner = new Inner(); 13 inner.display(); 14 } 15 16 public void showStr(String str) { 17 // public String str1 = "test Inner";//不可定义,只允许final修饰 18 // static String str4 = "static Str";//不可定义,只允许final修饰 19 String str2 = "test Inner"; 20 final String str3 = "final Str"; 21 class InnerTwo { 22 public void testPrint() { 23 System.out.println(out_x);// 可直接访问外部类的变量 24 // System.out.println(str);//不可访问本方法内部的非final变量 25 // System.out.println(str2);//不可访问本方法内部的非final变量 26 System.out.println(str3);// 只可访问本方法的final型变量成员 27 } 28 } 29 InnerTwo innerTwo = new InnerTwo(); 30 innerTwo.testPrint(); 31 } 32 33 public void use() { 34 // Inner innerObj = new Inner();//此时Inner己不可见了。 35 // System.out.println(Inner.x);//此时Inner己不可见了。 36 } 37 38 public static void main(String[] args) { 39 InnerClassInMethod outer = new InnerClassInMethod(); 40 outer.test(); 41 } 42 }
1、定义在方法内部的内部类的可见性更小,它只在方法内部可见,在外部类(及外部类的其它方法中)中都不可见了。
2、方法内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员。
3、方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用。
匿名内部类
1 import java.applet.Applet; 2 import java.awt.event.MouseAdapter; 3 import java.awt.event.MouseEvent; 4 5 public class AnonymousInnerClassDemo extends Applet { 6 public void init() { 7 addMouseListener(new MouseAdapter() { 8 public void mousePressed(MouseEvent me) { 9 showStatus("Mouse Pressed!"); 10 } 11 }); 12 } 13 14 public void showStatus(String str) { 15 System.out.println(str); 16 } 17 }
这个匿名内部类是定义在AnonymousInnerClassDemo 类内部的,所以它可以访问它的方法showStatus.这同前面的内部类是一致的。
内部类使用的其它的问题
内部类使用的其它的问题
1 public class Layer { 2 // Layer类的成员变量 3 private String testStr = "testStr"; 4 5 // Person类,基类 6 class Person { 7 String name; 8 Email email; 9 10 public void setName(String nameStr) { 11 this.name = nameStr; 12 } 13 14 public String getName() { 15 return this.name; 16 } 17 18 public void setEmail(Email emailObj) { 19 this.email = emailObj; 20 } 21 22 public String getEmail() { 23 return this.email.getMailStr(); 24 } 25 26 // 内部类的内部类,多层内部类 27 class Email { 28 String mailID; 29 String mailNetAddress; 30 31 Email(String mailId, String mailNetAddress) { 32 this.mailID = mailId; 33 this.mailNetAddress = mailNetAddress; 34 } 35 36 String getMailStr() { 37 return this.mailID + "@" + this.mailNetAddress; 38 } 39 } 40 } 41 42 // 另一个内部类继承外部类本身 43 class ChildLayer extends Layer { 44 void print() { 45 System.out.println(super.testStr);// 访问父类的成员变量 46 } 47 } 48 49 // 另个内部类继承内部类Person 50 class OfficePerson extends Person { 51 void show() { 52 System.out.println(name); 53 System.out.println(getEmail()); 54 } 55 } 56 57 // 外部类的测试方法 58 public void testFunction() { 59 // 测试第一个内部类 60 ChildLayer childLayer = new ChildLayer(); 61 childLayer.print(); 62 // 测试第二个内部类 63 OfficePerson officePerson = new OfficePerson(); 64 officePerson.setName("abner chai"); 65 // 注意此处,必须用 对象.new 出来对象的子类对象 66 // 而不是Person.new Email(...) 67 // 也不是new Person.Email(...) 68 officePerson 69 .setEmail(officePerson.new Email("josserchai", "yahoo.com")); 70 officePerson.show(); 71 } 72 73 public static void main(String[] args) { 74 Layer layer = new Layer(); 75 layer.testFunction(); 76 } 77 }
内部类同其它类一样被定义,同样它也可以继承外部其它包的类和实现外部其它地方的接口。同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身。