多态性,强转,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判断是否可以进行强制类型转换,再进行强转。