Java学习笔记4

封装、继承、多态是面向对象的三大特征,在Java中什么是多态?


Java引用变量有两种类型,分别是编译时类型和运行时类型。何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类型是由实际赋给该变量的对象决定


的,也就是说如果编译时类型和运行时类型不一致时,就可能出现上面提到的多态。


我们看下下面的程序:

class BaseClass {
	public String name = "BaseClass";

	public void base() {
		System.out.println("父类的方法");
	}

	public void test() {
		System.out.println("父类的方法,等会儿会被子类重写");
	}
}

public class Main extends BaseClass {
	public String name = "Main";

	public void test() {
		System.out.println("子类重写父类的方法");
	}

	public void main() {
		System.out.println("子类的方法");
	}

	public static void main(String[] args) {
		BaseClass mainClass = new Main();//1
		System.out.println(mainClass.name);//2
		mainClass.test();//3
	//	mainClass.main();//4(报错)
	}
}

上面定义一个父类BaseClass,子类Main继承了父类BaseClass,并在子类中重写了父类的方法test方法。

OK,先看下输出结果:

     BaseClass
    子类重写父类方法

从上面程序可以很快的看出在创建对象时,编译时类型(BaseClass)和运行时类型(Main)并不相同,在子类Main覆盖了父类的test方法时,调用该引用变量的test方法,实际


执行的是Main类中覆盖后的test方法,这时就出现了多态。子类是一种特殊的父类,因此Java允许把一个子类对象直接赋值给一个父类引用变量,无须任何类型转换,或者被称


为向上转型,向上转型由系统自动完成。在上面的 mainClass引用变量的编译时类型是BaseClass,运行时类型是Main,当运行时调用该引用变量的方法时,其方法行为总是表


现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法是呈现出多种不同的行为特征,这就是多态。在上面代码4处,这行


代码会在编译时报错,这是因为它的编译时类型为BaseClass,因此无法调用main这个方法。


在编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,如果需要让这个引用变量调用它运行时类型的方法的话,可以用强制类型转换成


运行时类型。在进行强制类型转换时需要注意以下几种情况:


1、基本类型之间的转换只能在数值类型之间进行,这边的数值类型包括整型、字符型和浮点型。需要注意的是,数值类型和布尔类型之间不能进行类型转换。


2、引用类型之间的转换只能在具有继承关系的两个类型之间进行。


在进行类型转换之前,通常建议使用instanceof运算符来判断是否可以成功转换,来避免出现ClassCastException异常。instanceof用法如下

if(str instanceof  String){

String s=(String)str;

}

instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类也可以是接口。





转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43868569    情绪控_ 





©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值