Java面向对象编程篇4——内部类
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——内部类相关推荐
- Java面向对象编程篇6——注解与反射
Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...
- Java面向对象编程篇5——枚举
Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...
- Java面向对象编程篇3——接口与抽象类
Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...
- Java面向对象编程篇2——面向对象三大特点
Java面向对象编程篇2--面向对象三大特点 1.封装 1.1.封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生 ...
- Java面向对象编程篇1——类与对象
Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...
- java面向对象编程 漫画_Java面向对象编程(一)
由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...
- 【Java】《Java面向对象编程的三大特性》阅读笔记
前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...
- 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)
文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...
- 5.Java面向对象编程
文章目录 05 Java面向对象编程 1. 面向过程与面向对象比较 2. 类和对象 2.1 对象的属性和方法 2.2 类的属性和方法 2.3 定义一个类 2.4 创建和使用对象 2.5 对象和类的总结 ...
最新文章
- machine learning
- 防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知
- 接入Tinker热修复和踩坑
- 【赠书】掌握人工智能重要主题,深度强化学习实践书籍推荐
- 微信小程序,实现 watch 属性,监听数据变化
- 论文浅尝 | Learning with Noise: Supervised Relation Extraction
- matlab完整脚本模板,在PyCharm中给Python脚本设置默认的代码模板和活动模板,文末有一个案例(MATLAB GUI和Qt对比做一个界面)...
- Linux IPC之有名管道
- JSK-1 A+B+C问题【OJ测试】
- innerHTML、outerHTML、innerText、outerText的区别及兼容性问题
- 使用linux批量引物设计,使用NCBI-ePCR和Primer3进行引物批量化设计
- 程序员5种编程入门方法,快速学会一门编程语言!
- UDP编程与Socket
- 大华linux密码,大华wifi摄像头的初始化和读取视频流
- 怎么用Python爬取抖音小视频? 资深程序员都这样爬取的(附源码)
- 手机浏览器 css3,css3在不同型号手机浏览器上的兼容一览表
- python中fabs什么意思_Python中abs()和fabs()方法之间的区别
- odoo 使用打印功能
- 【编程题】中国象棋路灯
- 清华大学计算机科学与技术系黄必胜,都来看看,我们广西优秀学子在清华大学都读什么专业(2012年)...
热门文章
- [转载] 1.1Java使用JDBC原生方式连接MySql数据库
- [转载] Java中的50个关键字
- [转载] Java Formatter toString()方法与示例
- 设置header_Nginx的这些安全设置,你都知道吗?
- c++ websocket客户端_websocket使用
- python定义变量名的时候、需要注意问题_python中将函数赋值给变量时需要注意的一些问题...
- 聊聊近期的感受和10月文章精选!
- 消息队列终极解决方案——Stream(下)
- Oracle plsqlI 练习 传值
- MATLAB使用教程