多态
定义:一种事物的多种形态
以笔类为例:
铅笔、钢笔、毛笔。。。。。。
多态的规则:
1、类与类之间要建立关系,建立继承的关系;
2、必须要有方法的重写;
3、父类的指针(引用)指向子类的对象;
需求:创建 动物类、猫类、狗类
都有一个吃的方法 动物类 动物吃饭
猫 猫吃鱼
狗 狗吃骨头
public class Demo01 {
public static void main(String[] args) {
Cat c = new Cat();
c.eat();
Animal a = new Cat();
a.eat();
Animal aDog = new Dog();
aDog.eat();
}
}
class Animal{
public void eat(){
System.out.println();
}
}
class Cat extends Animal{
public void eat() {
System.out.println(“猫吃鱼”);
}
}
class Dog extends Animal{
public void eat() {
System.out.println(“够吃骨头”);
}
}
多态时 成员变量是如何调用的:
多态时当父类引用成员变量时
编译 需要看父类中有没有这个成员变量 没有编译不会通过
运行 访问就是父类中的成员变量
多态时 父类访问成员变量 编译 和 运行(看父类)
多态时 如何访问成员方法?在内存如何表现?
多态调用成员方法时
编译时 看父类中有没有这个方法 没有就报错
运行时 运行时 运行子类这个方法
所以:编译时看父类
运行时也看父类
成员变量运行时全看父类
public class Demo02 {
public static void main(String[] args) {
Father f = new Son();
f.speak();
System.out.println(f.num);
Son s = new Son();
System.out.println(s.num);
}
}
class Father{
int num = 10;
public void speak() {
System.out.println("Father 说");
}
}
class Son extends Father{
int num = 20;
public void speak() {
System.out.println(“son 说”);
}
}
多态:
好处:
1、增强了代码可维护性(建立在继承基础上)
2、增强代方法的可扩展性(核心)
弊端:不能直接调用子类的特殊(不是重写父类的)方法
ublic class Demo03 {
public static void main(String[] args) {
Person p = new Pianzi();
p.speak();
Pianzi pianzi = (Pianzi)p;
pianzi.hit();
}
}
class Person{
public void speak() {
System.out.println("聊天 侃大山");
}
public void hit() {
System.out.println("锤你");
}
}
class People extends Person{
}
class Pianzi extends Person{
public void speak() {
System.out.println(“洗脑”);
}
public void hit() {
System.out.println(“锤你—杀人防火”);
}
}