Java面向对象编程篇4——内部类

1、内部类的概念

当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类 (Inner),而这个内部类所在的类叫做外部类(Outer)。

类中的内容:成员变量、成员方法、构造方法、静态成员、构造块和静态代码块、内部类

2、内部类的意义

当一个类存在的价值仅仅是为某一个类单独服务时,那么就可以将这个 类定义为所服务类中的内部类,这样可以隐藏该类的实现细节并且可以 方便的访问外部类的私有成员而不再需要提供公有的get和set方法。

3、内部类的分类

3.1、成员内部类

直接将一个类的定义放在另外一个类的类体中

访问修饰符 class 外部类的类名 {访问修饰符 class 内部类的类名 {内部类的类体;}
}
public class Outer {//成员变量private int outerNum = 1;//内外重复的变量private int commonNum = 2;//静态成员变量private static int staticOuterNum = 3;/*** 成员方法*/public void outerMethod() {System.out.println("我是外部类的outerMethod方法");}/*** 静态方法*/public static void staticOuterMethod() {System.out.println("我是外部类的staticOuterMethod静态方法");}class Inner{//成员变量private int innerNum = 1;//内外重复的变量private int commonNum = 20;public void innerShow() {//当和外部类冲突时,直接引用属性名,是内部类的成员属性System.out.println("内部的commonNum:" + commonNum);//内部类访问外部属性System.out.println("outerNum:" + outerNum);//当和外部类属性名重叠时,可通过外部类名.this.属性名System.out.println("外部的commonNum:" + Outer.this.commonNum);System.out.println("staticOuterNum:" + staticOuterNum);//访问外部类的方法outerMethod();staticOuterMethod();}}public void outershow() {Inner inner = new Inner();inner.innerShow();}public static void main(String[] args) {Outer outer = new Outer();outer.outershow();}
}

外部类使用

public class Test {public static void main(String[] args) {Outer outer = new Outer();outer.outershow();System.out.println("=======================");Outer.Inner inner = new Outer().new Inner();inner.innerShow();}
}
  • 成员内部类可以是任何的访问修饰符
  • 成员内部类的内部不能有静态信息
  • 内部类也是类,该继承继承,该重写重写,该重载重载,this和super随便用(可以解决多继承问题)
  • 外部类如何访问内部类信息,必须new之后访问
  • 内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突,调用外部类.this.属性或者方法
  • 其他类访问内部类需Outer.Inner inner = new Outer().new Inner();

3.2、静态内部类

使用static关键字修饰的内部类,隶属于类层级

访问修饰符 class 外部类的类名 {访问修饰符 static class 内部类的类名 {内部类的类体;}
}
public class Outer {//成员变量private int outerNum = 1;//内外重复的变量private int commonNum = 2;//静态成员变量private static int staticOuterNum = 3;static {System.out.println("Outer的静态块被执行了……");}/*** 成员方法*/public void outerMethod() {System.out.println("我是外部类的outerMethod方法");}/*** 静态方法*/public static void staticOuterMethod() {System.out.println("我是外部类的staticOuterMethod静态方法");}static class Inner{static {System.out.println("Outer.Inner的静态块执行了……");}//成员变量private int innerNum = 1;//内外重复的变量private int commonNum = 20;private static int staticInnerVariable = 30;/*** 成员方法*/public void innerShow() {System.out.println("innerNum:" + innerNum);System.out.println("内部的commonNum:" + commonNum);System.out.println("staticOuterNum:"+staticOuterNum);staticOuterMethod();}/*** 静态方法*/public static void innerStaticShow() {//被调用时会先加载Outer类staticOuterMethod();System.out.println("staticOuterNum"+staticOuterNum);}}public static void callInner() {System.out.println("staticInnerNum"+Inner.staticInnerVariable);Inner.innerStaticShow();}public static void main(String[] args) {callInner();}
}

外部使用静态内部类

public class Test {public static void main(String[] args) {Outer.callInner();System.out.println("====================");Outer.Inner.innerStaticShow();System.out.println("====================");Outer.Inner inner = new Outer.Inner();inner.innerShow();}
}
  • 静态内部类可以包含任意的信息
  • 静态内部类的方法只能访问外部类的static关联的信息
  • 利用 外部类.内部类 引用=new 外部类.内部类(); 然后利用引用.成员信息(属性、方法)调用。
  • 访问内部类的静态信息,直接外部类.内部类.静态信息

3.3、局部内部类

直接将一个类的定义放在方法体的内部

