嵌套类&内部类

静态嵌套类
 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 }

内部类同其它类一样被定义,同样它也可以继承外部其它包的类和实现外部其它地方的接口。同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身。

 

 

原文地址:https://www.cnblogs.com/perfy/p/2673556.html