Java程序开发学习之内部类与异常类

(学习参考书:Java2实用教程第5版)

一、内部类

Java支持在一个类中定义另一个类,这样的类称为内部类,而包含在内部的类称为内部类的外嵌类。内部类与外嵌类又如下的关系:

  • 外嵌类的成员变量在内部类中仍然有效,内部类的中的方法也可以调用外嵌类的方法
  • 内部类的类体中不可以声明类变量和类方法(static)。外嵌类可以用内部类声明对象,作为外嵌类的成员
  • 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象

Java编译器生成的内部类的字节码文件与通常类不同(类名.class),而是外嵌类名$内部类名.class
有且只有内部类可以被修饰为static类,且程序可以在其他类中使用static内部类创建对象。static内部类不可以操作外嵌类的实例成员变量。

二、匿名类

Java允许直接使用使用一个类的子类的类体创建一个子类对象。意思是除了使用父类的构造方法外还有类体可以创建子类对象。此类体被认为是一个子类去掉类声明的类体,称作匿名类。匿名类就是一个子类,由于无名可用,所以不可能使用匿名类声明对象,但是可以直接创建一个对象。下面是用匿名类创建对象:

new 父类名() {
    
    
	匿名类的类体
};

匿名类创建的对象只能用作上转型对象作为方法的参数传递以简化代码。

(1)匿名类的特点

  • 匿名类可以继承父类的方法,也可以重写父类的方法。
  • 使用匿名类时,必然是在某个类中直接使用匿名类创建对象,因此匿名类一定是内部类。
  • 匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和方法。
  • 由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时要直接使用父类的构造方法。

(2)匿名类的作用
用户想向方法传递子类类型的参数,则使用直接在方法的参数表中创建匿名类的对象。

(3)与接口有关的匿名类
Java还允许直接用接口名和一个类体创建一个匿名对象。此类体被认为是实现了接口的类去掉类声明的类体。类体必须重写接口中的全部方法。如下:

new 接口名() {
    
    
	实现接口的匿名类的类体
};

三、异常类

Java使用throw关键字抛出一个Exception子类的对象表示异常发生。

(1)try-catch语句
Java使用try-catch语句处理异常,将可能出现的异常操作放在try-catch语句的try部分,一旦try抛出异常对象或调用某个可能抛出异常对象的方法(并且该方法抛出了异常对象),那么try部分将立刻停止执行(跳出try语句块),然后执行catch部分。一个try-catch可以由几个catch组成。

try {
    
    
	可能发生异常的语句
}
catch(ExceptionSubClass1 e) {
    
    
	...
}
catch(ExceptionSubClass2 e) {
    
    
	...
}

(2)自定义异常类
在编写程序时可以拓展Exception类(系统的异常类)定义自己的异常类,然后根据程序的需要来规定哪些方法产生这些异常。一个方法在声明时可以使用throws关键字声明(方法声明 throws 自定义异常类名)要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致方法结束执行。程序必须在try-catch语句块中调用可能发生的异常的方法,其中catch的作用是捕获throw关键字抛出的异常对象。

throw:用在方法体中表示抛出异常
throws:用在自定义异常方法声明时表示这个方法会抛出异常。

四、断言

断言语句对代码调试阶段十分有效,一般用于程序不准备通过捕获异常来处理的错误。

(1)语法格式
使用关键字assert声明一条断言语句,有以下两种格式:

assert 返回值为boolean类型的表达式;

如果表达式返回值为true,程序继续执行,否则程序立刻停止执行。

assert 返回值为boolean类型的表达式:执行表达式;

如果boolean类型的表达式返回值为true,程序继续执行。如果返回值是false,程序从断言处停止执行,并输出执行表达式的值。

(2)启用和关闭断言语句

当使用Java解释器直接运行应用程序时,默认地关掉断言语句,在调试程序时,可以使用-ea启用断言语句:java -ea mainClass

猜你喜欢

转载自blog.csdn.net/YCF8746/article/details/112999025