多态的学习
1.多态的概念
一个事物在不同时刻显示出来的不同状态
(在堆内存中的变化)
伪代码:
public static void main(String[] args) {
Fu a = new Zi() ;
System.out.println(a.num);
a.show() ;
a.function();
}
2.多态的前提条件
1)必须存在继承关系(继承的好处第三点)
2)要有方法重写:
举例:动物的吃和睡的功能,只要看到具体的动物类:才能知道吃和睡的功能
3)需要存在:父类引用指向子类对象 (向上转型:使用的父类的东西,必须编译看左边!)
格式:父类名 对象名 = new 子类名() ;
3.多态的成员访问特点
父类名 对象名 = new 子类名() ;
1)成员变量: 编译看左,运行看左边
2)成员方法:(非静态的):编译看左边,运行看右(因为存在子类覆盖父类的方法:方法重写)
3)静态的成员方法:编译看左,运行看左
(子类出现了和父类一摸一样的静态方法,静态方法跟类相关,不存在重写!,访问方式:类名.方法名())
4)构造方法:由于存在继承关系,还需要分层初始化!
方法重写:指的是非静态方法!
4.多态的好处
1)提高了代码的扩展性(由多态)
2)提高了代码的复用性,维护性(由继承关系保证)
如果没有明确要求使用多态方式进行测试
使用具体类名 对象名 = new 具体类名();
5.多态的弊端以及解决方法
不能访问子类的特有功能
如何解决:
方式1:
可以创建子类具体类对象 :子类名 对象名 = new 子类名() ;
对象名.访问子类的自己的功能;
但是,不好,从内存角度考虑,在堆内存中产生一个内存空间(比较消耗内存空间!)
方式2:
多态的第三个条件:父类引用指向子类对象 (向上转型)
Fu f = new Zi() ;
想办法:将父类的引用强制转换为子类的引用(向下转型)
Zi z = (Zi)f;
好处:不需要重新new对象,在堆内存是比较节省内存空间的!
前提条件:要使用向下转型,必须先使用向上转型!
class Fu2{
public void method() {
System.out.println("method fu2...");
}
}
class Zi2 extends Fu2{
public void method() {
System.out.println("method zi2...");
}
public void show() {
System.out.println("show Zi2...");
}
}
public class DuoTaiDemo3 {
public static void main(String[] args) {
Fu2 f = new Zi2() ;
f.method() ;
Zi2 z = new Zi2() ;
z.show();
System.out.println("-------------------------------");
Zi2 z2 = (Zi2)f;
z2.show();
}
}
6.注意事项
多态的向下转型使用不当,程序出现异常:
注意:
产生一个ClassCastException:运行时期异常(RuntimeException)的一种
使用向下转型的时候类型不匹配导致的!
7.final关键字
final关键字的特点
表示:最终的,无法更改(状态修饰符)
final修饰类,该类不能被继承!
final可以修饰成员变量,该变量此时是一个常量(常驻内存!)
自定义常量的时候:public static final 数据类型 变量名 = 初始化;
final可以修饰成员方法,该方法不能被重写
final修饰的变量:只能被赋值一次(它的值不能再被更改了!)
补充:常量的分类
字面值常量
自定义常量(final修饰的)
8.final修饰基本类型的变量和引用类型的区别
final修饰的基本数
据类型的变量:它的数据值不能再改变了(具体的数据值)
final修饰的引用数据类型,它的地址值不能再改变了(但是成员变量的值不影响!)
伪代码:
public final int num3 = 300 ;
public void show() {
final int num ;
num = 60 ;
System.out.println(num);
}