Java -- 内部类(一)
什么是内部类
将一个类的定义放在另一个类的定义内部,这就是内部类。
在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。
举个栗子:
public class A { public class B { } };
为什么要用内部类
在《Think in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
栗子:
public interface Father {}public interface Mother {}public class Son implements Father, Mother {}public class Daughter implements Father{class Mother_ implements Mother{} }
有什么特性
- 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
- 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
- 创建内部类对象的时刻并不依赖于外围类对象的创建。
- 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
- 内部类提供了更好的封装,除了该外围类,其他类都不能访问。
如何使用呢
当我们在创建一个内部类的时候,它无形中就与外围类有了一种联系,依赖于这种联系,它可以无限制地访问外围类的元素。这是因为当我们在创建某个外围类的内部类对象时,此时内部类对象必定会捕获一个指向那个外围类对象的引用,只要我们在访问外围类的成员时,就会用这个引用来选择外围类的成员.
@Getter @Setter public class OuterClass {private String name ;private int age;public class InnerClass{public InnerClass(){name = "JackPotHan";age = 23;}public void display(){System.out.println("name:" + getName() +" ;age:" +getAge());}}public static void main(String[] args) {OuterClass outerClass = new OuterClass();OuterClass.InnerClass innerClass = outerClass.new InnerClass();innerClass.display();} } -------------- Output: name:JackPotHan ;age:23
注:在使用内部类时有些新手可能会遇到下面一个错误--"is not an enclosing class",因为按照正逻辑,应该是A.B ab = new A.B(); 但是翻看相关java代码,会发现正确的用法是A a = new A(); A.B ab = a.new B(); 没有静态(static)的类中类不能使用外部类进行.操作,必须用实例来进行实例化类中类.
同时如果我们需要生成对外部类对象的引用,可以使用OuterClassName.this,这样就能够产生一个正确引用外部类的引用了。当然这点是在编译期就知晓了,没有任何运行时的成本。
栗子:
public class OuterClass {public void display(){System.out.println("OuterClass...");}public class InnerClass{public OuterClass getOuterClass(){return OuterClass.this;}}public static void main(String[] args) {OuterClass outerClass = new OuterClass();OuterClass.InnerClass innerClass = outerClass.new InnerClass();innerClass.getOuterClass().display();} } ------------- Output: OuterClass...
到这里了我们需要明确一点,内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。
转载于:https://www.cnblogs.com/JackpotHan/p/9699270.html
Java -- 内部类(一)相关推荐
- 看到如此详细的Java内部类,我泪目了
Java内部类 介绍 定义 成员内部类 语法格式 使用说明 代码示例 局部内部类 语法格式 使用说明 代码示例 匿名内部类 语法格式 使用说明 代码示例 静态内部类 语法格式 使用说明 代码示例 介绍 ...
- Java内部类作用全解
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- netBeans调试时不进入java内部类(jdk源码)的方法 转载
初次使用netbeans的调试功能时,会发现调试中,进入了java的内部类运行,具体情况,如下图所示: 对于我这样的一个新手,完全弄不懂啊. 后来我去论坛问了,同时自己研究,发现经过以下设置,就可以跳 ...
- Java内部类(Inner Class)小记
一.引子 看到Trinea的博文Junit单测代码中java序列化失败的解决,让我想到Java内部类的一些小Gocha,初学Java时很迷惑.这里记录一下. 就以Trinea的博文中的序列化失败的例子 ...
- Java内部类简介.
一, 什么是内部类 Java中所谓内部类, 就是定义在另1个类内的类. 例如: class A{int a;class B{int b;} } 上面类B就是类A的一个内部类. 但是下面的写法, B只是 ...
- java内部类文件,Java内部类学习
Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...
- 在Java内部类中使用外部类的成员方法以及成员变量
http://blog.csdn.net/zhongyili_sohu/article/details/8975947 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止 ...
- Java内部类引用外部类中的局部变量为何必须是final问题解析
Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...
- java内部格式_详解java内部类的访问格式和规则
详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...
- 如何新建java内部类_java内部类-1(内部类的定义)
小胖从官网出发,研究下为什么我们需要些内部类,内部类的区别和联系. 思考三个问题: (1)为什么需要内部类?静态内部类和非静态内部类有什么区别: (2)为什么内部类可以无条件访问外部类成员: (3)为 ...
最新文章
- DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略
- C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
- 【学术相关】大学老师的职业前景究竟怎么样?薪资待遇如何?
- word2vec模型评估_【新书】从Word2Vec到BERT的自然语言处理嵌入进展,附下载
- hive 修改分区备注_hive修改 表/分区语句
- 编译是检查c语言,为什么CMake检查C编译器?
- Compound创始人:Compound链要成为一个单一全球流动性网络
- 如何解决未经检查的演员表警告?
- 团队编程项目作业6-程序维护
- RedHat7配置本地yum源(超详细过程)
- 粤语 之 粤语学习的一些学习网站和工具整理
- 【WIN】windows自启动项查询整理
- 爬豆瓣读书Top250
- Linux的加密和安全
- ios屏幕尺寸和分辨率
- 计算机二级Ms Office考点自检卡
- 共模电感的原理以及使用情况
- 数学乐 --- 科学计数法(个人学习笔记)
- 2004年秋浙江省计算机等级考试二级C 编程题(2)
- 30岁之前一定要知道的7个金融概念-千氪
热门文章
- Visual Studio 2005 快捷键
- Android Camera2 拍照(四)——对焦模式
- 关于Oracle undostat中的2012和ORA-01555问题的自我解答
- 3.1.1_Spring如何加载和解析@Configuration标签
- 【博客征文】畅谈百度轻应用初体验
- 退出窗口[置顶] 退出Activity的方法
- 正式生产库,配置双节点的RAC + 单实例的 DATAGUARD
- 用SwipeBackLayout让activity具有滑动返回的效果
- Android还在用Toast?你Out啦,该试试Snackbar了
- Android 高级Drawable资源---复合Drawable----层Drawable