如何判断类是否存在构造方法?以Animal与Mammal类为例
如何判断一个类是否拥有构造方法?
嘿,这个问题得拆开说——毕竟Java里的构造方法分显式定义和编译器自动生成的隐式构造两种情况,针对你提到的Animal和Mammal类,我给你一步步讲清楚:
先看你的代码示例
你写的 Animal a = new Mammal("Elephant"); 已经能说明一件事:Mammal类肯定有显式定义的构造方法。因为默认的隐式构造是无参的,你这里传了String参数,要是没显式写带String参数的构造,编译器直接就报错了。那Animal类呢?得看具体情况:
1. 直接看源代码(最省心的方式)
如果你能拿到类的源码,一眼就能判断:
- 要是类里写了类似
public Mammal(String name) { ... }或者Animal() { ... }这种代码,那就是有显式构造方法; - 要是完全没写任何构造方法,别以为它没有——编译器会自动给它加一个默认的无参构造方法,这也算有构造,只是是隐式的。
2. 用反射在运行时判断(适合拿不到源码的情况)
如果只有编译后的class文件,或者需要在代码里动态判断类的构造方法,用Java的反射API就可以搞定:
举个判断Animal和Mammal构造的例子:
import java.lang.reflect.Constructor; public class ConstructorChecker { public static void main(String[] args) { // 检查Mammal类的构造方法 Constructor<?>[] mammalConstructors = Mammal.class.getConstructors(); if (mammalConstructors.length > 0) { System.out.println("Mammal类有显式定义的构造方法:"); for (Constructor<?> c : mammalConstructors) { System.out.println(" - " + c); } } else { System.out.println("Mammal类没有显式构造,但编译器自动生成了默认无参构造"); } // 检查Animal类同理 Constructor<?>[] animalConstructors = Animal.class.getConstructors(); if (animalConstructors.length > 0) { System.out.println("Animal类有显式定义的构造方法:"); for (Constructor<?> c : animalConstructors) { System.out.println(" - " + c); } } else { System.out.println("Animal类没有显式构造,但编译器自动生成了默认无参构造"); } } }
小提醒:getConstructors()只能获取public的构造方法,如果要包括private、protected这些非public的,换成getDeclaredConstructors()就行。
再补充下你代码里的隐含逻辑
因为Mammal是Animal的子类,所以Mammal的构造方法里必须调用父类Animal的构造方法——要么显式写super()(或者带参数的super(xxx)),要么编译器自动帮你加super()。这意味着:
- 如果Animal只有显式的带参构造,那Mammal的构造方法必须显式调用
super(参数),否则编译会失败; - 如果Animal没有显式构造,那编译器生成的默认无参构造会被Mammal自动调用,这时候你的代码就能正常运行。
内容的提问来源于stack exchange,提问作者B.Rob
相关产品推荐
相关产品推荐

