• 嵌套类&内部类


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

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

     

     

  • 相关阅读:
    【转】ServletContext介绍及用法
    【转】UML之类图和对象图
    【转】UML各种图总结
    解决win10下 matplotlib绘图时中文乱码问题
    修改表、字段的默认字符集
    MySQL报错Incorrect date value: '0000-00-00' for column 'hirrdate' at row 1
    用vs code将qt designer的.ui文件转换为.py文件
    MySQL多表数据查询记录
    MySQL中统计函数和分组数据查询
    lambda匿名函数
  • 原文地址:https://www.cnblogs.com/perfy/p/2673556.html
Copyright © 2020-2023  润新知