Java中的内部类

一:什么是内部类;

  (1).什么是内部类呢?

  内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。

  (2).那为什么要将一个类定义在另一个类里面呢?独立的一个类不好吗?

  内部类的主要作用如下:

1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据

3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

  (3)内部类有几种呢?

  内部类可分为以下几种:

  • 成员内部类
  • 静态内部类
  • 方法内部类
  • 匿名内部类

二:Java 中的成员内部类;

  内部类中最常见的就是成员内部类,也称为普通内部类。我们来看如下代码:

  1. //外部类HelloWorld
  2. public class HelloWorld{
  3.  
  4. private int a = 99;//外部类的私有属性
  5. //内部类Inner
  6. public class Inner{
  7. int b = 2;
  8. public void test(){
  9. System.out.println("访问外部类中的a:"+a);
  10. System.out.println("访问内部类中的b:"+b);
  11. }
  12. }
  13. //测试成员内部类
  14. public static void main(String[]args){
  15. HelloWorld o = new HelloWorld();//创建外部类对象,对象名为o
  16. Inner i = o.new Inner();//使用外部类对象创建内部类对象,对象名为i
  17. i.test();//调用内部类对象的test方法
  18. }
  19. }

运行结果为:

从上面的代码中我们可以看到,成员内部类的使用方法:

1、 Inner 类定义在 HelloWorld类的内部,相当于 HelloWorld 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等

2、 Inner 类中定义的 test() 方法可以直接访问 HelloWorld类中的数据,而不受访问控制符的影响,如直接访问 HelloWorld类中的私有属性a

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );

4、 编译上面的程序后,会发现产生了两个 .class 文件

HelloWorld.class

HelloWorld$Inner.class

  其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class

另外,注意:

1、 外部类是不能直接使用内部类的成员和方法滴

  可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。如:

  1. //外部类HelloWorld
  2. public class HelloWorld{
  3.  
  4. int b = 1;
  5. //内部类Inner
  6. public class Inner{
  7. int b = 2;
  8. public void test(){
  9. System.out.println("访问外部类中的b:"+HelloWorld.this.b);
  10. System.out.println("访问内部类中的b:"+b);
  11. }
  12. }
  13. //测试成员内部类
  14. public static void main(String[]args){
  15. HelloWorld o = new HelloWorld();//创建外部类对象,对象名为o
  16. Inner i = o.new Inner();//使用外部类对象创建内部类对象,对象名为i
  17. i.test();//调用内部类对象的test方法
  18. }
  19.  
  20. }

运行结果为:

三:Java 中的静态内部类;

  静态内部类是 static 修饰的内部类,这种内部类的特点是:

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 

2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

举个例子:

  1. //外部类HelloWorld
  2. public class HelloWorld{
  3.  
  4. private int a = 99;//外部类的私有变量
  5. static int b = 1;//外部类的静态变量
  6. //静态内部类
  7. public static class SInner{
  8. int b =2;
  9. public void test(){
  10. System.out.println("访问外部类中的b:"+HelloWorld.b);
  11. System.out.println("访问内部类中的b:"+b);
  12. }
  13. }
  14. //测试静态内部类
  15. public static void main(String[]args){
  16. SInner si = new SInner();//直接创建内部类的对象
  17. si.test();//调用test方法
  18. }
  19. }

运行结果为:

四:Java 中的方法内部类;

  方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

举一个例子:

  1. //外部类HelloWorld
  2. public class HelloWorld{
  3.  
  4. //外部类中的方法
  5. public void show(){
  6. final int a =25;//常量
  7. int b = 13;//变量
  8. //方法内部类
  9. class MInner{
  10. int c =2;//内部类中的变量
  11. public void print(){
  12. System.out.println("访问外部类的方法中的常量a:"+a);
  13. System.out.println("访问内部类中的变量c:"+c);
  14. }
  15. }
  16. MInner mi = new MInner();//创建方法内部类中的对象
  17. mi.print();//调用内部类中的方法
  18. }
  19. //测试方法内部类
  20. public static void main(String[]args){
  21. HelloWorld mo = new HelloWorld();
  22. mo.show();//调用外部类的方法
  23. }
  24. }

注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

Java学习笔记二十:Java中的内部类的更多相关文章

  1. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  2. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  3. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  4. Java学习笔记二十九:一个Java面向对象的小练习

    一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...

  5. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  6. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  7. Java学习笔记二十二:Java的方法重写

    Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...

  8. Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...

  9. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

随机推荐

  1. SQL Server 使用 OUTPUT做数据操作记录

    OUTPUT 子句 可以在数据进行增删改的时候,可以返回受影响的行.先准备一张表 create table #t ( id int identity primary key ,name ) ) go ...

  2. 【Leetcode】【Medium】Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  3. Hibernate初探之一对多映射 及 myeclipse自动生成hibernate文件方法

    实现单向一对多: 1)在one方的实体中添加保存many方的集合 2)在one方的配置文件中添加<one-to-many>配置 实现单向多对一: 1)在many方的实体中添加one方的引用 ...

  4. Docker技术三大要点:cgroup, namespace和unionFS的理解

    www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...

  5. Linux 系统查看tomcat控制台命令

    前提进入tomcat/logs文件夹下 查看全部命令是:tail -f catalina.out 如果想查看具体文件的日志进入该文件所在目录然后命令如下: tail -f filename

  6. 021logging模块

    ##importlogging logging.debug('debug  message')logging.info('info  message')logging.warning('warning ...

  7. NPM cache相关

    今天下午把package.lock.json用别人的替换了,然后编译一堆报错,这个问题弄了一下午. 总结一下经验: 1.关于npm cache NPM会把所有下载的包保存,放在用户文件夹下面,在我的w ...

  8. Executor线程池框架

    Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致 ...

  9. Type Systems

    This section deals with more theoretical aspects of types. A type system is a set of rules used by a ...

  10. __call、__set 和 __get的用法

    1. __call的用法 PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法.如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用. 例:__ ...