一. 多态 同一个对象在不同时期表现的出不形态,要构成多态必须满足以下三个前提 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