java学习笔记——09内部类与异常类

一、内部类

1.基本介绍

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套其他类的类称为外部类。是我们类的第五大成员【思考:类的五大成员是哪些?属性,方法,构造器,代码块,内部类】,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系

2.基本语法

class Outer{ //外部类
class Inner{
//内部类
}
}
class Other{//外部其他类

}

3.内部类的分类
  1. 定义在外部类局部位置上(比如方法内):

    1)局部内部类(有类名)

    2)匿名内部类(没有类名)

  2. 定义在外部类的成员位置上:

    1)成员内部类(没用static修饰)

    2)静态内部类(使用static修饰)

4.局部内部类的使用

局部内部类是定义在外部类的局部位置,比如方法中,并且有类名.

  1. 可以直接访问外部类的所有成员,包含私有的

  2. 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final

  3. 作用域:仅仅在定义它的方法或代码块中。

  4. 局部内部类—访问---->外部类的成员[访问方式:直接访问]

  5. 外部类—访问---->局部内部类的成员
    访问方式:创建对象,再访问(注意:必须在作用域内)

  6. 外部其他类—不能访问----->局部内部类(因为局部内部类地位是一个局部变量)

  7. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

5.匿名内部类的使用

匿名内部类:
(1)本质是类
(2)内部类
(3)该类没有名字
(4)同时还是一个对象
说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

  1. 匿名内部类的基本语法
    new 类或接口(参数列表){
    类体
    };

  2. 匿名内部类的语法比较奇特。因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,因此可以调用匿名内部类方法。

  3. 可以直接访问外部类的所有成员,包含私有的

  4. 不能添加访问修饰符,因为它的地位就是一个局部变量。

  5. 作用域:仅仅在定义它的方法或代码块中。

  6. 匿名内部类可以直接访问外部类成员

  7. 外部其他类不能访问匿名内部类(因为匿名内部类地位是一个局部变量)

  8. 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

  9. 可以用Lambda表达式代替内部类

5.成员内部类的使用

成员内部类是定义在外部类的成员位置,并且没有static修饰。

  1. 可以直接访问外部类的所有成员,包含私有的

  2. 可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员。

  3. 作用域和外部类的其他成员一样,为整个类体在外部类的成员方法中创建成员内部类对象,再调用方法.

  4. 成员内部类可以直接访问外部类成员(比如:属性)

  5. 外部类也可以访问成员内部类
    访问方式:创建对象,再访问

  6. 外部其他类也能访问成员内部类

  7. 如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

6.静态内部类的使用

静态内部类是定义在外部类的成员位置,并且有static修饰

  1. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员

  2. 可以添加任意访问修饰符(public,protected,默认,private),因为它的地位就是一个成员

  3. 作用域:同其他的成员,为整个类体

  4. 静态内部类可以直接访问外部类所有静态成员,不能访问外部类的实例成员变量

  5. 外部类可以访问静态内部类 访问方式:创建对象,再访问

  6. 外部其他类可以访问静态内部类

  7. 如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近
    原则,如果想访问外部类的成员,则可以使用((外部类名.成员)去访问

二、异常类

异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。
Java使用throw关键字抛出一个Exception子类的实例表示异常发生。Java允许在定义方法时声明该方法调用过程中可能出现的异常,即允许方法在调用过程抛出异常对象,终止当前方法的继续执行。
异常对象可以调用如下方法得到或输出有关异常的信息:

public String getMessage();
public void printStackTrace();
public String toString();
1.try-catch语句
  • Java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try 部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分将立刻结束执行,转向执行相应的catch部分,所以程序可以将发生后的处理放在catch部分。try-calch语句可以由几个catch组成,分别处理发生的相应异常。
  • try-catch语句的格式如下:
    try {
    包含可能发生异常的语句
    }
    catch(ExceptionSubClass1 e){
    ···
    }
    catch(ExceptionSubClass2 e){
    ···
    }
    各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常这些子类之间如果有父子关系,那么catch参数是子类在catch参数是父类的前面
public class Example {
   public static void main(String args[ ]) {
      int n = 0,m = 0,t = 1000;
      try{  m = Integer.parseInt("8888");
            n = Integer.parseInt("ab89"); //发生异常转向catch
            t = 7777;  //t没有机会被赋值
      }
      catch(NumberFormatException e) {
            System.out.println("发生异常:"+e.getMessage());
      }
      System.out.println("n="+n+",m="+m+",t="+t);
      try{  System.out.println("故意抛出I/O异常");
            throw new java.io.IOException("我是故意的");
            //System.out.println("这个输出语句肯定没有机会执行,必须注释,否则编译出错");
      }
      catch(java.io.IOException e) {
            System.out.println("发生异常:"+e.getMessage());
      }
   }
}

  • 带finally子语句的try-catch语句,语法格式如下:
    try{}
    catch(ExceptionSubClass e){}
    finally{}
    其执行机制是在执行try-catch语句后执行finally子语句,也就是说,无论在try部分是否发生过异常,finally子语句都会被执行。
    · 需要注意以下两种特殊情况:
    (1)如果在try-catch语句中执行了return语句,那么finally子语句仍然会被执行。
    (2)如果在try-catch语句中执行了程序退出代码,即执行了“System,exit(0);”,则不执行finally子语句(当然包括其后的所有语句)。
2.自定义异常类

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

三、断言

断言语句在调试代码阶段非常有用,断言语句一般用于程序不准备通过捕获异常来处理的错误,例如,当发生某个错误时要求程序必须立即停止执行。在调试代码阶段让断言语句挥作用,这样就可以发现一些致命的错误,当程序正式运行时就可以关闭断言语句,但仍把断言语句保留在源代码中,如果以后应用程序又需要调试,可以重新启用断言语句。

1.断言语句的语法格式

使用关键字assert声明一个断言语句,断言语句有以下两种格式:

assert booleanExpression;
assert booleanExpression:messageException;
  • 例如,对于断言语句:
assert number>=0
//如果表达式number>=0的值为true.程序继续执行,否则程序立刻结束执行。

在上述断言语句的语法格式中,booleanExpression必须是值为boolean型的表达式messageException可以是值为字符串的表达式。

  • 如果使用
assert booleanExpression;

形式的断言语句,当booleanExpression的值是true时,程序从断言语句处继续执行;当值是false,程序从断言语句处停止执行。

  • 如果使用
assert booleanExpression:messageException;

形式的断言语句,当booleanExpression的值是true时,程序从断言语句处继续执行;当值是false时,程序从断言语句处停止执行,并输出messageException表达式的值,提示用户出现了怎样的问题。

2.启用与关闭断言语句

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

java -ea mainClass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值