1.类的的多态
(1)多态的定义:必须有继承或者实现关系,有方法重写,有父(类/接口)引用指向子类(实现类)对象
(2)类的多态:首先需要创建一个抽象(实体)类作为其父类,还需在创建一个实体类作为其子类然后创建对象用其父类引用指向子类对象就完成了类的多态创建,其中还可以用多态的转型对其转型(向上转型、向下转型),例如:
这里我创建一个人类为抽象类作为父类(person),在创建一个学生类作为子类(Student)还需创建一个Test测试类对其操作
子类与父类创建代码:
package XIao1;
public abstract class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("人每天都必须吃东西");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package XIao1;
public class Student extends Person {
private String id;
private String class1;
public Student(){}
public Student(String name, int age, String id, String class1) {
super(name, age);
this.id = id;
this.class1 = class1;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClass1() {
return class1;
}
public void setClass1(String class1) {
this.class1 = class1;
}
@Override
public void eat() {
//super.eat();
System.out.println(getName()+"喜欢吃烧烤");
}
}
首先创建一个无参的多态对象,调用eat方法;
Person ps=new Student(); ps.eat();
运行结果为子类的eat方法:
这里null是因为我们在子类中定义的name是String类型的,创建无参对象时(后面未对其属性赋值)系统会默认为其数据类型的值,String的默认数据就是NULL
为什么呢?是因为方法有了重写编译看父类,但执行看子类;编译看父类:系统编译时会找父类中是否有这重写方法,有了之后执行的时候就会看子类了,子类对其方法进行了重写,系统默认为子类方法,如果要想用父类中的eat方法,就得必须用关键字super(在子类的eat方法中添加此关键字)调用父类方法;
再次执行代码后你就能看见调用子类方法也能输出父类中此方法的内容
在创建一个有参对象其步骤都一样只是运行后结果会发生改变
向下转型,调用子类eat方法
2.集合的多态形式
(1)集合的多态形式与类的多态形式相似但也不同,其集合多态为集合的创建时范型内容必须相同才可以创建集合的多态,不能把范型中的子类或父类用对应的父类或子类来替代如:
正确创建多态集合方式:List<Student> students=new ArrayList<Student>();
错误创建方式:List<Person> personList=new ArrayList<Student>();或
List<Student> students1=new ArrayList<Person>();
Test测试类中代码:
package XIao1;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Person ps=new Student();
ps.eat();
System.out.println("---------------------");
Person ps1=new Student("张三",15,"001","八年级(2)班");
ps1.eat();
System.out.println("--------------------------");
Student ss=(Student) ps;
ss.eat();
// System.out.println("----------------------------");
// Person person=(Person) ps;
// person.eat();
List<Student> students=new ArrayList<Student>();
// List<Person> personList=new ArrayList<Student>();
//List<Student> students1=new ArrayList<Person>();
}
}