多态性简介
java三大特性之一件事多态,同一个行为以多种不同的方式表现出来。
就是以同一个引用对象调用的同一个方法显示不同东西,而且必须是在运行期间才能确定该引用对象指向的是哪一个类的实例对象,调用的是哪一个类中的实现方法。
就好比一个打印机,可以分为彩色打印机打印彩色照片或者黑白打印机打印出黑白照片。
多态前置条件:
- 继承:多个或者一个子类继承父类的关系
- 重写:子类重写父类的方法
语法:
父类类型 对象名 = new 子类类型();
/**
* 打印机
* @author Administrator
*
*/
class Printer {
public void show(){
System.out.println("打印照片");
}
}
class ColorsPrinter extends Printer{
public void show(){
System.out.println("打印彩色照片");
}
}
class BlackPrinter extends Printer{
public void show(){
System.out.println("打印黑白照片");
}
}
class Test1{
public static void main(String[] args) {
Printer c = new ColorsPrinter();
Printer b = new BlackPrinter();
c.show(); //彩色照片
b.show(); //黑白照片
}
}
对象向上转换(upcasting)
向上转换就是把子类对象直接赋值给父类引用,不用强制转换,可以说调用父类的所有成员,不能调用子类特有的成员,最终运行看子类的具体实现。
语法:
父类类型 对象名 = new 子类类型(); 或者 接口名称 对象名 = new 子类类型();
class Printer {
public void show(){
System.out.println("打印照片");
}
}
class BlackPrinter extends Printer{
public void show(){
System.out.println("打印黑白照片");
}
}
class Test1{
public static void main(String[] args) {
Printer b = new BlackPrinter(); //向上转换
b.show();
}
}
对象向下转换
向下转换就可以调用子类的所有成员,注意父类引用的是子类对象,那么在运行中向下转换的过程是安全的,如果父类引用的是本类对象,那么在运行中向下转换会发生Java 强制类型转换异常,一般使用 instanceof 运算符来避免出此类错误。
语法:
父类类型 对象名1 = new 子类类型(),
子类类型 对象名2 = (子类类型)对象名1;
class Printer {
public void show(){
System.out.println("打印照片");
}
}
class BlackPrinter extends Printer{
public void show(){
System.out.println("打印黑白照片");
}
}
class Test1{
public static void main(String[] args) {
Printer b = new BlackPrinter(); //向上转换
BlackPrinter p = (BlackPrinter)b; //向下转换
p.show();
}
}
instanceof关键字
用来判断左边的对象是否是右边的实例,返回的boolean类型数据。
就相当于是==,>,<,因为对于子类也算是父类对象的实例
class Printer {
public void show(){
System.out.println("打印照片");
}
}
class ColorsPrinter extends Printer{
public void show(){
System.out.println("打印彩色照片");
}
}
class BlackPrinter extends Printer{
public void show(){
System.out.println("打印黑白照片");
}
}
class Test1{
public static void main(String[] args) {
Printer b = new BlackPrinter();
System.out.println(b instanceof Printer); //true
System.out.println(b instanceof BlackPrinter); //true
System.out.println(b instanceof ColorsPrinter); //false
}
}