8、java中的内部类

根据类定义时所在的位置不同可以将内部类分为四大类:成员内部类、方法内部类、静态内部类、匿名内部类。

成员内部类

顾名思义成员内部类定义在外部类的成员变量位置,相当于外部类的一个成员。将成员内部类当成当前封装类中的一个成员即可,容易理解,外部类中的任何属性和方法在成员内部类中均可直接调用,成员内部类中的任何方法和属性在封装类中也均可使用,但是需要通过声明内部类的实例,通过对象调用。并且内部类中不可使用static修饰变量和方法。代码如下:

public class OutterTest{private int a = 5;public int b = 6;private void outFirst() {System.out.println("outFirst...");}//想要访问内部类中的变量和方法则需使用内部类的实例InnerTest innerTest = new InnerTest();public void outSecond() {System.out.println("outSecond..."+innerTest.c);}//声明一个和内部类中方法重名的方法public void overName() {System.out.println("overName...outter");}//声明一个类作为OutterTest的成员,成员内部类class InnerTest{private int c = 1;public int d = 2;//编译错误,成员内部类中不允许使用static来修饰属性和方法//之所以叫做成员内部类,是因为作为外部封装类的一个成员存在,成员内部类依赖于外部封装类//当创建一个外部类对象时,就可以使用这个对象来创建多个内部类对象;如果在声明要给外部类对象,还是可以继续声明多个内部类对象//如果在内部类中声明一个static修饰的变量,也就是说内部类中的变量e是类变量,它并不依赖于内部类对象,并且它只能有一份//但是呢,每个外部类对象都可创建多个内部类(内部类依赖于外部类才存在),此时就会出现多个变量e,这就违反了java的语法static String e = "aa";//内部类使用外部类的变量和方法时直接访问即可,不需声明外部类实例private void innerFirst() {outFirst();System.out.println("innerFirst..."+a);}//调用重名方法//当时用内部类中的方法时,直接调用即可//当使用外部类中的方法时,可以使用 OutterTest.this.overName(); 来调用外部类方法public void innerSecond() {OutterTest.this.overName();System.out.println("innerSecond..."+b);}//声明一个和外部类中方法重名的方法public void overName() {System.out.println("overName...innner");}}
}----------------------------------------------------------------------------public class Test {public static void main(String[] args) {//先创建外部类的实例,才能创建内部类实例OutterTest.InnerTest innerTest = new OutterTest().new InnerTest();innerTest.innerSecond();innerTest.overName();}
}

方法内部类

 在方法中定义一个类,用于辅助解决一些比较复杂的问题。可随便使用外部类中的成员变量和方法。并且内部类中不可使用static修饰变量和方法。

/*** 方法内部类(局部内部类)* 在方法中定义一个类,用于辅助解决问题* @author chaizepeng**/
public class MethodOutterTest {private int b = 6;/*** 在此方法中定义一个类* @author chaizepeng**/public void outFirst(int code) {//声明一个内部类,用来做一些复杂的操作,例如:求一下code的平方+成员变量b的值class InnerTest{private int flag;
//			private static int a;//同样的不能用static修饰public void innerFirst() {flag = code * code + b;System.out.println(code+"的平方是:"+flag);}//同名方法public void overName() {System.out.println("overName...inner");}}//调用内部类中的方法InnerTest innerTest = new InnerTest();innerTest.innerFirst();overName();//这样调用的是外部类的方法}//声明一个和内部类中方法重名的方法public void overName() {System.out.println("overName...outter");}public static void main(String[] args) {MethodOutterTest methodOutterTest = new MethodOutterTest();methodOutterTest.outFirst(2);}}

静态内部类

使用static关键字修饰的成员内部类就是静态内部类,其他的内部类中不能使用static修饰,而静态内部类可以,它只可以访问外部类中static修饰过的属性和方法,外部类可直接使用它的内部类方法,它不依赖于外部类的实例,可以向调用静态方法似的直接调用静态内部类中的静态方法。

/*** 静态内部类:使用static关键字修饰的成员内部类就是静态内部类* @author chaizepeng**/
public class StaticOutterTest {private int a = 5;public int b = 6;private static int c = 5;public void outFirst() {InnerTest.innerFirst();System.out.println("outFirst...");}private static void outStaticFirst() {System.out.println("outStaticFirst...");}public void outSecond() {System.out.println("outSecond...");}//声明静态内部类static class InnerTest{private static int flag = 3;private static void innerFirst() {
//			outFirst();//调用非static方法是回报错outStaticFirst();//可以直接调用static方法System.out.println(flag +"...innerFirst..."+c);//只可以访问static类型的变量}}public static void main(String[] args) {StaticOutterTest.InnerTest.innerFirst();}
}

匿名内部类

顾名思义,匿名内部类就是没有名字的内部类,一般适用于swing处的控件监听、线程的开启、线程池的使用等。代码如下

/*** 匿名内部类* @author chaizepeng**/
public class AnonOutterTest {//开启一个线程public static void main(String[] args) {new Thread(new Runnable() {//只知道这个类实现了Runnable接口,但是叫什么不知道,这就是匿名的@Overridepublic void run() {System.out.println("-----------");}}).start();}
}

总结

内部类不知可以使得业务实现更优雅,更重要的是它使得类更容易扩展,是对java单继承机制的补充,每一个内部类都可以去继承和实现接口而不必在乎外部类是否已经继承了类,这使得扩展性进一步的提升。代码如下:

public class ExtendOutterTest extends Exception{private static final long serialVersionUID = 1L;//这个方法用于自定义异常public ExtendOutterTest() {System.out.println("字符错误,不能为0");}//用于开启线程//抛出异常public void run() throws ExtendOutterTest{Thread thread = new OneThreadInnerTest();thread.start();//这里也可以使用匿名内部类实现
//		new Thread(new Runnable() {
//			
//			@Override
//			public void run() {
//				System.out.println("就是这么任性,我还能开启一个线程...");
//				
//			}
//		}).start();int flag = 0;if (flag == 0) {throw new ExtendOutterTest();}}//内部类用于开启线程class OneThreadInnerTest extends Thread{@Overridepublic void run() {System.out.println("就是这么任性,我还能开启一个线程...");}}public static void main(String[] args) {ExtendOutterTest outterTest = new ExtendOutterTest();try {outterTest.run();} catch (ExtendOutterTest e) {System.out.println("我不但可以开启线程,还能捕捉异常");e.printStackTrace();}}
}

 

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

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

相关文章

Surging 微服务框架使用入门

前言本文非 Surging 官方教程,只是自己学习的总结。如有哪里不对,还望指正。 我对 surging 的看法我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架上搭建Socket RPC,通过分组轮询的方式调度RPC,经…

动态规划训练22 [Milking Time POJ - 3616 ]

Milking Time POJ - 3616 说实话这道题目非常简单,本质上就是 多段有向图的求最大值问题。稍微变化的地方在于这个的的有向边没有那么明显 ,而是需要自己去寻找 如果任务i到任务j之间存在有向边的话,那么一定有这个关系成立,即&a…

jzoj3888-正确答案【字符串hash,dfs】

正题 题目大意:https://jzoj.net/senior/#main/show/3888 题目大意 nnn个人mmm道题,已知道每个人的选项和有ppp个人满分和qqq个人零分,求字典序最小的可能的正确答案。 解题思路 用字符串hashhashhash判断即可。要注意的是如果没有一个人满分也没有一个…

9、java中的异常处理机制

Java中的异常(Throwable)分为两类:异常Execption和错误Error。 Error,也就是错误,这个是不可避免的,出现的问题使得应用停止,例如:服务器损坏、内存溢出等。在java中所有的错误都继承…

RabbitMQ教程C#版 - 工作队列

先决条件本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672)。如果你使用不同的主机、端口或证书,则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难,可以通过邮件列表联系我们。1.工作队列&…

动态规划训练23 [Making the Grade POJ - 3666 ]

Making the Grade POJ - 3666 这道题目有点意思。 我们定义dp[i][j]表示的含义是把包含前i个元素的子序列变成非递减的子序列,并且最后一个元素变成j所需要耗费的最小代价 那么状态转移方程可以写出来就是: dp[i][j] min(dp[i-1][k] abs(num[i] - j…

jzoj3889-序列问题【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/3889 题目大意 一个序列nnn&#xff0c;求两个集合S,T∈[1..n]S,T\in[1..n]S,T∈[1..n]使得ax(x∈S)a_x(x\in S)ax​(x∈S)的xorxorxor和就是ay(y∈T)a_y(y\in T)ay​(y∈T)的andandand和&#xff0c;且x<y(x∈S,y∈T)x…

10、java中文件的抽象表示

java中使用File类来作为文件和目录路径名的抽象表示&#xff0c;是对于文件或者目录本身的属性来说的&#xff0c;而不是针对于文件的内容。 一些关于File类基本操作的代码如下&#xff1a; public class FileTest {/*** 可用于操作文件或者目录* author chaizepeng** param a…

IdentityServer4实战 - 基于角色的权限控制及Claim详解

一.前言大家好&#xff0c;许久没有更新博客了&#xff0c;最近从重庆来到了成都&#xff0c;换了个工作环境&#xff0c;前面都比较忙没有什么时间&#xff0c;这次趁着清明假期有时间&#xff0c;又可以分享一些知识给大家。在QQ群里有许多人都问过IdentityServer4怎么用Role…

动态规划训练24 [Phalanx HDU - 2859 ]

Phalanx HDU - 2859 这是一道非常好的题目&#xff0c;我实在是没想到该怎么做&#xff0c;看了一下大神的题解才恍然大悟&#xff08;还有这种操作&#xff1f;&#xff09; 由于对称矩阵是以对称轴进行对称的&#xff08;废话&#xff09;&#xff0c;所以我们可以用dp[i][j…

jzoj3890-长途旅行【同余最短路】

正题 题目链接:https://jzoj.net/senior/#main/show/3890 题目大意 nnn个点mmm条边的图&#xff0c;询问是否有111到nnn长度为TTT的路径。 解题思路 让WWW等于连接111的最小权值的两倍&#xff0c;然后用fi,jf_{i,j}fi,j​表示到第iii个点是否有权值%Wj\%Wj%Wj。然后用fi,T%W…

11、java中的I/O流(1)

我对于流的理解是这样的&#xff0c;计算机的本质本来就是对输入的数据进行操作&#xff0c;然后将结果输出的一种工具&#xff0c;数据在各个数据源节点之间进行流动&#xff0c;感觉流就是对这种状态的一种抽象&#xff0c;一个数据流表示的就是一系列数据序列&#xff0c;ja…

nssl1436-赛艇表演【最短路】

正题 题目大意 nnn个点mmm条边的无向图&#xff0c;每个点有门票费&#xff0c;对于每个点求一个点使得去那里看完赛艇并回来消耗的时间最小。 解题思路 因为是无向图&#xff0c;所以去和回是同一条路&#xff0c;把每个点作为起点将门票费压入然后跑最短路。 codecodecode …

ASP.NET Core 集成测试

集成测试集成测试&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。实践表明&#xff0c;一些模块虽然能够单独地工作&#xff0c;但并不能保证…

12、java中的I/O流(2)

再介绍一下其他一些流的使用 数据操作流&#xff0c;数据输入流允许应用程序以独立于机器的方式从底层输入流读取原始Java数据类型&#xff0c;意思就是平台无关&#xff0c;相关的两个类DataInputStream、DataOutputStream&#xff0c;使用如下&#xff1a; public class Da…

nssl1437-逮虾户【二分答案】

正题 题目大意 nnn段路&#xff0c;每一段路速度是vidv_idvi​d&#xff0c;长度是sis_isi​&#xff0c;在ttt秒跑完了&#xff0c;求ddd的值。 解题思路 指数域二分&#xff0c;然后判断是否跑完即可。 codecodecode #include<cstdio> #include<cstring> #incl…

动态规划训练25 [Food Delivery ZOJ - 3469 ]好题

Food Delivery ZOJ - 3469 区间DP的一道好题。 在这道题里&#xff0c;无非就是从出发点向左走到x1再向右走到有y1&#xff0c;再向左走到x2&#xff0c;再向右走到y2.。。。这样&#xff0c;一直将所有的顾客遍历完。 显然&#xff0c;起点这个点是非常特殊的一个点&#xf…

使用C#开发Android应用之WebApp

近段时间了解了一下VS2017开发安卓应用的一些技术&#xff0c;特地把C#开发WebApp的一些过程记录下来&#xff0c;欢迎大家一起指教、讨论&#xff0c;废话少说&#xff0c;是时候开始表演真正的技术了。。1、新建空白Android应用2、拖一个WebView控件进来3、打开模拟器Genymot…

13、字符集和字符编码

字符集&#xff1a;字符集是多个字符的集合&#xff0c;常见字符集有&#xff1a;ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等。 ASCII字符集&#xff1a;是英文大小写字符、阿拉伯数字和西文符号的一个集合。&#xff08;可以看一下电脑键盘上的键&#xff0c…

nssl1438-战略威慑【枚举,树的直径】

正题 题目大意 nnn个点的无根树&#xff0c;求两条不相交的路径使它们长度之积最大。 解题思路 我们暴力枚举第一条&#xff0c;然后求树的直径即可。 codecodecode #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const i…