多态
同一事物,在不同时刻表现不同的状态
多态也称为向上转型,将子类的类型转为父类类型
父类的引用变量,指向子类对象
前提:类之间要有继承关系
两个不同的时间段:
1.编译期: 写代码时,类型是父类类型
2.运行期: 运行代码时,类型是具体的子类类型
用父类类型表示任意的子类类型对象,利于程序扩展
问题:一旦将子类类型转为父类类型,就不能调用子类中特有的方法
解决方法: 将父类类型 向下转换为 子类类型
转换时需要使用instanceof判断 表示父类类型中持有实际类型是否是指定类型
父类类型 instanceof 具体子类类型: 相同返回true,否则返回false
Animal dog = new Dog();
成员方法: 编译看左边,运行看右边
dog.eat();
dog.show();
静态成员方法:编译和运行都看左边
System.out.println(dog.num);
成员变量: 编译和运行都看左边
Dog d = (Dog)dog;向下转型,将父类类型转换为子类类型
优点: 可以提高程序的扩展性
Exception in thread "main" java.lang.ClassCastException: day4.duotai.Cat cannot be cast to day4.duotai.Dog
类转换异常,如Cat类不能转换为Dog类
final关键字
用于修饰类,方法,参数和成员变量(常量)
final修饰的类
是不能被继承的,所以不能修饰抽象类
例如Java中String类就是final修饰的
final修饰的方法
final修饰的方法不能被重写
final修饰的方法参数
final修饰的方法参数,参数值在方法中不能被改变
final修饰的成员变量值
final修饰的成员变量值不能改变,因此称为常量
情况1: 在类定义时,值就确定,直接赋值,赋值后值就不能改变的,所以建议使用static修饰
final static int a =1;
情况2: 在类定义时,值不明确,必须在创建对象后,在构造方法对其进行赋值,每个对象中都拥有一个常量
final int count;
public FinalDemo() {
this.count = 10;
}
常量一般建议全部使用大写字母 多个单词之间用下划线连接
接口
接口是计算机领域的名词,代表一种功能的定义
例如USB接口 定义usb接口的规范,让其他设备去实现
接口可以看作是一种特殊的抽象类,里面也可以包含抽象方法
接口不能被创建对象,被其它类实现,重写抽象方法
主要也是用来定义功能的
Java中接口如何定义: public interface Interface{ }
interface关键字修饰 接口
接口可以定义的内容:
jdk8之后接口可以定义常量,抽象方法,静态方法,默认方法
jdk8之前只能定义常量和抽象方法
所有属性默认为: public static final
int num = 10;
方法定义方式
public void eat();
抽象方法,必须是public abstract定义
public abstract void test();
静态方法,通过接口名可直接调用
public static void test1(){}
默认方法,被子类继承后调用
public default void test2(){}
接口不能实例化对象