在面向对象设计中多态性描述的是同一结构在指行时会根据不同的形式展现出不同的效果,在Java中多态性可以分为两种不同的展现形式。
- 展现形式1:方法的多态性(同样的方法有不同的实现)
- 方法的重载:同一个方法可以根据传入的参数的类型或个数的不同实现不同功能。
- 方法的覆写:同一个方法可能根据实现子类的不同有不同的实现。
//方法重载
class MyClass{
public void print(){ //方法重载
System.out.println("123");
}
public void print(String str){//方法重载
System.out.println(str);
}
}
//方法覆写
class MyClass{
public void print(){
System.out.println("123");
}
}
class MyClassTest extends MyClass{
public void print(){
System.out.println("456");
}
}
- 展现形式2:对象的多态性(父类与子类实例之间的转换处理)
- 对象向上转型:父类 父类实例=子类实例 ,自动完成转换
- 对象向下转型:子类 子类实例=(子类)父类实例,强制完成转换
对象向上转型
class Message{
public void print(){
System.out.println("www.codestudy.com");
}
}
class DatabaseMessage extends Message{
public void print(){ //【方法覆写】子类有不同的方法体
System.out.println("数据库连接信息......");
}
}
class NetMessage extends Message{
public void print(){ //【方法覆写】子类有不同的方法体
System.out.println("网络信息......");
}
}
public class MessageTest{
public static void main(String []args){
Message msgA = new DatabaseMessage();//向上转型
msgA.print(); //调用被覆写过的方法
Message msgB = new NetMessage(); //向上转型
msgB.print(); //调用被覆写过的方法
}
}
对象向下转型
对象向下转型必须先发生向上转型,之后才可以进行向下转型
class Person{
public void run(){
System.out.println("用力奔跑......");
}
}
class Superman extends Person{ //超人(superman)继承自人(person)的功能
public void fly(){//子类扩充方法
System.out.println("超音速飞行......");
}
public void laser(){//子类扩充方法
System.out.println("激光眼......");
}
}
public class PersonTest {
public static void main(String[] args) {
System.out.println("正常状态下超人是普通人状态!");
Person person = new Superman();//超人是一个人
person.run(); //调用人的跑步功能
System.out.println("超人受刺激,变身");
//Person是父类只拥有父类的方法,如果想要调用子类的特殊方法,必须强制转为子类实例
Superman spm = (Superman)person;
spm.fly(); //子类扩充方法
spm.laser(); //子类扩充方法
}
}
instanceof关键字
instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。
instanceof应用场景
需要用到对象的强制类型转换时,需要使用instanceof进行判断。
- instanceof使用注意事项
- 先有继承关系,再有instanceof的使用。
- 当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
public class PersonTest {
public static void main(String[] args) {
System.out.println("正常状态下超人是普通人状态!");
Person person = new Superman();//超人是一个人
person.run(); //调用人的跑步功能
System.out.println("超人受刺激,变身");
if (person instanceof Person){//判断实例类型
Superman spm = (Superman) person;//强制转换为子类实例
spm.fly();
spm.laser();
}else {//不是超人
System.out.println("君子报仇,十年不晚!");
}
}
}