重写:当子类继承自父类的相同方法,方法名要相同,形参列表相同,子类的返回值类型要更小或相等,子类的访问权限比父类大
-
定义父类
-
重写子类
报错:
报错原因:子class的定义应该在父类定义的括号之外 -
重写成功的案例:
public class Main {
public static void main(String[] args) {
Goo o = new Goo();
o.f();
Foo oo = new Goo();
oo.f();
}
}
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
System.out.println("Goo.f()");
}
}
输出:
4. 正确的案例:
public class Main {
public String name(){
return "chaojiyingxioing";
}
public static void main(String []args) {
Heroson hero1= new Heroson();
Main hero2= new Main();
//Heroson hero12= new Main(); 这条报错:Type mismatch: cannot convert from Main to Heroson,不能用父类覆盖子类
Main hero21= new Heroson();
System.out.println(hero1.name()); //超人
System.out.println(hero2.name()); //chaojiyingxioing
//System.out.println(hero12.name());
System.out.println(hero21.name()); //这条输出正确结果:超人
}
}
class Heroson extends Main{
public String name(){
return "超人";
}
public Main hero(){
return new Main();
}
}
有一点要注意的是,我以为的重写意思是子类直接更改父类,所以一开始以为下面这个是失败的案例:
public class Main {
public String name(){
return "chaojiyingxioing";
}
public static void main(String []args) {
Heroson hero1= new Heroson();
Main hero2= new Main();
//String x=new String();
//x=hero.name();
System.out.println(hero1.name());//结果为超人
System.out.println(hero2.name());//结果为chaojiyingxioing,我以为这个正确的应该是 超人
}
}
class Heroson extends Main{
public String name(){
return "超人";
}
public Main hero(){
return new Main();
}
}
思路错误,正确的理解是:Main hero21= new Heroson();
意思是:
当子类对象的重写方法被调用时(无论通过子类的引用还是通过父类的引用),运行的都是子类重写后的方法。
总结:啊我好笨