java 重载 参数子类_java - Java中带有子类参数的函数重载 - 堆栈内存溢出

在Java中,当一个方法具有子类类型的参数重载时,如果传递的是子类实例,原本期望调用更具体的方法。然而,在遇到异常处理时,使用`catch (Exception ex)`会默认调用基类Exception的处理方法,而非子类NewTypeException的重载方法。尽管这看起来不符合多态原则,但实际上这是Java的异常处理机制决定的。要解决此问题,需要显式地捕获子类异常,如`catch (NewTypeException ex)`,以调用正确的方法。
摘要由CSDN通过智能技术生成

这个问题已经在这里有了答案:

我有一个扩展了另一个类的类(在这种情况下,这是一个例外):

public class NewTypeException extends Exception {

private String exceptionField;

public String getExceptionField() {

return exceptionField;

}

public void setExceptionField(String exceptionField) {

this.exceptionField = exceptionField;

}

public NewTypeException(String cause, String reason) {

super(cause);

exceptionField = reason;

}

}

还有另一个类(为方便起见,我们称之为PrintUtil )具有两个具有相似签名的方法,唯一的区别是Exception类型更改为子类:

void doStuff(Exception ex) {

System.out.println(ex.getMessage());

}

void doStuff(NewTypeException ex) {

System.out.println("New Type Exception");

System.out.println(ex.getExceptionField());

System.out.println(ex.getMessage());

}

在我的代码的很多地方,我有一堆

try {

// code

} catch (Exception ex) {

printUtil.doStuff(ex);

}

添加此新的异常类型后,我想让此行根据参数调用最具体的方法。 但是,似乎在我测试此方法时,即使运行时类型适合其他方法(例如NewTypeException),也只会将方法用于Exception 。 除了替换数百个部分之外,是否有其他方法可以做到这一点

try {

// code

} catch (Exception ex) {

printUtil.doStuff(ex);

}

try {

// code

} catch (NewTypeException ex) {

printUtil.doStuff(ex);

} catch (Exception ex) {

printUtil.doStuff(ex);

}

? 这似乎是一种真正基本的OOP语言应该可以完成的工作...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java构造函数重载指的是在同一个类定义多个构造函数,它们的参数列表不同,可以有不同的参数类型、不同的参数个数或者参数顺序不同。这样做的目的是为了提供更灵活的对象创建方式,以满足不同的需求。 构造函数重载的语法格式与普通函数重载相同,只是函数名必须与类名相同。例如: ``` public class Person{ private String name; private int age; public Person(){ // 无参构造函数 } public Person(String name){ this.name = name; } public Person(int age){ this.age = age; } public Person(String name, int age){ this.name = name; this.age = age; } } ``` 在上面的代码,Person类定义了4个构造函数,它们的参数列表分别是无参、字符串类型、整型和字符串类型加整型。通过构造函数重载,我们可以根据不同的参数来创建不同的Person对象。例如: ``` Person person1 = new Person(); // 使用无参构造函数创建对象 Person person2 = new Person("张三"); // 使用字符串类型参数构造函数创建对象 Person person3 = new Person(18); // 使用整型参数构造函数创建对象 Person person4 = new Person("李四", 20); // 使用字符串类型和整型参数构造函数创建对象 ``` 注意,如果我们没有定义任何构造函数Java会默认提供一个无参构造函数。如果我们定义了任何一个构造函数Java就不会再提供默认的无参构造函数了。因此,如果我们需要使用无参构造函数来创建对象,就需要显式地定义一个无参构造函数。 构造函数重载可以帮助我们提供多种创建对象的方式,使得代码更加灵活和可扩展。同,构造函数重载也是面向对象编程的一种重要概念,需要我们理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值