首页 > java父子类之间是否存在重载的现象?

java父子类之间是否存在重载的现象?

java的父子类之间是否存在重载呢?

public class A
{
    public void a(int x){}
}

public class B extends A
{
    public void a(Object x){}
}

public class Main
{
    public static void main(String args[])
       {
           B b = new B() ;
           b.a(2) ;
           b.a(new Object()) ;
       }
}

如果不存在那么对于A和B中的a方法怎么解释呢?


我现在也有点乱了, 大家的观点都不一样...但是大家的意思是这肯定不是父子类之间的重载, 而且有提到覆盖. 我之间学习的过程中, 一直把重载就当作覆盖来看, 但是看样子我的理解是错的, 那么什么是覆盖呢?


就是重载啊,java继承机制里,子类会开辟空间用来保存继承的父类成员,因为继承过来就和父类不是同一个了。例如B类里的a(int x)方法是和父类不一样的,可以在父类这个方法里打印一下当前类名,当子类调用时显示的会是子类名。


父类的方法在子类中因为有在子类中有重名而不可见,但是父类这个方法仍然存在的,当你使用b对象调用a方法时,它会首先从B类中调用,当B类中不存在对应参数的a方法时,才会想父类查找调用。

你可以试试下面这段代码(会报错),应该有助于你理解重载和覆盖

class B extends A
{
    @Override
    public void a(Object x){
        System.out.println(x);
    }
}

重载只发生在同一类中,你这个即不属于重载,也不属于重写,因为方法名和方法参数确定一个方法。a(int x)a(Object o)属于两个方法,所以子类B继承了父类Aa(int x)方法。


关于前两位的回答有以下说明和补充:
1.首先这不叫覆盖(Override)。类B继承了类A的方法a,且类B定义了一个新的方法a,两个方法参数不同,所以是两个不同的方法。
2.是否是重载(Overload)仍存在争论。
观点一:是重载,是发生在同一类中的重载。
【继承来的属性和方法尽管是隐式的,但仍是类B的属性和方法。】所以类B有两个方法,包括继承自a的方法,属于重载。
观点二:不是重载,重载只发生在同一类中,而类B继承类A方法的途径是通过查找调用(如上)。
、、、话说还有觉得是跨类重载的、、、但是这个和定义矛盾哈、、、

综上,此问题争议较多,个人比较倾向于观点一,【】内容来自baidu,下面是运行结果及代码。

关于覆盖和重载的区别:
1.覆盖,又称重写(Override)。发生在子类与父类之间。
子类是可以继承父类的某些方法的,当父类的方法对子类不适用时,需要在子类中写一个和父类一样的方法(当然方法内的程序块是不一样的),此处“一样”指方法名必须一样、返回值类型互相兼容、参数个数顺序类型必须一致等等。此时如果子类要用这一方法,就会直接调用覆盖过的方法,而当没有检测到重写时,才会调用从父类继承下来的方法。
举我学习时的例子:

因为不同动物的叫声和食物都不同,所以要将父类中的方法覆盖掉。

2.重载(Overload)。一般发生在同一类的不同方法间。
重载要求两个方法返回类型一样,方法名一样,参数列表不一样(类型、顺序、个数等)。
这样两个方法间互为不同的方法,调用哪一个时由参数决定。
举例:
class A{
void a(int i, float j){}
void a(float i, int j){}//两个方法接收的参数类型顺序不同,所以是两个不同的方法
}
class B{
void b(int i){}
void b(){}//参数个数不同,第二个方法无参数
}
class C{
void c(int i){}
void c(float i){}//参数类型不同
}


覆盖了,你可以在父类中用关键字指明权重

【热门文章】
【热门文章】