1. 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
2. 向上转型
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
class JNC extends Wine{
/**
* @desc 子类重写父类方法
* 父类中不存在该方法,向上转型后,父类是不能引用该方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子类重写父类方法
* 指向子类的父类引用调用fun2时,必定是调用该方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
//====================================================================
结果:Wine 的Fun.....
JNC 的Fun2...
分析:在这个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重载后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方法。
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
class JNC extends Wine{
/**
* @desc 子类重写父类方法
* 父类中不存在该方法,向上转型后,父类是不能引用该方法的
* @param
* @return void
*/
public void fun1(){//改为重写,非重载
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子类重写父类方法
* 指向子类的父类引用调用fun2时,必定是调用该方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
//===============================================================================
输出:JNC 的 Fun1...
JNC 的Fun2...
总结:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。(子类中有的,父类没有,无法使用。子类有,父类有,使用子类中的方法)
牢牢记住一句话:无论向上向下转型,编译看左边,运行看右边。
意思就是:编译时候左边的对象有没有该方法(不严谨),运行时候看new的对象是谁,就调用谁的方法
文章借鉴点击跳转