多态是同一个行为具有多个不同表现形式或形态的能力。
如同一台打印机,它既可以是黑白打印机,用来打印黑白照片,也可以是彩色打印机,用来打印彩色照片。都是“打印”这个动作,放在两台不一样的打印机上,就会产生不一样的结果——黑白或彩色的照片。多态也是一样,同一个行为在不同的对象身上就会产生不同的作用。
多态存在的三个必要条件:继承、重写、向上转型。
继承
顾名思义,要完成多态,必须要存在类的继承关系。
重写
在有继承关系的情况下,子类必须重新定义父类中的某些方法。前两点之前都总结了一下:
【Java基础学习笔记】6、类和接口(继承和抽象类)
向上转型
在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法,这个过程被称为向上转型,即从更小范围的子类实例化更大范围的父类对象。这是自动转换,即可以直接写。
格式:
父类 对象名 = new 子类
代码示例:
public class Javasample {
public static void main(String[] args) {
Printer b=new MonochromePrinter();
Printer c=new ColorPrinter();
b.print();
c.print();
}
}
class Printer{
//父类
public void print(){
System.out.println("打印照片");
}
}
class MonochromePrinter extends Printer{
//子类1
public void print(){
//重写print()方法
System.out.println("打印黑白照片");
}
}
class ColorPrinter extends Printer{
//子类2
public void print(){
//重写print()方法
System.out.println("打印彩色照片");
}
}
结果如下:
向下转型(扩展,非多态的内容)
向下转型与向上转型相对,即从更大范围的父类实例化更小范围的子类对象,属于强制转换,即需要加强制转换语句。
格式:
子类 对象名 = (子类)父类对象
代码示例:
public class Javasample {
public static void main(String[] args) {
change(new MonochromePrinter());
change(new ColorPrinter());
}
public static void change(Printer p){
//进行判断
if(p instanceof MonochromePrinter){
//强制转换
MonochromePrinter m=(MonochromePrinter)p;
m.print();
m.run();//调用子类特有方法
}
else if(p instanceof ColorPrinter){
//强制转换
ColorPrinter c=(ColorPrinter)p;
c.print();
c.run();//调用子类特有方法
}
}
}
class Printer{
public void print(){
System.out.println("打印照片");
}
}
class MonochromePrinter extends Printer{
public void print(){
System.out.println("打印黑白照片");
}
public void run(){
//子类特有的方法
System.out.println("黑白打印机正在运行");
}
}
class ColorPrinter extends Printer{
public void print(){
//子类特有的方法
System.out.println("打印彩色照片");
}
public void run(){
System.out.println("彩色打印机正在运行");
}
}
结果如下:
注意!: 不论是向上转型还是向下转型,编译看左边,运行看右边。 new谁就调用谁的方法。
instanceof关键字:
对象名 instanceof 类名
如果相符,返回true,否则返回false。