四 多态
extends继承或implements实现,是多态性的前提
1多态性的表现
(父类引用可以指向多个子类对象)
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();
- 访问成员变量
编译和运行都看左边
public class Demo{
public static void main(String[] args){
Fu obj = new Zi();
//父类中有num
System.out.println(obj.num);//10
//父类中没有age
System.out.println(obj.age);//报错
}
}
- 访问成员方法
编译看左,运行看右
public class Demo1{
public static void main(String[] args){
Fu obj = new Zi();
//父类子类都有method优先用子类的
obj.method();
//父类中有,子类没有,向上查找
obj.methodFu();
//编译时报错,左边为父类的类型
obj.methodZi();
}
}
2 向上转型
对象的向上转型,即为多态的写法
public class Demo{
public static void main(String[] args){
//对象向上转型即为,父类引用指向子类对象
Fu obj = new Zi();
}
向上转型的时机:
- 直接赋值
- 方法传参
- 方法返回
注意:
在Java 中, 调用某个类的方法, 究竟执行了哪段代码(是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为动态绑定。
3 向下转型
子类名称 对象名 = (子类名称)父类对象;
将父类对象,还原为本来的子类对象。
//本来是猫,向上转型为动物
Animal animal = new Cat();
//还原为本来的猫,即向下转型
Cat cat = (Cat) animal;
向下转型,必须保证创建出的和还原回去的相同。
4 instanceof
判断当前对象是否为后面类型的实例
if(animal instanceof Cat){
//如果为猫,则可发生向下转型
Cat cat = (Cat) animal;
}
5 Final 关键字
-
修饰类、方法、局部变量、成员变量
-
当用final关键字修饰一个类时,该类不能有任何子类。
public final class 类名称{
}
- 当修饰方法时,该方法不能被重写
public final 返回值类型 方法名称(参数列表){
//...
}
- final修饰成员变量时,由于成员变量有默认值,所以必须对其进行手动赋值。
//正确的,只需保证有唯一一次赋值即可
final int num3;
num3 = 19;
对于final修饰的成员变量,要么直接赋值,要么使用构造方法进行赋值,必须保证所有重载的构造方法都会对其进行赋值
- 对于基本类型来说,不可变说的是变量中的数据不可改变
- 对于引用类型来说,说的是变量的地址值不改变,也就是说其内容可以改变
final Student stu2 = new Student("a");
//错误,地址值不可改变
stu2 = new Student("b");
6 权限修饰符
不同包中的类需要导入一下
public | protected | (default) | private | |
---|---|---|---|---|
同一个类 | yes | yes | yes | yes |
同一个包 | yes | yes | yes | |
不同包子类 | yes | yes | ||
不同包非子类 | yes |
注意:default此处代表留空