什么是内部类

将一个类的定义放在另一个类的定义内部,这就是内部类。
在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 -- 内部类(一)相关推荐

  1. 看到如此详细的Java内部类,我泪目了

    Java内部类 介绍 定义 成员内部类 语法格式 使用说明 代码示例 局部内部类 语法格式 使用说明 代码示例 匿名内部类 语法格式 使用说明 代码示例 静态内部类 语法格式 使用说明 代码示例 介绍 ...

  2. Java内部类作用全解

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  3. netBeans调试时不进入java内部类(jdk源码)的方法 转载

    初次使用netbeans的调试功能时,会发现调试中,进入了java的内部类运行,具体情况,如下图所示: 对于我这样的一个新手,完全弄不懂啊. 后来我去论坛问了,同时自己研究,发现经过以下设置,就可以跳 ...

  4. Java内部类(Inner Class)小记

    一.引子 看到Trinea的博文Junit单测代码中java序列化失败的解决,让我想到Java内部类的一些小Gocha,初学Java时很迷惑.这里记录一下. 就以Trinea的博文中的序列化失败的例子 ...

  5. Java内部类简介.

    一, 什么是内部类 Java中所谓内部类, 就是定义在另1个类内的类. 例如: class A{int a;class B{int b;} } 上面类B就是类A的一个内部类. 但是下面的写法, B只是 ...

  6. java内部类文件,Java内部类学习

    Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...

  7. 在Java内部类中使用外部类的成员方法以及成员变量

    http://blog.csdn.net/zhongyili_sohu/article/details/8975947 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止 ...

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

    Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...

  9. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  10. 如何新建java内部类_java内部类-1(内部类的定义)

    小胖从官网出发,研究下为什么我们需要些内部类,内部类的区别和联系. 思考三个问题: (1)为什么需要内部类?静态内部类和非静态内部类有什么区别: (2)为什么内部类可以无条件访问外部类成员: (3)为 ...

最新文章

  1. DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略
  2. C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
  3. 【学术相关】大学老师的职业前景究竟怎么样?薪资待遇如何?
  4. word2vec模型评估_【新书】从Word2Vec到BERT的自然语言处理嵌入进展,附下载
  5. hive 修改分区备注_hive修改 表/分区语句
  6. 编译是检查c语言,为什么CMake检查C编译器?
  7. Compound创始人:Compound链要成为一个单一全球流动性网络
  8. 如何解决未经检查的演员表警告?
  9. 团队编程项目作业6-程序维护
  10. RedHat7配置本地yum源(超详细过程)
  11. 粤语 之 粤语学习的一些学习网站和工具整理
  12. 【WIN】windows自启动项查询整理
  13. 爬豆瓣读书Top250
  14. Linux的加密和安全
  15. ios屏幕尺寸和分辨率
  16. 计算机二级Ms Office考点自检卡
  17. 共模电感的原理以及使用情况
  18. 数学乐 --- 科学计数法(个人学习笔记)
  19. 2004年秋浙江省计算机等级考试二级C 编程题(2)
  20. 30岁之前一定要知道的7个金融概念-千氪

热门文章

  1. Visual Studio 2005 快捷键
  2. Android Camera2 拍照(四)——对焦模式
  3. 关于Oracle undostat中的2012和ORA-01555问题的自我解答
  4. 3.1.1_Spring如何加载和解析@Configuration标签
  5. 【博客征文】畅谈百度轻应用初体验
  6. 退出窗口[置顶] 退出Activity的方法
  7. 正式生产库,配置双节点的RAC + 单实例的 DATAGUARD
  8. 用SwipeBackLayout让activity具有滑动返回的效果
  9. Android还在用Toast?你Out啦,该试试Snackbar了
  10. Android 高级Drawable资源---复合Drawable----层Drawable