• Java内部类


    Java内部类总结

    Java的内部类内容挺多,不是很好理解,但说白了也就是一个类中还包含着另外一个类。

    内部类的基本结构

    在讲解之前让我们先来看一段代码。

    1. class Out { //外部类
    2. private int age = 12;
    3. class In { //内部类
    4. public void print() {
    5. System.out.println(age);
    6. }
    7. }
    8. }
    9. public class Demo {
    10. public static void main(String[] args) {
    11. Out.In in = new Out().new In();
    12. in.print();
    13. //或者采用下种方式访问
    14. /*
    15. Out out = new Out();
    16. Out.In in = out.new In();
    17. in.print();
    18. */
    19. }
    20. }
    21. /* 运行结果:12 */

    从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点。

    程序编译过后会产生两个.class文件,分别是Out.classOut$In.class,其中$代表了上面程序中Out.In

    Out.In in = new Out().new In() 可以用来生成内部类的对象,这种方法存在两个小知识点需要注意。

    1. 开头的Out是为了标明需要生成的内部类对象是在哪个外部类当中
    2. 必须先有外部类的对象才能生成内部类的对象。因为内部类是可以访问外部类中的成员变量,如果外部类没有被实例化,那么就会出现空指针异常。(不过编译器也不允许这种事情的发生)

    PS:C#与JAVA不一样,C#的内部类是不可以访问外部类的非静态内容。C#内部类相当于JAVA的静态内部类

    内部类中变量的访问形式

    访问内部类本身的成员变量直接this.属性名就可以了,而访问外部类的成员变量则需要使用Out.this.属性名

    1. class Out {
    2. private int age = 12;
    3. class In {
    4. private int age = 13;
    5. public void print() {
    6. int age = 14;
    7. System.out.println("局部变量:" + age);
    8. System.out.println("内部类变量:" + this.age);
    9. System.out.println("外部类变量:" + Out.this.age);
    10. }
    11. }
    12. }
    13. public class Demo {
    14. public static void main(String[] args) {
    15. Out.In in = new Out().new In();
    16. in.print();
    17. }
    18. }
    19. /*
    20. 运行结果:
    21. 局部变量:14
    22. 内部类变量:13
    23. 外部类变量:12
    24. */

    静态内部类

    1. class Out {
    2. private static int age = 12;
    3. static class In {
    4. public void print() {
    5. System.out.println(age);
    6. }
    7. }
    8. }
    9. public class Demo {
    10. public static void main(String[] args) {
    11. Out.In in = new Out.In();
    12. in.print();
    13. }
    14. }
    15. /* 运行结果:12 */

    可以看到,使用static可以将内部类静态化,静态化之后的内部类就只能访问外部类的静态成员变量了,具有了局限性。

    其次,因为内部类被静态化了,所以Out.In可以当做一个整体看。简而言之就是可以直接new 出内部类的对象了

    私有内部类

    如果希望一个内部类只能在外部类中操作,那么可以使用private来修饰内部类。

    1. class Out {
    2. private int age = 12;
    3. private class In {
    4. public void print() {
    5. System.out.println(age);
    6. }
    7. }
    8. public void outPrint() {
    9. new In().print();
    10. }
    11. }
    12. public class Demo {
    13. public static void main(String[] args) {
    14. //此方法无效
    15. /*
    16. Out.In in = new Out().new In();
    17. in.print();
    18. */
    19. Out out = new Out();
    20. out.outPrint();
    21. }
    22. }
    23. /* 运行结果:12 */

    上面的代码中,我们只能在Out类里面对In类生成的对象进行操作,而无法再使用Out.In in = new Out().new In() 来生成内部类的对象了。

    也就是说,此时的内部类只能被外部类所控制。

  • 相关阅读:
    AJax封装避免页面重复代码
    word 2010 建立多级结构和目录
    (转)C# 选择正确的集合
    IIS7如何部署asp.net网站 (asp.net mvc 5 , asp.net 4.5 , asp.net 4.0 都可以 )
    (转)程序集清单定义与程序集引用不匹配- 分析及解决
    CentOS 6.5 安装 MySQL5.6 并用Navicat for MySQL 连接
    用EF访问Centos下的MySQL
    SQLServer中的页如何影响数据库性能 (转)
    .NET Framework各版本比较
    EntityFramework简介
  • 原文地址:https://www.cnblogs.com/wujingtao/p/5196934.html
Copyright © 2020-2023  润新知