getDeclaredMethods方法为什么会拿到父类的方法?

问题描述

spublic Method[] getDeclaredMethods() throws SecurityException返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。 下面一段代码在Sausage 写了两个方法,其中一个是重写了父类的getIngredient() 方法。Sausage.class.getDeclaredMethods()却返回了三个方法,包括两个getIngredient() 和他自己的showDescription()方法,请问这是为什么?为什么会拿到了父类的方法?import java.util.*;import java.lang.reflect.*;class Food{ private Object ingredient; public Object getIngredient(){ return ingredient; } public void showDescription(){ }}class Sausage extends Food{ private ArrayList ingredient; public ArrayList getIngredient(){ return ingredient; } public void showDescription(){ System.out.println("I'm very delicious!"); }}class Test{ public static void main(String[] args) throws Exception{ Method[] ms = Sausage.class.getDeclaredMethods(); System.out.println(ms.length); }}

解决方案

本身子类已经继承了父类的getingredient方法返回的是objec,而子类中又定义了一个返回ArrayList的getingredient方法,如果你调用子类的getingredient方法,它应该执行哪个方法?所以实际上市一个类中两个重名的方法,这样getdeclaredMethods返会两个getingredient就不奇怪了。否者定义的时候就会出错。
解决方案二:
你看看什么叫重写,返回类型是不能变得!!!

时间: 2024-08-20 12:01:57

getDeclaredMethods方法为什么会拿到父类的方法?的相关文章

子类方法返回类型必须和父类相同,抛出的异常声明可以小于或等于父类

Overload译为重载:Override译为重写或者覆盖:  Overload讨论: Java中同一个类不可以有两个相同的方法(方法名.参数类型.参数个数和参数位置都  相同).但可以有方法名相同,参数不同(参数类型.参数个数和参数位置不相同)的方法.这  种相同的方法名,参数不同的方法称为重载. public class Test { public void fn(String name) {} public void fn(int age) {} public void fn(String

多态-java中为什么会自动执行子类重写父类的方法?

问题描述 java中为什么会自动执行子类重写父类的方法? 问题: 1.在main方法中我没有调用paint方法,为什么它会自动被调用? 2.老师说这是多态,可是多态不是需要三个条件实现么?继承,重写方法,父类引用指向子类对象,这里没有第三点啊 代码如下: public class GameFrame extends Frame{ public void launchFrame(){ setSize(500,500); setLocation(100,100); setVisible(true);

解决重写父类的方法且不会影响继承的子类的问题

解决重写父类的方法且不会影响继承的子类的问题 基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口. 但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:) 首先做几个实验验证: 提供的源码如下: A类  B类  C类  (B类继承于A类,C类继承于B类) // // A.h // Super // // Copyrig

super-为什么子类重写父类方法之后还要调用父类同名方法

问题描述 为什么子类重写父类方法之后还要调用父类同名方法 为什么子类重写父类方法之后还要调用父类同名方法 比如public class A extends B { public void say ( ) { super.say ( ); } 为什么重写父类方法之后还要在方法体里面用super关键词调用父类的同名方法呢 解决方案 你可以不调用,这个你自定,不是必须 解决方案二: SubClasing用法--子类重写父类方法,父类直接调用实现方式子类调用父类方法子类调用父类方法 解决方案三: 我想到

重写-JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法?

问题描述 JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? 解决方案 使用super.methodName();调用. Java中super关键字指代的是父类. this关键字指代的是自身. 解决方案二: 用super.方法名调用 解决方案三: 试试super.xxx 解决方案四: 直接用super.方法名调用对应的方法

java-JAVA子类不能继承父类私有方法是么

问题描述 JAVA子类不能继承父类私有方法是么 父类都不能用他本身的私有方法,子类岂不是更不能用了,这一点是怎么证明的?举个例子 解决方案 父类本身的私有方法是可以被自己的其他方法调用的,但是这些私有方法子类是不能调用的,但是可能被间接调用. 例如下面的例子,父类的私有方法被一个公有方法调用了,那么子类继承这个公有方法后也就间接调用了父类的私有方法了.但是子类可直接访问的方法里却没有这个私有方法的. public class Parent { public void say(){ call();

关于spring子类实现父类protected方法导致实例化出错的问题

问题描述 关于spring子类实现父类protected方法导致实例化出错的问题 子类实现的抽象方法中引用子类自身的public方法(详细请参看测试Demo),导致报错 父类AbstractBusiness为抽象类 public abstract class AbstractBusiness { public void execute(){ check(); doBusiness(); } protected abstract void check(); protected abstract v

继承-java 子类构造函数要用到父类的方法判断成功后再构造,但这样的话super()不是第一句就报错

问题描述 java 子类构造函数要用到父类的方法判断成功后再构造,但这样的话super()不是第一句就报错 父类是点,里面有方法判断是不是同一个点,子类是直线,我在子类直线构造时要判断两个点是否相等,因此调用父类的方法,但是这样下面先构造父类super()就不对,该怎么解决呢? 谢谢解答. 解决方案 首先,你的父类是不是有有参构造函数呢?如果有的话,子类构造函数的第一句就必须是super(参数)调用父类的构造函数. 其次,父类有有参数构造函数,第一句就先super(参数),然后再调用父类的方法.

PHP中子类重载父类的方法【parent::方法名】_php实例

在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写. 子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承过来不就可以直接使用吗?为什么还要重载呢?因为有一些情况我们必须要覆盖的.例如,有一个"鸟"类,在这个类中定义了鸟的通用方法"飞翔".将"鸵鸟"类作为它的子类,