Java学习——36、类的多态(一)
多态性是指“一种定义,多种实现”。例如,画画。同是画画,但每一个人,会画出来不同的画,这就是多态。
多态主要有方法的多态和类型的多态。
今天介绍方法的多态。
方法的多态包括方法的重载和覆盖,为一种功能提供多种实现。
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.