访问修饰符 class 外部类的类名 {访问修饰符 返回值类型 成员方法名(形参列表) {class 内部类的类名 {内部类的类体;}}
}
public class Outer {//成员变量private int outerNum = 1;//内外重复的变量private int commonNum = 2;//静态成员变量private static int staticOuterNum = 3;static {System.out.println("Outer的静态块被执行了……");}/*** 成员方法*/public void outerMethod() {boolean flag=false;System.out.println("我是外部类的outerMethod方法");class Inner{//成员变量private int innerNum = 1;//内外重复的变量private int commonNum = 20;/*** 成员方法*/public void innerShow() {System.out.println("flag:" + flag);System.out.println("innerNum:" + innerNum);System.out.println("内部的commonNum:" + commonNum);System.out.println("外部的commonNum:" + Outer.this.commonNum);System.out.println("staticOuterNum:"+staticOuterNum);staticOuterMethod();}}new Inner().innerShow();}/*** 静态方法*/public static void staticOuterMethod() {System.out.println("我是外部类的staticOuterMethod静态方法");}public static void main(String[] args) {new Outer().outerMethod();}
}
  • 局部内部类,类前不能有访问修饰符
  • 局部内部类只能在方法内使用
  • 无法创造静态信息
  • 可以直接访问方法内的局部变量和参数,但是不能更改
  • 可以随意的访问外部类的任何信息
  • 匿名内部类的方法中用到的局部变量都必须定义为final

3.4、匿名内部类

就是指没有名字的内部类

接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };

接口

public interface Animal {void speak();
}

使用

public class Outer {public static void main(String[] args) {//接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };Animal animal=new Animal() {@Overridepublic void speak() {System.out.println("喵喵喵");}};animal.speak();}
}
  • 匿名内部类是没有访问修饰符的
  • 使用匿名内部类时,这个new之后的类首先是要存在的,其次我们要重写new后的类的某个或某些方法
  • 匿名内部类访问方法参数时也有和局部内部类同样的限制
  • 匿名内部类没有构造方法

Java面向对象编程篇4——内部类相关推荐

  1. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

  2. Java面向对象编程篇5——枚举

    Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...

  3. Java面向对象编程篇3——接口与抽象类

    Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...

  4. Java面向对象编程篇2——面向对象三大特点

    Java面向对象编程篇2--面向对象三大特点 1.封装 1.1.封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生 ...

  5. Java面向对象编程篇1——类与对象

    Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...

  6. java面向对象编程 漫画_Java面向对象编程(一)

    由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...

  7. 【Java】《Java面向对象编程的三大特性》阅读笔记

    前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...

  8. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  9. 5.Java面向对象编程

    文章目录 05 Java面向对象编程 1. 面向过程与面向对象比较 2. 类和对象 2.1 对象的属性和方法 2.2 类的属性和方法 2.3 定义一个类 2.4 创建和使用对象 2.5 对象和类的总结 ...

最新文章

  1. machine learning
  2. 防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知
  3. 接入Tinker热修复和踩坑
  4. 【赠书】掌握人工智能重要主题,深度强化学习实践书籍推荐
  5. 微信小程序,实现 watch 属性,监听数据变化
  6. 论文浅尝 | Learning with Noise: Supervised Relation Extraction
  7. matlab完整脚本模板,在PyCharm中给Python脚本设置默认的代码模板和活动模板,文末有一个案例(MATLAB GUI和Qt对比做一个界面)...
  8. Linux IPC之有名管道
  9. JSK-1 A+B+C问题【OJ测试】
  10. innerHTML、outerHTML、innerText、outerText的区别及兼容性问题
  11. 使用linux批量引物设计,使用NCBI-ePCR和Primer3进行引物批量化设计
  12. 程序员5种编程入门方法,快速学会一门编程语言!
  13. UDP编程与Socket
  14. 大华linux密码,大华wifi摄像头的初始化和读取视频流
  15. 怎么用Python爬取抖音小视频? 资深程序员都这样爬取的(附源码)
  16. 手机浏览器 css3,css3在不同型号手机浏览器上的兼容一览表
  17. python中fabs什么意思_Python中abs()和fabs()方法之间的区别
  18. odoo 使用打印功能
  19. 【编程题】中国象棋路灯
  20. 清华大学计算机科学与技术系黄必胜,都来看看,我们广西优秀学子在清华大学都读什么专业(2012年)...

热门文章

  1. [转载] 1.1Java使用JDBC原生方式连接MySql数据库
  2. [转载] Java中的50个关键字
  3. [转载] Java Formatter toString()方法与示例
  4. 设置header_Nginx的这些安全设置,你都知道吗?
  5. c++ websocket客户端_websocket使用
  6. python定义变量名的时候、需要注意问题_python中将函数赋值给变量时需要注意的一些问题...
  7. 聊聊近期的感受和10月文章精选!
  8. 消息队列终极解决方案——Stream(下)
  9. Oracle plsqlI 练习 传值
  10. MATLAB使用教程