目录
多态
同一个对象,在不同时刻的不同形态
多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
例子:
package day6.demo1;
/**
* @author NJR10byh
* @date 2022/7/19 14:18:13
* @description 多态
*/
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package day6.demo1;
/**
* @author NJR10byh
* @date 2022/7/19 14:18:59
* @description 多态
*/
public class dog extends Animal { // 1、有继承
@Override // 2、有方法重写
public void eat() {
System.out.println("狗吃骨头");
}
}
package day6.demo1;
/**
* @author NJR10byh
* @date 2022/7/19 14:17:35
* @description 多态
* 1、有继承/实现关系
* 2、有方法重写
* 3、有父类引用指向子类对象
*/
public class task1 {
public static void main(String[] args) {
Animal a = new dog(); // 3、有父类引用指向子类对象
a.eat();
}
}
多态中成员访问的特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边(方法有重写)
多态优缺点
- 优点:定义方法,用父类型作为参数,将来可以使用子类型参与操作(方法重写)
- 缺点:不能使用子类特有的功能
多态下引用数据类型的转换
- 自动转换(子到父)
Animal a = new Dog(); // 父类引用指向子类对象
- 强制转换(父到子)
// 子类 对象变量 = (子类)父类对象变量
Animal a = new Dog();
Dog d = (Dog)a;
注意:如果转换后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException
例:
Animal a = new Dog();
Cat c = (Cat)a; // 报错:ClassCastException
解决方法:Java强制转换前,建议使用 instanceof 判断当前对象的真实类型(返回 true or false)
Animal a = new Dog();
if(a instanceof Dog){
Dog d = (Dog)a;
}else if(a instanceof Cat){
Cat c = (Cat)a;
}
抽象类
抽象类的特点
- 抽象类和抽象方法必须使用 abstract 关键字修饰
public abstract class 类名{}
public abstract void 方法名{}
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化,但可以通过子类对象实例化(抽象类多态)
- 抽象类的子类
1、要么重写抽象类中的所有抽象方法
2、要么是抽象类
接口
接口的特点
- 接口用关键字 interface 修饰
public interface 接口名{}
- 类实现接口用 implements 表示
public class 类名 implements 接口名{}
- 接口不能实例化,但是可以通过实现类对象实例化(接口多态)
多态的形式:具体类多态,抽象类多态、接口多态
接口的成员特点
成员变量
- 只能是常量(默认修饰符:public static final)
构造方法
- 接口没有构造方法
- 一个类如果没有父类,默认继承Object类
成员方法
- 只能是抽象方法(默认修饰符:public abstract)
类和接口的关系
- 类和类
继承(只能单继承,但是可以多层继承)
- 类和接口
实现(单实现、多实现、继承一个类的同时实现多个接口)
- 接口和接口
继承(单继承,多继承)
抽象类和接口的区别
成员区别
- 抽象类
变量,常量;构造方法;抽象方法;非抽象方法 - 接口
常量;抽象方法
关系区别
- 同 类和接口的关系
设计理念区别
- 抽象类是对事物抽象
- 接口是对行为抽象
练习代码: day6_code