最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件。现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢迎大家指正。

1、非公有类和内部类对应的文件名与这两种类的类名无关;

2、一个源文件中可以包含多个非公有类或者内部类;

3、非公有类不能使用public关键字(一般前面不加关键字),内部类可以使用public、private、protected关键字;

4、非公有类中可以添加0到多个内部类;

5、非公有类是包可见的,一个包中只能有一个同名非公有类,所以在包外无法调用非公有类;但是在包外可以通过包中外部类对象调用该包中的内部类

6、非公有类在源文件中直接调用,例如,在源文件Test.java中存在一个公有类Test,一个非公有类priTest,那么可以使用preTest pt = new preTest() 实例化一个非公有类的对象;而对于内部类,在非静态方法外部必须使用外部类的对象来调用内部类的构造方法,例如在源文件Outer.java中存在一个外部类Outer,一个内部类Inner,那么使用以下方式调用内部类:Outer out = new Outer(),Inner in = out.new Inner()。在非静态方法内部直接使用new类实例化内部类对象,即Inner in = new Inner()

7、非公有类只能通过创建公有类对象实现对于公有类的成员变量的使用,而内部类可以随意使用外部类的成员变量(包括私有变量)而不用生成外部类的对象。

8、如果源文件中有一个公有类和多个非公有类,在编译的时候编译器会为文件中每个类创建一个单独的.class文件,文件名就是对应的类名(所以一个包中只能有一个同名的非公有类);假如一个文件中有一个外部类,多个内部类,则在编译的时候也会为每个类创建一个.class文件,但是内部类对应的文件名为"外部类$内部类.class",$代表这个内部类所属的外部类。

9、在内部类中访问变量有三种形式:
a、变量名--访问局部变量;
b、this.变量名--访问内部类变量;
c、外部类名.this.变量名--访问外部类变量。

如果内部类没有同名成员变量和局部变量,内部类可以直接通过变量名访问外部类变量,而不用指定"外部类名.this.变量名"。

10、如果一个内部类是静态内部类,使用关键字static,则内部类只能访问外部类的静态成员变量,同时可以将"外部类名.内部类名"看成一个整体,直接new出内部类的对象,而不用先生成外部类对象,例如外部类为Out,静态内部类为In,则可以使用Out.In in = new Out.In()直接创建内部类对象。

11、如果一个内部类是“私有的”,则该类只能在外部类中生成对象进行操作,而无法再使用Out.In in = new Out().new In()生成内部类对象。

java 内部类与外部类的区别的更多相关文章

  1. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  2. java:内部类与外部类的区别和联系

    注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量. 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问.如在成员变量或者成员方法前面,加上Pri ...

  3. Java内部类与外部类的那些事

    昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...

  4. Java内部类和外部类的通信探索

    1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...

  5. java内部类和外部类

    1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...

  6. Java内部类与外部类

    错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...

  7. Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  8. 从字节码的角度看Java内部类与外部类的互相访问

    Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...

  9. Java内部类引用外部类中的局部变量为何必须是final问题解析

    今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方 ...

随机推荐

  1. Linux vi/vim(转载)

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  2. Android屏幕适配

    安卓分辨率的相关知识 http://leoray.leanote.com/post/android-resolution Android内存占用公式 系统内存 = 像素宽 * 像素高 * 像素所占用的 ...

  3. 学习Swift的点点滴滴

    1.类型标注 之前不知道为啥别人写的Swift语言的时候,定义常量或者变量的格式是 常量: let 常量名: 常量类型 = 常量值  或者 变量: var 变量名: 变量类型 = 初始值 原来书上有记 ...

  4. ASP.NET MVC3 Razor 调试与预加载

    目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载   在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...

  5. [AlwaysOn Availability Groups]AlwaysOn健康诊断日志

    AlwaysOn健康诊断日志 为了监控primary可用副本的健康状况,SQL Server资源DLL使用SQL Server2012的过程sp_server_diagnostics. SQL Ser ...

  6. Tornado框架简析

    Tornado是一款轻量级的Web服务器,同时又是一个开发框架.采用单线程非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. Tornado服务器3大 ...

  7. MYSQL的常用命令和增删改查语句和数据类型

    连接命令:<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库 ...

  8. PostgreSQL-数据目录与pg_ctl

    # tail /etc/profile PATH="$PATH":/usr/lib/postgresql/9.2/bin/ export PATH export PGDATA=/v ...

  9. AD设置板子原点

  10. Chrome Developer Tools:Network Panel说明

    官方资料:Chrome Developer Tools: Network Panel 一.chrome Developer Tools:Network Panel 从网络面板中可以获取很多有用信息,如 ...