博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌套类&内部类
阅读量:6293 次
发布时间:2019-06-22

本文共 7097 字,大约阅读时间需要 23 分钟。

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

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

 

 

转载于:https://www.cnblogs.com/perfy/archive/2012/09/06/2673556.html

你可能感兴趣的文章
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>