Java基础-内部类与异常处理

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

一、Java 内部类

什么是内部类?

使用内部类的优点

访问局部变量的限制

内部类和继承

内部类中没有静态成员 

生成的内部类的类文件

静态上下文中的内类

二、Java 内部类类型

成员内部类

局部内部类 

匿名内部类

三、Java 异常处理

try-catch块

Java 异常类 

异常类层次结构

使用多个catch块


一、Java 内部类

什么是内部类?

作为包的成员的类被称为顶级类。

一个类可以在另一个类中声明。这种类型的类称为内部类。

如果在另一个类中声明的类被显式或隐式声明为static,它被称为嵌套类,而不是内部类。

包含内部类的类称为封闭类或外部类。

下面的代码声明一个内部类。

class Outer {public class Inner {// Members of the Inner class go here}// Other members of the Outer class go here
}

Outer类是一个顶级类。

Inner类是一个内部类。它是外类的成员。

外层类是Inner类的封闭(外部)类。

内部类可以是另一个内部类的封闭类。内部类的嵌套层次没有限制。

内部类的实例只能存在于其封闭类的实例中。

使用内部类的优点

以下是内部类的一些优点。

  • 在将使用它们的其他类附近定义类。

  • 提供了一个额外的命名空间来管理类结构。

  • 一些设计模式使用内部类更容易实现。

  • 实现回调机制使用内部类是优雅和方便的。它有助于在Java中实现闭包。

访问局部变量的限制

下面的代码演示了访问局部内部类中的局部变量的规则。

main()方法声明两个局部变量x和y。这两个变量都是最终的。

变量x在被初始化之后从不改变,变量y不能被改变,因为它被声明为final。

public class Main {public static void main(String... args) {int x = 1;final int y = 2;class LocalInner {void print() {System.out.println("x = " + x);System.out.println("y = " + y);}}/** Uncomment the following statement will make the variable x no longer* an effectively final variable and the LocalIneer class will not compile.*/// x = 100;LocalInner li = new LocalInner();li.print();}
}

上面的代码生成以下结果

内部类和继承

内部类可以继承另一个内部类,顶级类或其封闭类。

class A {public class B {}public class C extends B {}public class D extends A {}
}class E extends A {public class F extends B {}
}

内部类中没有静态成员 

Java中的关键字static使一个构造成为一个顶层结构。

因此,我们不能为内部类声明任何静态成员(字段,方法或初始化器)。

允许在内部类中有作为编译时常量的静态字段。

class A {public class B {public final static int DAYS_IN_A_WEEK = 7; // OKpublic final String str = new String("Hello");}
}

生成的内部类的类文件

每个内部类都被编译成一个单独的类文件。

成员内部类和静态内部类的类文件名格式如下:

<outer-class-name>$<member-or-static-inner-class-name>

局部内部类的类文件名的格式如下:

<outer-class-name>$<a-number><local-inner-class-name>

匿名类的类文件名的格式如下:

<outer-class-name>$<a-number>

类文件名中的<a-number>是从1开始顺序生成的数字,以避免任何名称冲突。

静态上下文中的内类

class Outer {static int k = 1;int m = 2;public static void staticMethod() {// Class Inner is defined in a static contextclass Inner {int j = k; // OK. Referencing static field k// int n = m; // An error. Referencing non-static field m}}
}

二、Java 内部类类型

您可以在类中的任何位置定义内部类,您可以在其中编写Java语句。

有三种类型的内部类。内部类的类型取决于位置和声明的方式。

  • 成员内部类

  • 局部内部类

