在说多态前,写记录下关于重载与重写的区别。
重载:
方法名字相同,但是方法参数不同(①参数个数不同,参数类型不同),方法重载并不关心返回值的类型,也就是说返回值的类型对方法重载没有影响。
方法重写
子类重写父类中的方法,两个方法的返回值类型一样,方法名一样,参数一样,这样的子类方法与父类中的方法构成了重写关系。
重载发生在一个类的内部,而重写则是在父子类的继承。如果子类方法与父类方法中的某个方法同名,但是参数类型不一样,这样不叫重写,而是叫重载,因为子类继承父类,那么父类有的方法,子类也有,因此构成重载。
多态:
父类形引用可以指向子类对象,或者是接口类型的引用可以指向实现该接口的类的示例对象。多态是一种运行期行为而非编译期行为。
可以看代码:
public class PolymorphicTest {
public static void main(String[] args) {
//这是就一种多态,即父类引用可以指向子类对象。
Animal animal = new Dog();
animal.eat();
}
}
class Animal{
public void eat() {
System.out.println("动物需要吃食物");
}
}
class Dog extends Animal{
/**
* 子类中重写了父类的方法
*/
public void eat() {
System.out.println("狗爱吃骨头");
}
}
运行结果为:
狗爱吃骨头
需要注意的是,使用多态调用方法时,首先要检查父类中是否有这个方法,如果没有的话,则会编译出错,如果有则再去调用子类的方法。
如果把子类的eat方法注释掉以后:
public class PolymorphicTest {
public static void main(String[] args) {
//这是就一种多态,即父类引用可以指向子类对象。
Animal animal = new Dog();
animal.eat();
}
}
class Animal{
public void eat() {
System.out.println("动物需要吃食物");
}
}
class Dog extends Animal{
/**
* 子类中重写了父类的方法
*/
// public void eat() {
// System.out.println("狗爱吃骨头");
// }
}
结果为:
动物需要吃食物
之所以出现的是父类中的eat方法,是因为子类继承了父类,子类也就有了这个eat方法。
如果只把父类中的eat方法注释掉,编译是就会报错
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method eat() is undefined for the type Animal
强制类型转换有两种:
- 向上类型转换,如子类转父类,则不需要用括号强制标出。
- 向下类型转换是,如果父类引用指向子类对象,那么如果想要将父类引用转换为对应的子类引用的话,需要使用括号强制表示出来。
例如:
Animal animal = new Dog();
Dog dog = (Dog)animal;
dog.eat();