代码
如果子类重写了父类的方法,通过子类对象调用该方法时,调用的方法就是被覆写过的方法!
子类重写的方法的权限修饰符 不小于
父类被重写的方法的权限修饰符
class Untitled {
public void eat(){
System.out.println("父类的方法");
}
public static void main(String[] args) {
Untitled11 t = new Untitled11();
t.eat();
}
}
class Untitled11 extends Untitled{
//报错:eat() in Untitled11 cannot override eat() in Untitled
// void eat(){
// System.out.println("子类的方法");
// }
}
修改后如下,输出 “ 子类的方法 ”
class Untitled {
public void eat(){
System.out.println("父类的方法");
}
public void m(){
System.out.println("父类的m");
eat();
}
public static void main(String[] args) {
//子类的对象
Untitled11 t = new Untitled11();
t.m(); //父类的m 子类的方法
}
}
class Untitled11 extends Untitled{
public void eat(){
System.out.println("子类的方法");
}
}
特殊情况:子类不能重写父类中private
修饰的方法
class Untitled {
private void eat(){
System.out.println("父类的方法");
}
public void m(){
System.out.println("父类的m");
eat();
}
public static void main(String[] args) {
Untitled t = new Untitled11();
t.m(); //父类的m 父类的方法
}
}
class Untitled11 extends Untitled{
public void eat(){
System.out.println("子类的方法");
}
}
子父类中的方法要么都是static
的(不是重写),要么都是非static
的(可以重写)
以下是父类中方法加了static
修饰,子类没有,此时编译报错
error: eat() in Untitled11 cannot override eat() in Untitled
class Untitled {
// public static void eat(){
// System.out.println("父类的方法");
// }
public void m(){
System.out.println("父类的m");
eat();
}
public static void main(String[] args) {
//子类的对象
Untitled11 t = new Untitled11();
t.m();
}
}
class Untitled11 extends Untitled{
public void eat(){
System.out.println("子类的方法");
}
}
假如子父类中的方法要么都是static
的,代码如下
class Untitled {
public static void eat(){
System.out.println("父类");
}
public static void main(String[] args) {
Untitled t1 = new B();
t1.eat(); //父类
Untitled t2 = new Untitled();
t2.eat(); //父类
B t3 = new B();
t3.eat(); //子类
}
}
class B extends Untitled{
public static void eat(){
System.out.println("子类");
}
}
可见调用的是变量t1
所声明类型Untitled
中的方法,并不是t1
运行时所引用对象的实际类型B
中的方法
小结
重写,是通过子类对象调用父子类同名同参数的方法,实际执行的是子类重写的方法
方法声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{ //方法体 }
① 方法名(形参列表): 子类重写的方法和父类被重写的方法相同
② 权限修饰符: 子类重写的方法 大于等于
父类被重写的方法
>特殊情况:子类不能重写父类中private
修饰的方法
③ 返回值类型:
>父类被重写的方法返回值是void
,子类重写的方法只能也是void
>父类被重写的方法返回值是A类
,子类重写的方法是A类或子类
>父类被重写的方法返回基本数据类型
(比如 int),子类重写的方法只能是一样的(必须是 int)
④ 异常类型: 子类重写的方法 小于等于
父类被重写的方法
⑤ 注意 static: 子父类中的方法要么都是static
的(不是重写),要么都是非static
的(可以重写)