覆盖的规则是:
(1)参数必须要一样,且返回类型必须要兼容;
(2)不能降低方法的存取权限。
方法重载的规则:
(1)返回类型可以不同;
(2)不能只改变返回类型;
如果只有返回类型不同,但参数一样,这是不允许的。
(3)可以更改存取权限。
下面的例子是关于覆盖的,需要注意的是A a2=new C()这个语句。A a2这个部分是声明一个引用变量a2;new C()是创建一个C类的对象;
A a2=new C();就是将新的C赋值给a2这个引用变量。
关于这个C类,它的继承自B,B继承自A,所以C类继承了A和B拥有的变量和方法,当C中出现了B或者A中同名方法时,会覆盖掉B或者A中的方法。具体分析:(1)a2.m1();由于C类中没有m1这个方法,于是编译器就去查看它的父类B,发现B中有m1这个方法,于是执行该方法。(2)a2.m2();由于C类中没有m2这个方法,于是编译器就去查看它的父类B,发现B中也没有m2这个方法,于是编译器去查找B的父类方法A,发现A中有m2这个方法,于是执行该方法。(3)a2.m3();由于C类中有m3这个方法,于是编译器就直接执行C类中的这个m3方法。
package com.util.extend;
public class ExtendExamp
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
C c = new C();
A a2 = new C();
a2.m1();
a2.m2();
a2.m3();
}
}
class A
{
int var=7;
void m1()
{
System.out.println("A'S m1, ");
}
void m2()
{
System.out.println("A'S m2, ");
}
void m3()
{
System.out.println("A'S m3, ");
}
}
class B extends A
{
void m1()
{
System.out.println("B's m1, ");
}
}
class C extends B
{
void m3()
{
System.out.println("C's m3, "+(var+6));
}
}