内部类与异常类

本文详细介绍了Java中的内部类,包括其与外嵌类的关系、使用方式。接着讨论了匿名类的概念,展示了如何创建与父类或接口相关的匿名类实例。同时,讲解了异常处理的try-catch语句,自定义异常类的创建以及断言的使用。通过实例代码,帮助读者深入理解这些概念。
摘要由CSDN通过智能技术生成

写在前面:本文章来自于在学习过程中的总结,供大家参考。因水平有限,博客中难免会有不足,恳请大佬们不吝赐教!



内部类

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

  • 外嵌类的成员变量在内部类中仍然有效,内部类的方法可以调用外嵌类中的方法。
  • 内部类中不能声明类变量类方法,外嵌类中可以使用内部类声明的成员,作为外嵌类的成员。
  • 内部类仅限它的外嵌类使用,其他类不可以使用某个类的内部类声明对象。
class OuterClass{
    String name;
    InnerClass innerClass;//内部类声明对象
    OuterClass(){
        innerClass=new InnerClass();
        name="外部类";
    }
    void show(){//内部调用内部类的方法
        innerClass.speak();
    }
    class InnerClass{//内部类的声明
        void speak(){
            System.out.println("我是内部类( ̄▽ ̄)");
        }
    }
}
public class test{
    public static void main(String[] args) {
        OuterClass outerClass=new OuterClass();
        outerClass.show();
        outerClass.innerClass.speak();
    }
}

结果:

我是内部类( ̄▽ ̄)
我是内部类( ̄▽ ̄)

匿名类

和子类有关的匿名类

Java允许我们使用一个类的子类的类体船舰一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为时一个子类去掉类声明后的类体,称作匿名类
假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象。

new Bank(){
    //匿名类的类体
}

匿名类的特点:

  • 匿名类可以继承父类的方法也可以重写父类的方法。
  • 使用匿名类,必然是某个类中创建对象,所以匿名类一定是内部类。
  • 匿名类可以访问外嵌类的成员变量和方法,匿名类中不能声明类变量和类方法。
  • 由于匿名类是一个子类,但没有类名,所以匿名对象的引用可以传递给一个匹配的参数。
abstract class A{
    public abstract void speak();
}

class B extends A{
    @Override
    public void speak() {
        System.out.println("我是子类");
    }
}
class Show{
    void show(A a){
        a.speak();
    }
}

public class test{
    public static void main(String[] args) {
        B b=new B();
        Show show=new Show();
        show.show(b);
        show.show(new A()
        {
            @Override
            public void speak() {
                System.out.println("我是匿名类");
            }
        });
    }
}

结果:

我是子类
我是匿名类

和接口有关的匿名类

假设Computable是一个接口,那么Java允许直接用接口名和一个类体创建一个匿名对象。

new Computable(){
    //实现接口的匿名类的类体
}
interface SpeakHello{
    void speak();
}

class Show{
    public void show(SpeakHello hello){
        hello.speak();
    }
}

public class test{
    public static void main(String[] args) {
        Show show=new Show();
        show.show(new SpeakHello() {
            @Override
            public void speak() {
                System.out.println("第一个匿名类说:你好");
            }
        });
        show.show(new SpeakHello() {
            @Override
            public void speak() {
                System.out.println("第二个匿名类说:你好");
            }
        });
    }
}

结果:

第一个匿名类说:你好
第二个匿名类说:你好

异常类

try-catch语句

Java使用try-catch语句来处理异常,将可能发生异常操作放在tey部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分将停止,转而执行相应的catch部分。

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

}
catch(ExceptionSubClass1 e){

}
public class test {
    public static void main(String[] args) {
        try{
            int a[]=new int [2];
            System.out.println("NUM = "+a[3]);
        }
        catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }
    }
}

结果:

java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 2

自定义异常类

可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定那些方法产生的异常。一个方法在声明式可以使用throws关键字声明要产生的若干个异常。

//自定义异常类
class BankException extends Exception{
    String message;
    BankException(){
        message="发生银行异常";
    }
    public String warnMess(){
        return message;
    }
}

class Bank{
    private int money;
    public void income(int change)throws BankException{
        money+=change;
        if(money<0){
            throw new BankException();
        }
        System.out.println("余额:"+money);
    }

    public int getMoney() {
        return money;
    }
}

public class test{
    public static void main(String[] args) {
        Bank bank=new Bank();
        try{
            bank.income(100);
            bank.income(-200);
            bank.income(300);
        }
        catch(BankException e){
            System.out.println(e.message);
        }
    }
}

结果:

余额:100
发生银行异常

断言

当发生某个错误时,要求程序必须立即停止执行。

IDEA中开启断言的方法:

//断言
public class test{
    public static void main(String[] args) {
        int []score={-120,10,60,20,80};
        int sum=0;
        for(int num:score){
            assert num>=0:"负数不能是成绩";
            sum+=num;
        }
        System.out.println("总成绩:"+sum);
    }
}

结果:

Exception in thread "main" java.lang.AssertionError: 负数不能是成绩
    at abnormal.test.main(test.java:62)

由于水平有限,博客难免会有不足,恳请大佬们不吝赐教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值