注意事项
编译时,看“父类”,只能调用父类声明的方法,不能调用子类扩展的方法;运行时,看“子类”,一定是执行子类重写的方法体;
也就是说:
使用不了子类独有的内容,因为名义上是父类类型,就只能调用到父类中存在的,如果子类有重写
这个是可以调用子类的方法的!如果没有重写就是父亲的。多态只能调用到父类的,或者父子类共有的
代码示例
定义父类:
public abstract class Animal {
public abstract void eat();
}
定义子类:
class Cat extends Animal {
public void eat() {
System.out.println(“吃鱼”);
}
public void catchMouse(){
System.out.println(“抓老鼠”);
}
}
class Dog extends Animal {
public void eat() {
System.out.println(“吃骨头”);
}
}
定义测试类:
public class Test {
public static void main(String[] args) {
// 多态形式,创建对象
Animal a1 = new Cat();
// 调用的是 Cat 的 eat
a1.eat();
//a1.catchMouse();//错误,catchMouse()是子类扩展的方法,父类中没有
/*
多态引用,编译时,看“父类”,只能调用父类声明的方法;
运行时,看“子类”,一定是执行子类重写的方法体;
*/
// 多态形式,创建对象
Animal a2 = new Dog();
// 调用的是 Dog 的 eat
a2.eat();
}
}
多态的实现方式有三种:重写、重载和接口实现,这三种都是同一行为不同表现形式的体现。
重写
重写,指的是子类对父类方法的重新定义。
但是子类方法的参数列表和返回值类型,必须与父类方法一致!
代码示例:
public abstract class Animal {
private int id;
private String name;
public abstract void eat();
}
public class Cat extends Animal {
//父类中的eat方法不能满足,重写
public void eat(){
System.out.println(“吃鱼”);
}
}
重载
重载,指的是在一个类中方法名相同,但参数列表不同。
参数顺序不同不算是重载
代码示例:
class Cat extends Animal{
public void eat(){
System.out.println(“吃鱼”);
}
public void eat(String name){
System.out.println(name + “吃鱼”);
}
}
接口实现
接口,是Java语言中一种引用类型,是方法的集合,其内部封装了抽象方法。
接口内不能实现抽象方法,只能在继承接口的具体类中定义
代码 示例:
public interface Attack {
void attack();
}
public class Aircraft implements Attack {
@Override
public void attack() {
System.out.println(“攻击”);
}