Java基础-多态的学习

多态的学习
1.多态的概念
一个事物在不同时刻显示出来的不同状态
				(在堆内存中的变化)
伪代码:
public static void main(String[] args) {
		//之前的写法:
		//Zi z = new Zi();//子类名 对象名 = new 子类名() ;
		//z.show(); 
	
		//多态的形式创建对象:具体类多态
		Fu a = new Zi() ; //父类名 对象名 = new 子类名() ;
		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() ; //多态:成员方法的访问问题:编译看左,运行看右!
		//f.show() ;
		
		//方式1) 子类 创建子类对象
		Zi2 z = new Zi2() ;
		z.show();
		System.out.println("-------------------------------");
		//方式2:向下转型
		Zi2 z2 = (Zi2)f;  //好处:不需要重新new对象,在堆内存是比较节省内存空间的!
		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  ; //局部变量:使用final修饰:表示当前这个变量是一个常量
		 num = 60 ;
		 System.out.println(num);
	}

你可能感兴趣的:(java,多态)