分享

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

 pythonjava学习 2021-04-06

多态性是指“一种定义,多种实现”。例如,画画。同是画画,但每一个人,会画出来不同的画,这就是多态。

多态主要有方法的多态和类型的多态。

今天介绍方法的多态。

方法的多态包括方法的重载和覆盖,为一种功能提供多种实现。

1、方法的重载

与一般方法的重载类似,只是在多态里面涉及到两个类而已。

例:

在本例中,父类中有set(String name)方法,在子类中对其进行了重载set(String name,String number)。在调用时,Java虚拟机能自动分清到底是父类的set方法还是子类的set方法。

class Person{

    private String name;

    public Person(){

        this("张熹熹");

    }

    public Person(String name){

        this.name=name;

    }

    public void set(String name){

        this.name=name;

    }

    public void show(){

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

    }

}

public class Student extends Person{

    private String number;

    public Student(){

        number="123";

    }

    public Student(String number){

        super();

        this.number=number;

    }

    public void show(){

        super.show();//调用父类的方法

        System.out.println("学号:"+number);

    }

    public void set(String name,Stringnumber){

        super.set(name);

        this.number=number;

    }

    public static void main(String args[]){

        Student s1=new Student();

        s1.set("李老师");

        s1.show();

        Student s2=new Student("645");

        s2.set("lay", "107");

        s2.show(); 

    }  

}

其运行结果如下:

姓名:李老师

学号:123

姓名:lay

学号:107

2、方法的覆盖

子类继承父类的所有成员,但当父类的成员不能满足子类需要时,子类不能删除它们,但可以重定义。覆盖即与父类有相同的方法名和参数类型,此时,子类可重写功能。

上例当中,也有方法的覆盖。

在父类中有一个show方法,子类中同样有一个show方法,均为不带参数的方法。即为子类覆盖了父类的show方法。

//父类Person中的show()方法

public void show(){

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

    }

//子类Student中的show()方法

public void show(){

        super.show();//调用父类的方法

        System.out.println("学号:"+number);

    }

在上例main方法中用对象调用show方法时,调用的是子类的show方法,输出姓名和学号。

  • 子类覆盖父类的方法,既可以完全重写,也可以扩展父类方法的功能。本例中是扩展了父类的方法,在子类方法中第一行用super.show();//先调用父类的方法,然后在后面再增加了子类中新的功能,输出学号。

  • 在程序运行时,究竟执行的覆盖同名方法中的哪一个,取决于调用该方法的对象所属的类是父类还是子类。

例如上例,若将main方法改为如下:

    public static void main(String args[]){

        Personp=newPerson();

        p.show();

        Students1=newStudent();

        s1.show();

    }  

其运行结果为:

姓名:张熹熹

姓名:张熹熹

学号:123

main方法中,首先创建了一个Person类的对象p,再调用p.show(),此时调用的show()方法是Person类中的方法,只输出姓名。

而后面创建了Student的对象s1,再用此对象来调用show(),此时调用的就是Student中的show()方法,输出姓名和学号。

3、成员变量的隐藏

如果子类有和父类同名的成员变量,那么将隐藏父类的成员变量。

例:本例中,子类和父类中均有名为name的成员变量,子类隐藏了父类的name成员,故在输出时,只输出的是子类的name值。

注:如果要在子类中调用父类的隐藏成员变量,可以用super.

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多