Java学习——37、类的多态(二)

类型的多态主要体现在:子类是一种父类类型。

子类通过继承扩充和发展了它的父类,子类是父类的一种特殊类型。

1、子类对象即是父类对象

子类对象包含了父类的所有成员,包括成员变量和成员方法,所以子类对象也是父类对象。

反之不然。

父类对象不是子类对象。

可以用关键字instanceof来判断一个实例是否属于某个类。

例:

简单起见,本例中的类没有任何成员。

class Person{

}

public class Student extends Person{

public static void main(String args[]){

Person p=new Person();

Student s=new Student();

System.out.println(s instanceof Person);

System.out.println(p instanceof Student);

}

}

其运行结果如下:

true

false

因为p是Person的对象,s是Student的对象,而Student类继承自Person类。故s也是Person的实例,而p却不是Student的实例。

2、父类对象引用子类实例

子类对象也是父类对象,说明父类对象可以引用子类实例。但反过来不行。

例:

class Person{

private String name;

public Person(){

this.name="张熹熹";

}

public void show(){

System.out.println("姓名:"+name);

}

}

public class Student extends Person{

private String number;

public Student(){

number="123";//默认调用父类的Person()

}

public static void main(String args[]){

Person p=new Student();

p.show();

Student s=new Student();

s.show();

}

}

其运行结果为:

姓名:张熹熹

姓名:张熹熹

在main方法中,p中Person类的对象,但引用的是Student类的实例。S是Student类的对象,引用的也是Student类的实例。

3、编译时多态和运行时多态

根据何时能确定到底执行的是多态中的哪一个方法,分为两种情况:编译时多态和运行时多态。

如果在编译时能够确定执行多态方法中的哪一下,就称为编译时多态。

否则,称为运行时多态。

方法的重载属于编译时多态,因为在编译时,Java虚拟机已经能够根据参数类型和参数个数来匹配到底用的是哪一个重载的方法。

方法覆盖有两种多态性,如果创建的对象与引用的实例为同一个类,为编译时多态,如下:

Student s=new Student();

此时如果有s.show();在编译时Java虚拟机就可以判定此show()方法为Student这个类的,如果Student中没有这个方法,则沿着继承的顺序往上查找。

但如果创建的对象与引用的实例不为同一个类,为运行时多态。

例:Person p=new Student();

p为Person类的对象,但引用的却是Student类的实例。

若此时调用p.show(),那么这个show()方法是在Student类中的show()方法呢,还是Person类中的show()方法呢?这就是运行时的多态。

程序运行时,Java从实例所属的类开始寻找匹配的方法执行,如果当前类中没有匹配方法,则沿着继承关系逐层向上,依次在父类或各祖先类中寻找匹配方法,直到Object类。

故上面代码:

Person p=newStudent();

p.show();//从实例所在的类Student开始寻找,如果Student类中有方法show(),则执行;否则,沿着继承关系向上,在Student类的父类Person中找,如果Person类中有方法show(),则执行;否则,沿着继承关系继续向上,直到Object类为止。

4、多态的方法实现

以下例说明:

class Person{

private String name;

public Person(){

this.name="张熹熹";

}

public String toString(){

return"姓名:"+name;

}

}

public class Student extends Person{

private String number;

public Student(){

number="123";//默认调用父类的Person()

}

public String toString(){

super.toString();

return"学号:"+number;

}

public static void main(String args[]) {

Person p=new Person();

System.out.println(p.toString());//编译时多态,因为p为Person类对象,引用的也是Person类的实例,故在编译时便知是person类中的toString()方法

Persons=new Student();//父类对象引用子类实例

System.out.println(p.toString());//运行时多态,s为Person类对象,但引用的是Student类的实例,在运行时,着先在实例所在的类Student中找toString()方法,有,即执行。

}

}

其运行结果如下:

姓名:张熹熹

姓名:张熹熹

(0)

相关推荐

  • Java定义

    多态的定义: 多态分为编译时多态和运行时多态. 编译时多态:方法的重载 运行时多态:定义的对象引用所指向的具体类型在运行期间才能确定 运行时多态的三个条件:继承.重写.向上转型 运行时多态就是子类继承 ...

  • 多态

    多态 即同一方法可以根据发送对象的不同而采用多种不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多 注意: 多态是方法的多态,属性没有多态 有父类和子类的关系,类型转换异常: ...

  • 面向对象编程(中)

    继承性(inheritance) 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类 中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可 多个类称为子类(派生类),单独的这个类称为父类 ...

  • 一些JavaSE学习过程中的思路整理(一)(主观性强,持续更新中...)

    目录 一些JavaSE学习过程中的思路整理(一)(主观性强,持续更新中...) Java书写规范 IDEA的一些常用快捷键 Java类中作为成员变量的类 Java源文件中只能有一个public类 Ja ...

  • java学习——120.JDBC数据库连接(二)

    如果已经有了项目,可以直接在项目那里添加驱动包,不一定非得新建项目时才添加. 如图,我在已有的项目Lay_lunwenpinyue中添加JDBC驱动包. 首先,在项目处右键,在弹出来的快捷菜单中选中& ...

  • java学习——28.类和对象

    面向对象程序设计(Object Oriented Programming,OOP)是基于对象概念的软件设计方法. Java是纯面向对象的程序设计语言,具有面向对象的所有的特性. 今天介绍类和对象. 面 ...

  • Java学习——14基本结构(二)switch语句

    if语句在分支少时比较方便. 但如果分支多,并且多个分支同级别就由一个表达式的取值决定时,if语句就会显得比较繁杂. switch语句即是根据表达式的取值决定控制程序的多路分支流程. 1.       ...

  • Java学习——36、类的多态(一)

    多态性是指"一种定义,多种实现".例如,画画.同是画画,但每一个人,会画出来不同的画,这就是多态. 多态主要有方法的多态和类型的多态. 今天介绍方法的多态. 方法的多态包括方法的重 ...

  • java学习——88.菜单(二)

    上篇仅介绍了菜单,大部分情况下,菜单是有二级菜单的,也即菜单项. 1.  菜单项 菜单项为菜单的最小单位,不能再分解了.一股情况下,菜单项都代表着某一种功能. 其类名为JMenuItem,其类声明如下 ...

  • java学习——49.标签、文本行、按钮类

    java学习——49.标签、文本行、按钮类

  • java学习——48.容器、窗口、面板和框架类

    java学习——48.容器、窗口、面板和框架类

  • java学习——47、AWT组件类

    AWT(Abstract Window Tookit,抽象窗口工具集),主要包括组件(component).容器(container).窗口(Window).面板(Panel).框架(Frame).对 ...

  • java学习——45、自定义异常类

    之前抛出的均为Exception异常,只能在catch(Exception e){}中被捕获并处理,但由catch(Exception e)捕获到的异常对象包含了Java定义的所有的异常对象. 如果要 ...