一、多态的概述和前提
在生活中,猫可以是猫的类型,同时猫也是动物的一种,所以也把猫称为动物。 在程序中,Cat c=new Cat();–说明猫属于猫类
Animal a=new Cat();–说明猫属于动物
概述:指的是某一个事物,在不同时刻表现出来的不同形态。
前提:
1.要有继承关系
2.要有方法重写
3.父类引用指向子类对象
父 f=new 子();
public class PoymorphicDemo {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();*/
//父类引用 Animal a
//指向 =
//子类对象 new Cat()
Animal a = new Cat();
a.eat();
}
}
class Animal {
public void eat() {
System.out.println("吃东西");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
二、多态中成员访问特点
a.成员变量 编译看左边,运行看左边
b.成员方法 如果子类重写了父类方法 编译看左边,运行看右边
c.构造方法:
创建子类对象时,会先访问父类的构造方法
d.静态方法(和类一样,算不上重写,所以访问看左边) 编译看左边,运行看左边
public class PoymorphicDemo2 {
public static void main(String[] args) {
Dad d = new Kid();
//System.out.println(d.num);
//d.method();
d.function();//使用变量去调用静态方法,其实相当于用变量类型的类名去调用
}
}
class Dad {
int num = 20;
public void method() {
System.out.println("我是父类方法");
}
public static void function() {
System.out.println("我是父类静态方法");
}
}
class Kid extends Dad {
int num = 10;
public void method() {
System.out.println("我是子类方法");
}
public static void function() {
System.out.println("我是子类静态方法");
}
}
三、向上向下转型
用内存图来解释!
向上转型:
当有子类对象赋值给下一个父类引用的时候,便是向上转型
格式:父类类型 变量名=new 子类类型();
如Person p=new Student();
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的方式将父类引用转为子类引用。
格式:子类类型 变量名=(子类类型)父类类型的变量
如:Student s=(Student)p;
public class PoymorphicDemo3 {
public static void main(String[] args) {
Animal2 a = new Dog();//向上转型
//a.eat();
Dog d = (Dog)a;//向下转型
d.swim();
}
}
class Animal2 {
public void eat() {
System.out.println("吃东西");
}
}
class Dog extends Animal2 {
public void eat() {
System.out.println("啃骨头");
}
public void swim() {
System.out.println("狗刨");
}
}
四、好处与弊端
a.提高了代码的维护性(由继承来保证)
b.提高了代码的扩展性(由多态保证)