一. 多态
同一个对象在不同时期表现的出不形态,要构成多态必须满足以下三个前提
1.要有继承或实现
2.有方法的重写
3.有父类的引用指向对象
eg:
public class Animal {
public String name ="动物";
public void Eat(){
System.out.println("我是"+name);
System.out.println("吃东西");
}
}
public class Cat extends Animal { // 1.有继承
public void Eat(){ // 2.有方法重写
System.out.println("猫吃鱼");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
Animal a = new Cat(); // 3. 有父类引用指向
a.Eat();
}
}
二.多态的成员访问特点:
对于成员变量:编译看左边,执行也看左边 (以左边的类为准,调用的都是左边类中的成员方法 即 Animal 类中的成员变量)
对于成员方法:编译看左边,执行也看右边 (以左边的类为准,去编译如果没有方法会报错,但是执行的时候是调用的左边的的方法,因为方法
被重写 即执行Cat类中的Eat()方法)
三.多态的好处和弊端
好处:定义方法的时候用父类作为参数,将来做操作时传具体的子类,然后使用子类的相关操作(变量和方法,子父类都拥有的)
坏处:不能使用子类特有的功能(子类的有功能,父类没有实现的)
四.怎么在多态的情况下,使用子类独有的功能呢?
向上转型 :Animal a = new Cat(); 左边是父类,右边是子类,这是向上转型
向下转型: Cat cc = (Cat)a; a 之前是Animal类,现在强转成Cat类,现在就可以使用Cat类的独有方法
(能向下转型的根本原因是:a 在栈内里指向一个堆内存空间地址,而这个空间地址实际就是Cat对象,所以cc直接引用了堆内存空间)
五.抽象类
1.没有方法体的方法应该定义为抽象方法,类中如果有抽象方法,那么该类一定是抽象类。
2.抽象方法和抽象方法必须由 abstract 来修饰
3.抽象类里可以没有抽象方法(没有意义),但是有抽象方法必然是抽象类。
4.抽象类不能直接实像化对象,参照多态的方式,通过子类对象实例化,叫抽象化多态
5.抽象类的子类要么重写抽象类中所有的抽象方法,public class Zi extends Fu(){重写所有Fu类中的抽象方法}
要么本身是抽象类 public abstract class Zi extends Fu(){ 不用重写Fu类中的抽象方法}
6.抽象类可能成员变量(变量,常量final),也可以有构造方法,但不能实例化,仅用于子类访问父类时初始化父类数据,
可以有成员方法:
抽象方法:限定子类必须完成某些动作(子类必须要重复写父类中的抽象方法 )
非抽象方法:提高代码的复用性
来源:CSDN
作者:苦咖菲And海
链接:https://blog.csdn.net/zhanghai412/article/details/104110529