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

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

一、基本概念:

  顾名思义,内部类存在于外部类当中,依附于外部类。就像眼睛和脑袋的关系一样。

二、几点说明:

  1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 ;
  2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 ;
  3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 ;
  4.内部类增加了代码的复杂性,有着诸多的缺点,其唯一有点就是可以访问外部类的所有成员。

三、分类: 

  1.成员内部类:

    a).成员内部类可以看成是外部类的成员变量。

    b).非静态内部类

1 public class Out { 2  3     int age; 4     String name; 5     private char sex; 6  7  8     class In { 9 10         int age;11 12         public void print() {13             //内部类可以访问任何权限的外部类成员14             System.out.println("姓名为:" + name + "\n" + "性别为:" + sex);15         }16 17     }18 }19 20 class Demo {21 22     public static void main(String[] args) {23         //非静态内部类对象的创建必须基于外部类对象(静态成员属于类,非静态成员属于对象)24         Out.In in = new Out().new In();25         in.print();26     }27 }

    c).静态内部类

1 public class Out { 2  3     int age; 4     String name; 5     private char sex; 6     static int height; 7  8  9     static class In {10 11         int age;12 13         public void print() {14             //静态内部类只能访问外部类的静态变量15             System.out.println("身高为:" + height);16         }17 18     }19 }20 21 class Demo {22 23     public static void main(String[] args) {24         //静态内部类对象的创建可直接基于外部类(静态成员属于类,非静态成员属于对象)25         Out.In in = new Out.In();26         in.print();27     }28 }

    d).私有内部类

1 public class Out { 2  3     int age; 4     String name; 5     private char sex; 6     static int height; 7  8  9     private class In {10 11         int age;12 13         public void print() {14             System.out.println("身高为:" + height);15         }16 17     }18 }19 20 class Demo {21 22     public static void main(String[] args) {23         //私有内部类只能在外部类内部使用,以下代码无效24         /*Out.In in = new Out.In();25         in.print();*/26     }27 }

 

  2.匿名内部类:

    a).内部类只使用一次时候,则定义为匿名内部类,节省定义新类的成本

    b).匿名内部类在抽象类的实现

1 public abstract class Animal { 2  3     public abstract void eat(); 4 } 5  6 class Demo { 7  8     public static void main(String[] args) { 9 10         Animal dog = new Animal() {11             @Override12             public void eat() {13                 System.out.println("狗吃骨头!!");14             }15         };16         dog.eat();17     }18 }

     匿名内部类不允许定义构造函数.

    c).匿名内部类在接口的实现

1 public interface Animal { 2  3     public abstract void eat(); 4 } 5  6 class Demo { 7  8     public static void main(String[] args) { 9 10         Animal cat = new Animal() {11             @Override12             public void eat() {13                 System.out.println("猫吃鱼!!");14             }15         };16         cat.eat();17     }18 }

 

  3.局部内部类:

    a).局部内部类存在于方法体中,不常用

    b).基本实现

1 public class Out { 2  3     //方法传参数给局部内部类时参数定义为fianl 4     public void outPrint(final String str) { 5         class In { 6             public void inPrint() { 7                 System.out.println(str); 8             } 9         }10         new In().inPrint();11     }12 }13 14 class Demo {15     public static void main(String[] args) {16         new Out().outPrint("测试字符串!!");17     }18 }

 

转载于:https://www.cnblogs.com/coderls/p/6435302.html

你可能感兴趣的文章
Android平台图像压缩方案
查看>>
nginx配置文件
查看>>
我扒了Bugly的数据,只是想出个报表
查看>>
干货!撸一个webpack插件(内含tapable详解+webpack流程)
查看>>
Flutter实战之实现一个简单的新闻阅读器
查看>>
推荐30个用于微服务的顶级工具
查看>>
Vector 源码分析
查看>>
计算机网络第三篇【数据链路层】
查看>>
JDK并发AQS系列(五)
查看>>
排名Top 16的Java实用类库
查看>>
画影图形: SVG & Canvas 图形对比
查看>>
frame和bounds的区别(转载)
查看>>
common-collections中Java反序列化漏洞导致的RCE原理分析
查看>>
缩减Docker镜像体积历程总结
查看>>
2019,Done is better than perfect
查看>>
RxJava2.0(四)线程之间切换的内部原理
查看>>
共建公安标准体系 | 七牛云与锐安科技达成深度战略合作
查看>>
寒冬之下,被cai的那些人到底去哪了?
查看>>
一步步带你实现Android网络状态监听
查看>>
设计模式:原型模式
查看>>