多态性,强转,instanceof运算符

多态性,强转,instanceof运算符

多态性

概述:JAVA引用变量有两种类型,一种是编译时的类型,一种是运行时的类型,如果编译时的类型和运行是的类型不一样,就可能出现多态。
请看如下代码

package myeclipse;

class Fruit{
	public String base="水果";
	public void show() {
		System.out.println("调用父类的show()方法");
	}
	
}
class Apple extends Fruit{
	public String base="苹果";
	public void show() {
		System.out.println("调用子类的show()方法");
	}
	public void own() {
		System.out.println("子类独有的方法");
	}
	
}
public class my {
      
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    Fruit f = new Fruit();
	    f.show();
	    System.out.println(f.base);
	    Apple a = new Apple();
	    a.show();
	    a.own();
	    System.out.println(a.base);
	    Fruit fa = new Apple();
	    fa.show();
	    System.out.println(fa.base);
	    //fa.own();
        }
	}

运行结果:
调用父类的show()方法
水果
调用子类的show()方法
子类独有的方法
苹果
调用子类的show()方法
水果
总结:可以看出当调用方法时总是表现出子类方法的行为特征,但需要注意,与方法不同的是,对象的实例变量并不具备多态性,所输出的仍然是父类的实例变量。
注意:引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法。如上所示,fa无法调用它自身的own方法,因为这个方法在其父类中不存在,所以无法通过编译。

强制类型转换

由上述可知,引用变量只能调用其编译时类型的方法,而不能调用其运行时类型的方法,所以要想实现其运行时独特的方法就要进行强制类型转换。
修改上述代码

package myeclipse;

class Fruit{
	public String base="水果";
	public void show() {
		System.out.println("调用父类的show()方法");
	}
	
}
class Apple extends Fruit{
	public String base="苹果";
	public void show() {
		System.out.println("调用子类的show()方法");
	}
	public void own() {
		System.out.println("子类独有的方法");
	}
	
}
public class my {
      
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    Fruit f = new Fruit();
	    f.show();
	    System.out.println(f.base);
	    Apple a = new Apple();
	    a.show();
	    a.own();
	    System.out.println(a.base);
	    Fruit fa = new Apple();
	    fa.show();
	    System.out.println(fa.base);
	    //fa.own();
	   Apple apple = (Apple)fa;//将fa强制转换成子类Apple
	   apple.own();//进行强转之后便可以调用它本身有而其父类却没有的方法
        }
	}

注意:1:基本类型之间的转换只能在数值类型之间进行,这里的数值类型包括整数型,字符型和浮点型。但数值类型和布尔类型之间不能相互转换。
2:引用类型之间的转换只能在具有继承关系的两个类型之间进行。

instanceof运算符

类型之间的转换如果操作不当就会引发各种错误,所以我们可以利用instanceof来判断是否可以进行强制类型转换。
instanceof运算符前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口,可以将接口理解成一种特殊的类),注意在使用instanceof时,运算符前面的操作数类型要么与后面相同要么与后面的类具有父子继承关系,否则将会引起编译错误。

package myeclipse;

public class my {
      
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    Object hello = "hello";
	    System.out.println(hello instanceof Object);
	    System.out.println(hello instanceof String);
	    System.out.println(hello instanceof Math);
	    System.out.println(hello instanceof Comparable);
	    //String a = "hello";
	    //System.out.println(a instanceof Math); 无法编译通过,因为两者不存在继承关系。
        }
	}




				运行结果:
				true
				true
				false
				true

通常用instanceof判断是否可以进行强制类型转换,再进行强转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值