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 // 另个内部类继承内部类Person50 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 officePerson69 .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 }
内部类同其它类一样被定义,同样它也可以继承外部其它包的类和实现外部其它地方的接口。同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身。