内部类与异常类

it2026-04-01  8

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


文章目录

内部类匿名类和子类有关的匿名类和接口有关的匿名类 异常类try-catch语句自定义异常类 断言


内部类

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)