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后的类的某个或某些方法
  • 匿名内部类访问方法参数时也有和局部内部类同样的限制
  • 匿名内部类没有构造方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle中$的用法,关于expdp 中query用法小结

今天看到群里有人问到关于在使用expdp导出数据中使用query参数报错的解决方法,自己也出于好奇心瞎折腾了一把,现记录如下1.第一次尝试的时候[oracleDB ~]$ expdp scott/scott tablesemp1 dumpfileemp1.dmp logfileemp1.log queryemp1:"where rownum…

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

Java面向对象编程篇5——枚举 1、枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2、枚举的定义 使用public static final表示的常量描述较为繁琐&am…

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

Java面向对象编程篇6——注解与反射 1、注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类、方法、变量、参数和包等都可以被标注。Java 标注可以通过反射获取标注内容。在编译器生成类文件时&…

oracle数据库支持2颗cpu,2.3 Oracle数据库中常见的性能问题

2.3 Oracle数据库中常见的性能问题这一节列出和描述了Oracle数据库中常见的性能问题。通过下面的Oracle性能调优方法,你应该可以避免这些问题,如果你遇到这些问题了,那么重复前面谈到的Oracle性能调优的步骤,或查阅适当的章节来解…

oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法

How to generate WIP debug log files in ONLINE cases? For 11.5.10 and above, the WIP debug log files will be created ifHow to generate WIP debug log files in ONLINE cases?For 11.5.10 and above, the WIP debug log files will be created if1. FND: Debug Log F…

Java核心类库篇1——简介

Java核心类库篇1——简介 1、核心类库 包名主要功能java.applet提供了创建applet需要的所有类java.awt.*提供了创建用户界面以及绘制和管理图形、图像的类java.beans.*提供了开发Java Beans需要的所有类java.io.*提供了通过数据流、对象序列以及文件系统实现的系统输入、输出…

oracle更新blol字段超长,oracle - 将对象值插入表PL / SQL而无需指定属性 - 堆栈内存溢出...

我有以下架构DROP TABLE ALUMNO_ASIGNATURA;DROP TABLE ASIGNATURA;DROP TABLE TITULACION;DROP TABLE PROFESOR;DROP TABLE ALUMNO;DROP TABLE PERSONA;CREATE TABLE PERSONA( DNI VARCHAR2(9) CONSTRAINT PERSONA_PK PRIMARY KEY,NOMBRE VARCHAR2(20) CONSTRAINT PERSONA_NOM…

Java核心类库篇2——lang

Java核心类库篇2——lang 1、Object 该类是所有类的父类,每个类都使用它作为超类,没有任何属性 方法声明功能介绍Object()使用无参方式构造对象boolean equals(Object obj)用于判断调用对象是否与参数对象相等。 该方法默认比较两个对象的地址是否相等…

Java核心类库篇3——util

Java核心类库篇3——util 1、Date 用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒 1.1、构造方法 方法声明功能介绍public Date()获取当前时间表示的date对象public Date(long date)根据给定的毫秒值创建date对象 public class Test {public…

linux怎么重装ssh服务器,Linux平台下安装SSH

什么是SSH?Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。传统的网络服务程序,如r…

Java核心类库篇4——集合

Java核心类库篇4——集合 1、集合的意义 记录单个数据内容时,则声明一个变量记录多个类型相同的数据内容时,声明一个一维数组记录多个类型不同的数据内容时,则创建一个对象记录多个类型相同的对象数据时,创建一个对象数组记录多…

计划任务文件 linux,Linux之任务计划

一、单次任务计划二、周期性任务计划一、单次任务计划命令:batch:系统空闲时自动执行,不常用at:可以使用相对时间、绝对时间或模糊时间,例如相对时间:at now3min,表示3分钟后执行绝对时间&#…

Java核心类库篇5——异常

Java核心类库篇5——异常 java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了 等其中Exception类主要用于描述因编程错误或偶然外在…

linux2019内核版本发布,求问Linux最新内核版本以及发布日期。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼具有时效性的东西,百度能查处什么鬼来。mainline:4.3-rc32015-09-27[tar.xz][pgp][patch][view diff][browse]stable:4.2.22015-09-29[tar.xz][pgp][patch][inc. patch][view diff][browse][changelog]longterm:4.1.920…

Java核心类库篇6——IO

Java核心类库篇6——IO 1、File 1.1、构造方法 方法声明功能介绍public File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例public File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例public File(String pa…

linux搭建web服务器原理,【LINUX】linux搭建web服务器

linux httpd假设服务器地址为192.168.80.20/241.将准备安装的httpd软件包共享给everyone,(1)在linux上mount.cifs //真机IP地址/共享文件夹名/media /ls /meidia/查看tar xjvf httpd-2.4.10.tar.bz2 -C /usr/src解压至/usr/src下下面两个插件是httpd2.4以…

Java核心类库篇7——多线程

Java核心类库篇7——多线程 1、程序、进程和线程 程序 - 数据结构 算法,主要指存放在硬盘上的可执行文件进程 - 主要指运行在内存中的可执行文件线程就是进程内部的程序流 操作系统内部支持多 进程的,而每个进程的内部又是支持多线程的 2、线程的创…

Java核心类库篇8——网络编程

Java核心类库篇8——网络编程 1、七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型。 当发送数据时,需要对发送的内容按…

linux网站如何添加swf支持,linux下安装swftools和openOffice

1.openOffice下载地址:http://download.openoffice.org/all_rc.html#untested-full 下载 Linux 32-bit Intel rpm 包 版本自选 2.安装openOffice 1】 tar -zxvf OOo_3.2.1_Linux_x86_install-rpm-wJRE_zh-CN.tar.gz 2】 cd OOO320_m18_native_packed-1_zh-CN1.openO…

Java番外篇1——正则表达式

Java番外篇1——正则表达式 1、什么是正则表达式 正则表达式定义了字符串的模式正则表达式可以用来搜索、编辑或处理文本正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别 2、正则表达式规则 2.1、普通字符 普通字符包括没有显式指定为元字符的所…