2 Java学习笔记(方法重写与向上转型)

方法重写 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖 。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写 。
重写方法时,需要遵循以下规则:

  1. 参数列表必须完全与被重写的方法参数列表相同 。
  2. 返回的类型必须与被重写的方法的返回类型相同 。
  3. 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)
  4. 父类的成员方法只能被它的子类重写 。
  5. 声明为 final 的方法不能被重写 。
  6. 声明为 static 的方法不能被重写,但是能够被再次声明 。
  7. 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法 。
  8. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法 。
  9. 构造方法不能被重写 。
  10. 如果不能继承一个方法,则不能重写这个方法 。
代码如下: class Father{public void move(){System.out.println("Father");}}class Son extends Father{public void move(){System.out.println("Son");}}public class Test1{public static void main(String args[]){Father a = new Father(); // Father 对象// 父类的引用指向了子类Father b = new Son(); // Son子类重写了Father父类的方法Son c = (Son)new Father();a.move();// 执行 Father 类的方法b.move();//执行 Son 类的方法c.move();}} 以上实例编译运行结果如下:
Fathersonson 在上面的例子中可以看到,尽管 b 属于 Father 类型,但是它运行的是 Son类的 move方法 。
这是由于在编译阶段,只是检查参数的引用类型 。
然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法 。
因此在上面的例子中,之所以能编译成功,是因为 Father 类中存在 move 方法,然而运行时,运行的是特定对象的方法 。
父类引用指向子类对象 父类引用指向子类对象指的是:
例如父类Animal,子类Cat,Dog 。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类 。
Animal animal = new Cat();
即声明的是父类,实际指向的是子类的一个对象 。
可以用这几个关键词来概括: