内部类是什么,简单来说,就是定义在类内部的类(一本正经的说着废话)。

  一个正经的内部类是长这样的:

public class Outer {class Inner{}
}

  这是为了演示而写的类,没有什么luan用,可以看到Inner类置于Outer类的内部。

  那为什么要大费周章的在类内部定义一个类呢?不能在类外部定义类吗?内部类跟外部类有什么关系?

  确实,很多时候,在外部单独定义一个类确实更加方便,也更加通用,但内部类的存在自然有其存在的道理,内部类作为寄生在外部类的类,可以自由访问外部类的所有的属性和方法,有没有联想其我们之前说的继承,子类可以继承父类的属性和方法,但是内部类有着更高的访问权限,不仅是public属性,protected属性,就连private属性也可以轻松访问,这样就不会让修饰符限制你的想象了(手动滑稽)。

  内部类也分很多种:成员内部类、静态内部类、局部内部类、匿名内部类。今天先来说说第一种:成员内部类。

  成员内部类是最简单粗暴的内部类,上面那个栗子中的Inner类就是成员内部类,相比普通的类,成员内部类是不能有static修饰的成员或者方法的,因为成员内部类是寄生在外部类中的,所以必须先有外部类实例才能有成员内部类。在外部创建内部类对象时,姿势也不太一样,看起来像是这个样子的:

public class Test {public static void main(String[] args) {Outer.Inner inner = new Outer().new Inner();}
}

  在内部类中可以访问外部类的方法和属性,外部类也可以访问内部类的方法和属性,举个栗子:

public class Outer {private int num;private Inner inner;Outer(){num = 1;inner = new Inner();}public void print(){System.out.println("Outer.print()");System.out.println(inner.num);System.out.println(num);}class Inner{private int num;Inner(){num = 2;}public void print(){System.out.println("Inner.print()");System.out.println(this.num);System.out.println(Outer.this.num);}}
}

public class Test {public static void main(String[] args) {Outer outer = new Outer();Outer.Inner inner = outer.new Inner();outer.print();inner.print();}
}

  输出如下:

Outer.print()
2
1
Inner.print()
2
1

  外部类访问内部类的姿势是先生成内部类实例,然后就能访问所有方法和属性,内部类访问外部类方法和属性则直接使用Outer.属性/方法名 即可。

  在这个栗子中,我们可以看到内部了Inner可以对外围类Outer的属性进行无限制的访问,尽管它是private修饰的。因为当我们在创建某个外围类的内部类对象时,会往内部类传入一个外部类的引用,只要我们在访问外部类的成员时,就会用这个引用来选择外围类的成员。引用内部类的时候,需要使用Outer.Inner这样的形式来声明,而不能直接使用Inner来声明(除了在Outer类中),当需要使用到内部类的时候,还是推荐使用getInnerInstance的方式来获取,特别是当内部类只有无参构造器的时候:

public class Outer {private int num;private Inner inner;Outer(){num = 1;inner = new Inner();}public Inner getInnerInstance() {return new Inner();}public void print(){System.out.println("Outer.print()");System.out.println(inner.num);System.out.println(num);}public class Inner{private int num;Inner(){num = 2;}public void print(){System.out.println("Inner.print()");System.out.println(this.num);System.out.println(Outer.this.num);}}
}

public class Test {public static void main(String[] args) {Outer outer = new Outer();Outer.Inner inner = outer.getInnerInstance();outer.print();inner.print();}
}

  这样的话,就能更好的封装了。

  当然,内部类跟外部类还有一个很重要区别:内部类可以用private修饰,而外部类是不能使用private修饰的。如果内部类仅仅在类内部使用时,使用private修饰后,就可以更好的隐藏内部信息。

  至此,内部类的第一部分讲解完毕,欢迎大家继续关注。

 

转载于:https://www.cnblogs.com/mfrank/p/8046605.html

【Java入门提高篇】Day6 Java内部类——成员内部类相关推荐

  1. java入门提高篇:Day1 抽象类

    java入门提高篇:Day1 抽象类 基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定 ...

  2. java编程提高篇_【Java入门提高篇】Day1 抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  3. java集合类详解_【Java入门提高篇】Day20 Java集合类详解(三)List接口

    今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collection接口的所有操作,它们自然也是有的. Lis ...

  4. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  5. java 提高篇_【Java入门提高篇】Day16 Java异常处理(上)

    当当当当当当,各位看官,好久不见,甚是想念. 今天我们来聊聊Java里的一个小妖精,那就是异常. 什么是异常?什么是异常处理? 异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外 ...

  6. 匿名类 java final_java提高篇(十)-----详解匿名内部类 ,形参为什么要用final

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  7. java 入门程序_自学 Java 怎么入门?

    自学Java的确不易,但是有一份好的学习路线图,跟着路线图来一步一步踏踏实实的学下来,相信你也一定可以成为大牛. 分享给大家一套学习线路图,内容还是很全面的,每个阶段需要学习的内容罗列的也很清楚,这样 ...

  8. 清华大学计算中心培训部-技术分享:JAVA入门:简单的Java程序

    JAVA入门:简单的Java程序 清华大学计算中心培训部-技术分享:http://training.tsinghua.edu.cn/html/jishuyuandi/2009/0302/27.html

  9. JAVA入门-菜鸟篇-

    Java入门-记录01- 引言:先来说些闲话,科普一下,电脑硬件方面. 1.电脑的组成:cpu/gpu/主板/内存/硬盘/电源/散热/机箱Cpu是来计算数字的Gpu是来渲染图像的主板是来供电的 内存是 ...

最新文章

  1. python多进程_python语法:多进程
  2. JAVA接口的访问权限_Java中访问权限-类和接口
  3. 打印文件测试的测试点
  4. 通过trace跟踪系统调用
  5. python实现文件夹增量同步
  6. 计算机陕西高校保研排名,陕西18所大学2021届保研率排行榜
  7. L3-2 还原文件 (30 分)
  8. vs2005开发Silverlight平台搭建
  9. 用iFrame遮挡DropDownList的方法
  10. Ciena 在MEF16发布开放分布式NFV方案
  11. 创建显示特殊文档的视图:$FormulaClass的奥秘
  12. 居家短期任务赚钱好不好做容易学习吗?
  13. java实现视频格式转换
  14. 20050714日记
  15. uniapp 微信小程序登录方法封装
  16. java去除符号和字母_java 字符串中去除 数字 字母 符号N*1*senten.Length=M*M
  17. Qt5之qrc资源文件
  18. C++语言程序设计课程设计任务书
  19. 搭建线上教学平台前,需要明确哪些问题?
  20. 中国内地摇滚歌手及代表作

热门文章

  1. Javascript获取页面、屏幕尺寸大小参数
  2. jquery下拉菜单
  3. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
  4. python 修改计算机名_静心学数据分析002-python基础
  5. oracle跑with语句很慢,oracle 11g新特性---WITH语句增强
  6. computed set 自定义参数_完全理解Vue的渲染watcher、computed和user watcher
  7. linux加微软的数据库,在Linux上使用Microsoft SQL – 安装SQL
  8. oracle cdc 提交顺序,Oracle CDC部署流程
  9. mysql远程连接工具 cen_Navicat远程连接Centos数据库Mysql
  10. 禅道设置bug模板_一款热度很高的项目管理和bug工具,免费使用,可在公司推广哦...