一、多态介绍
1、在Java中,对象变量是多态的,一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象:
-
List list = new ArrayList(); //实现为不同的子类
-
List list = new LinkedList();
2、以多态的形式来传递参数,增强了参数类型的灵活性:
-
比如:public void getName(Collection col);
-
其中Collection就是接口,调用的时候可以传递任何的子类型,从而实现了多态
3、一个对象只能有一种确切的数据类型(new的时候只能有一种类型);
4、一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量不能访问子类中添加的属性和方法:
- List list = new ArrayList();
二、编程实战
代码的详细解读,可以参考视频教程
Person.java
/**
* User: 祁大聪
*/
public class Person {
private String name = "Person";
public void getName(){
System.out.println("name = " + name);
}
}
Girl.java
/**
* User: 祁大聪
*/
public class Girl extends Person{
@Override
public void getName() {
System.out.println("Girl name");
}
public void sing(){
System.out.println("Girl.sing");
}
}
Boy.java
/**
* User: 祁大聪
*/
public class Boy extends Person{
@Override
public void getName() {
System.out.println("Boy name");
}
public void dance(){
System.out.println("Boy.dance");
}
}
测试类:Test.java
/**
* User: 祁大聪
*/
public class Test {
public void printPerson(Person p){
p.getName();
}
public static void main(String[] args) {
Person p = new Person();
// p = new Girl();
p = new Boy(); // 父类可以实例化为任何一种子类,就是多态的表现
p.getName();
// p.dance(); // 这里面声明为Person,不能调用Boy的函数
Test t = new Test();
t.printPerson(new Boy()); // 可以传递不同的子类做为参数
t.printPerson(new Girl());
}
}