内部类class文件命名规则

  • 普通内部类、静态内部类:<Outer>\$<Inner>.class,其中<Outer>为外部类类名,<Inner>为内部类类名。
  • 方法内部类:<Outer>\$<number><Inner>.class,其中<Outer>为外部类类名,<Inner>为内部类类名,<number>为在外部类中定义的第number个Inner内部类。因为每个外部类(比如Outer)方法都能够定义一个名字相同的内部类(比如Inner),则命名这些名字相同的内部类的方法为:Outer\$1Inner.class、Outer\$2Inner.class。
  • 匿名内部类:<Outer>\$<number>.class,其中<Outer>为外部类类名,<number>为第number个匿名内部类,因为匿名内部类没有类名,因此只能用编号代替。

普通内部类

语法注意点:

  • 在普通内部类中不允许定义任何的静态成员,否则Compile Error。
  1. public class InnerClass01
  2. {
  3. public static void main(String[] args) {
  4. Outer out = new Outer();
  5. Outer.Inner inn = out.new Inner(); //创建内部类实例之前,必须创建外部类实例
  6. inn.print();
  7. }
  8. }
  9. class Outer
  10. {
  11. private int a = 1;
  12. class Inner
  13. {
  14. public void print()
  15. {
  16. System.out.println("Inner " + a); //内部类能够访问外部类的私有实例变量
  17. }
  18. }
  19. }

上面的代码中:

  • 第12~18行:定义了内部类,声明方法和定义普通类类似。
  • 第16行:内部类能够访问外部类的私有实例变量。
  • 第4~6行:实例化内部类之前必须要有一个外部类的对象,内部类的类型是:<Outer>.<Inner>。

静态内部类

  1. public class InnerClass04
  2. {
  3. public static void main(String[] args) {
  4. Outer.Inner inn = new Outer.Inner();
  5. inn.fun();
  6. }
  7. }
  8. class Outer
  9. {
  10. static class Inner
  11. {
  12. public void fun()
  13. {
  14. System.out.println("hello");
  15. }
  16. }
  17. }

注意点:

  • 第4行:创建静态内部类的对象的方法:<Outer>.<Inner> in = new <Outer>.<Inner>();
  • 静态内部类其实不像内部类,因为不需要创建外部类实例就能创建内部类实例。

匿名内部类

  1. public class InnerClass03
  2. {
  3. public static void main(String[] args) {
  4. Outer out = new Outer();
  5. out.addListener(new ClickListener(){ //匿名内部类,命名为:InnerClass03$1.class
  6. public void onClick()
  7. {
  8.  
  9. }
  10. });
  11. }
  12. }
  13. class Outer
  14. {
  15. public void addListener(ClickListener listener)
  16. {
  17.  
  18. }
  19. }
  20. interface ClickListener
  21. {
  22. public void onClick();
  23. }

在监听器、触发器的使用中经常用到,上面是一个典型的匿名内部类的使用方法,这个匿名内部类是实现ClickListener接口的子类。

方法内部类

在方法内部定义内部类,一般不太用到。

注意点:

  • 方法内部类不能使用方法的局部变量,因为内部类实例的生命周期可能比方法的局部变量长。
  • 方法内部类可以和普通内部类一样,方法外部类的实例变量。
  • 如果要创建方法内部类的实例,则必须在方法内部类声明后才能定义。

内部类的优先级

下面代码输出:内部类。

  1. class Inner //第一个Inner类
  2. {
  3. public void print()
  4. {
  5. System.out.println("外部类");
  6. }
  7. }
  8. public class InnerClass05
  9. {
  10. class Inner //第二个Inner类
  11. {
  12. public void print()
  13. {
  14. System.out.println("内部类");
  15. }
  16. }
  17. public void fun()
  18. {
  19. Inner in = new Inner();
  20. in.print(); //输出 “内部类”
  21. class Inner //第三个Inner类
  22. {
  23. public void print()
  24. {
  25. System.out.println("方法内部类");
  26. }
  27. }
  28. }
  29. public static void main(String[] args) {
  30. InnerClass05 inclass = new InnerClass05();
  31. inclass.fun();
  32. }
  33. }

注意点:

  • 优先级:方法内部类 > 普通内部类/静态内部类 > 外部类。

Java知识点:内部类的更多相关文章

  1. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  2. Java学习--内部类(一)

    Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...

  3. Java的内部类

    Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...

  4. 给Java新手的一些建议----Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  5. java使用内部类的好处及其初始化

    java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响          java内部类初始化 ForeCatal ...

  6. java知识点梳理

    网络搜索结果,出处不详,仅供参考 对于刚刚接触Java的人,java基础知识技术点繁多,那么gkstk小编为大家汇总最全java知识点如下,仅供大家参考学习! 1. JVM相关(包括了各个版本的特性) ...

  7. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  8. JAVA面向对象-----内部类的概述

    JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...

  9. 自己整理的所有java知识点(不断迭代中)

    1. 自己整理的所有java知识点(不断迭代中) 画图工具注册 https://www.processon.com/i/599d35fae4b00d97d7f9bb17 1.1. Java整体知识架构 ...

  10. Java的内部类真的那么难以理解?

    01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...

随机推荐

  1. iOS上用FTGL显示定制Truetype字体碰到的问题

    没想到这个问题搞了快2个月时间:当然跟我只是断断续续地工作有关. FTGL是freetype的opengl实现.我接触FTGL最初只是为了练习OpenGL,写几个简单的游戏app.开始试了试FTGL觉 ...

  2. 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  3. Matlab中数组下标是logical,如何处理?

    K>> a = 10*ones(1,10); K>> b = [1 56 23 5 6 45 9 7 89 10]; K>> c = b<a c = 1 0 ...

  4. java中判空

    一.概述 java中判等似乎很简单,==用来判断对象引用(内存地址)是否相同,equals用来判断值是否相同.你可以试用String对象轻松区分这一点. 那么在null判等(也就是判空操作)时呢? 可 ...

  5. linux下mysql的root密码忘记解决方

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...

  6. 01-07-01【Nhibernate (版本3.3.1.4000) 出入江湖】并发控制

    Nhibernate 并发控制 [1]悲观并发控制 正在使用数据的操作,加上锁,使用完后解锁释放资源. 使用场景:数据竞争激烈,锁的成本低于回滚事务的成本 缺点:阻塞,可能死锁 [2]乐观并发控制: ...

  7. 【Linux高频命令专题(8)】五大查询命令

    find 格式 find 路径 -命令参数 [输出形式] 路径:告诉find在哪儿去找你要的东西 命令参数:参考下面 输出形式:输出形式很多,-print,-printf,-print,-exec,- ...

  8. jdbc事务

    买书的例子 程序应该将图书数量的操作和更新account用户余额的操作作为一个事务来处理,只有这两个操作都完成的情况下,才能提交事务,否则就回滚事务. 本文转自http://blog.chinauni ...

  9. JavaScript基础精华01(变量,语法,数据类型)

    JavaScript是一种脚本语言. 脚本,一条条的文字命令.执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行 JavaScript基本组成 1.基本语法(浏览器基本都支持,有统 ...

  10. 显示Servlet API主要版本,次要版本以及服务器系统信息

    package com.mhb; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servle ...