  • 匿名内部类

成员内部类

成员内部类在类中声明的方式与声明成员字段或成员方法相同。

它可以声明为public,private,protected或package-level。

成员内部类的实例可以仅存在于其封闭类的实例内。

以下代码创建了一个成员内部类。

class Car {private int year;// A member inner class named Tire publicclass Tire {private double radius;public Tire(double radius) {this.radius = radius;}public double getRadius() {return radius;}} // Member inner class declaration ends here// A constructor for the Car classpublic Car(int year) {this.year = year;}public int getYear() {return year;}
}

局部内部类 

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

class People{public People() {}
}class Man{public Man(){}public People getWoman(){class Woman extends People{   //局部内部类int age =0;}return new Woman();}
}

匿名内部类

匿名内部类没有名称。因为它没有名称,它不能有一个构造函数。

匿名类是一次性类。您定义一个匿名类并同时创建它的对象。

创建匿名类及其对象的一般语法如下:

new Superclass(<argument-list-for-a-superclass-constructor>)  {
// Anonymous  class body  goes  here
}
new Interface()  {
// Anonymous  class body  goes  here
}

它后面是现有的接口名称或现有的类名称。

接口名称或类名称不是新创建的匿名类的名称。

如果使用接口名称,则匿名类实现接口。

如果使用类名,则匿名类继承自类。

仅当新运算符后面跟有类名时,才使用<argument-list>。如果新运算符后跟接口名称,则它为空。

如果<argument-list>存在,它包含要调用的现有类的构造函数的实际参数列表。

匿名类主体像往常一样在大括号中。

匿名类主体应该简短,以便更好的可读性。

下面的代码包含一个简单的匿名类,它在标准输出上打印一条消息。

public class Main {public static void main(String[] args) {new Object() {// An instance initializer{System.out.println("Hello from  an  anonymous class.");}}; // A semi-colon is necessary to end the statement}
}

上面的代码生成以下结果

三、Java 异常处理

异常是在没有定义正常执行路径时在Java程序的执行期间可能出现的条件。

Java通过将执行操作的代码与处理错误的代码分离来处理错误。

当发生异常时,Java会创建一个包含有关异常的所有信息的对象,并将其传递给相应的异常处理代码。

有关异常的信息包括异常的类型,发生异常的代码中的行号等。

try-catch块

要处理异常,请将代码放在try块中。try块如下所示:

try  {// Code for the try block
}

try块以关键字try开头,后面是开括号和结束括号。

try块的代码放在开口和关闭大括号内。

try块本身不能使用。

它必须后跟一个或多个catch块,或一个finally块,或两者的组合。

要处理可能在try块中抛出的异常,请使用catch块。

一个catch块可用于处理多种类型的异常。

catch块的语法与方法的语法相似。

catch (ExceptionClassName parameterName)   {// Exception handling  code
}

catch块的声明就像一个方法声明。

它从关键字catch开始,后面跟一对括号。

在括号中,它声明了一个参数。

参数类型是应该捕获的异常类的名称。

parameterName是用户给定的名称。括号后面是开口括号和结束括号。异常处理代码放在大括号中。

当抛出异常时,异常对象的引用将复制到parameterName。

我们可以使用parameterName从异常对象中获取信息。

我们可以将一个或多个catch块与try块关联。

try-catch块的一般语法如下。

try  {// Your code  that may throw  an  exception
}
catch  (ExceptionClass1 e1){// Handle  exception of  ExceptionClass1 type
}
catch  (ExceptionClass2 e2){// Handle  exception of  ExceptionClass2 type
}
catch  (ExceptionClass3 e3){// Handle  exception of  ExceptionClass3 type
}

 例子

下面的代码显示了如何处理除零异常。

public class Main {public static void main(String[] args) {int x = 10, y = 0, z;try {z = x / y;System.out.println("z = " + z);} catch (ArithmeticException e) {String msg = e.getMessage();System.out.println("The error is: " + msg);}System.out.println("The end.");}
}

上面的代码生成以下结果

Java 异常类 

异常类层次结构

异常类层次结构从java.lang.Throwable类开始。

当抛出异常时,它必须是Throwable类的对象或其任何子类。

catch块的参数必须是Throwable类型,或其子类之一,例如Exception,ArithmeticException,IOException等。

我们可以通过从一个异常类继承我们的类来创建我们自己的异常类。

使用多个catch块

Java运行时选择适当的catch块,并从第一个catch块开始顺序寻找合适的catch时钟。

try块的多个catch块必须从最具体的异常类型排列为最通用的异常类型。

以下代码使用多个catch块的有效序列。

ArithmeticException类是RuntimeException类的子类。

如果这两个异常都在同一个try块的catch块中处理,那么最具体的类型,即ArithmeticException,必须出现在最通用的类型之前,即RuntimeException。

try  {
// Do  something, which  might  throw  Exception
}
catch(ArithmeticException e1)  {
// Handle  ArithmeticException first
}
catch(RuntimeException e2)  {
// Handle  RuntimeException after  ArithmeticException
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HCIP—MSTP(多生成树协议)

目录 一、MSTP技术的背景 二 、MSTP&#xff08;多生成树协议&#xff09;的概述 三、MSTP的基本概念 四、MSTP的实验配置 MSTP的引入&#xff1a;单点故障——冗余——二层环路——STP——RSTP——MSTP 一、MSTP技术的背景 单生成树的弊端—部分VLAN路径不同 单生成树的弊…

光控资本:中字头,多股涨停!融资客大举加仓

11月13日&#xff0c;受昨夜外盘心境影响&#xff0c;A股三大指数集体低开&#xff0c;沪指盘中翻红&#xff0c;A50期货指数快速拉升。 当时A股心境并未降温&#xff0c;代表商场急进心境的融资余额数据继续攀升&#xff0c;现在仅次于2015年牛市高点。‍‍‍ 从近期的盘面来…

项目功能--项目介绍(健康管理系统)

一、项目介绍 健康管理系统是一款应用于健康管理机构的业务系统&#xff0c;实现健康管理机构工作内容可视化、会员管理专业化、健康评估数字化、健康干预流程化、知识库集成化&#xff0c;从而提高健康管理师的工作效率&#xff0c;加强与会员间的互动&#xff0c;增强管理者对…

【深度学习目标检测|YOLO算法4-4】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域

【深度学习目标检测|YOLO算法4-4】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域 【深度学习目标检测|YOLO算法4-4】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域 文章目录…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发&#xff0c;将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

【数据运营】数据治理与运营新纪元:全面解析数据治理平台与运营体系建设方案

踏入数据治理与运营的新纪元,我们迎来了一场深刻变革。本篇文章将带您全面解析数据治理平台与数据运营体系的建设方案,为您揭示数据治理的总体解决策略,探索数据治理平台构建的奥秘,以及数据治理运营实施的具体路径。 数据治理总体解决方案是数据治理与运营体系建设…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后,下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后,打开点击右键,打开 2.下一步

【无人机设计与控制】线性和非线性模型预测MPC、NMPC四旋翼无人机轨迹跟踪

摘要 本文研究了四旋翼无人机的线性和非线性模型预测控制&#xff08;MPC与NMPC&#xff09;算法在轨迹跟踪中的应用。通过Matlab/Simulink仿真实现了四旋翼无人机在复杂环境中的高效轨迹跟踪。研究结果表明&#xff0c;NMPC比传统MPC在处理非线性动态和外部扰动时具有更好的鲁…

如何用Java爬虫“偷窥”淘宝商品类目API的返回值

在这个数据为王的时代&#xff0c;获取信息就像是在玩一场大型的寻宝游戏。而淘宝&#xff0c;作为电商界的巨人&#xff0c;其商品类目API就像是藏宝图上的秘密标记。今天&#xff0c;我们就来聊聊如何用Java爬虫技术&#xff0c;悄悄地“偷窥”这些宝藏。 准备工作&#xff1…

2024最新网络安全自学路线,内容涵盖3-5年技能提升

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

模拟实现优先级队列

目录 定义 特点 构造函数 常用方法 关于扩容的问题 关于建堆的问题 向上调整和向下调整的比较 &#xff08;向上调整&#xff09;代码 &#xff08;向下调整&#xff09;代码 关于入队列和出队列问题 模拟实现优先级队列代码 关于堆排序的问题 堆排序代码 关于对…

Django 搭建数据管理web——商品管理

教材&#xff1a; python web 企业级项目开发教程 黑马程序员 5.4 实例1&#xff1a;商品管理 实验步骤&#xff1a; 1.创建项目&#xff08;任意名字&#xff09;和应用&#xff08;goods&#xff09; 2.在项目文件夹&#xff08;manage.py文件所在路径&#xff09;新建te…

C语言中操作符详解(中)

C语言中操作符详解中 放在最前面的1、操作数&#xff08;Operands&#xff09;2、单目操作符2.1、分类2.2、举例分析&#xff08;上代码&#xff09; 3、关系操作符3.1、分类3.2、举例分析&#xff08;上代码&#xff09; 4、逻辑操作符4.1、分类4.2、举例分析&#xff08;上代…

生成模型——扩散模型(Diffusion Model)

一、扩散模型简介 扩散模型&#xff08;Diffusion Model&#xff09;是一种生成模型&#xff0c;主要用于图像生成等任务。它的基本原理源于扩散过程的物理概念&#xff0c;通过最小化去噪过程中的重建损失&#xff08;通常使用均方误差&#xff09;来训练模型&#x…

ssm101珠宝首饰交易平台开发+jsp.zip(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 珠宝首饰交易平台 学 院 专 业 班 级 学 号 用户姓名 指导教师 完成日期 …

关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数

文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 内存函数是用于 操作内存块的一组函数&#xff0c;它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在 <str…

Redis高可用-主从复制

这里写目录标题 Redis主从复制主从复制过程环境搭建从节点配置常见问题主从模式缺点 Redis主从复制 虽然 Redis 可以实现单机的数据持久化&#xff0c;但无论是 RDB 也好或者 AOF 也好&#xff0c;都解决不了单点宕机问题&#xff0c;即一旦 redis 服务器本身出现系统故障、硬…

NVR设备ONVIF接入平台EasyCVR视频融合平台社会面视频资源接入视频专网,应该如何处理?

在数字化时代&#xff0c;视频监控系统已成为社会安全管理的重要组成部分。随着城市化进程的加速和信息技术的发展&#xff0c;如何有效整合和管理跨区域、跨行业的视频监控资源&#xff0c;成为了提升社会治理能力的关键。 EasyCVR视频融合云平台&#xff0c;作为TSINGSEE青犀…

通过全球最前沿的技术解决视频拼接中时延带来的的应用缺陷,使得全景视频拼接能够真正得以大范围使用和推广的智慧地产开源了。

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过计算机视觉和…

推荐一款好用的postman替代工具2024

Apifox 是国内团队自主研发的 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;是非常好的一款 postman 替代工具。 它通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好接口文档&#xff0c;接口调试、数据 Mock、接口…