概念:
声明父类变量来引用子类对象,或者声明接口变量来引用实现类对象
使用多态前提:
必须有继承或者实现条件下才能使用多态
语法规则:
父类的引用(变量)可以指向子类的对象
可以将子类的对象赋值给父类类型的变量
多态优点:
- 多态作用在形参上,可以接受更多的数据类型
- 多态作用在返回值类型上,可以返回更多的数据类型
多态特点:
- 多态情况下,子类和父类存在同名的成员属(静态和非静态)性时,访问的是父类的成员属性
- 多态情况下,子类和父类存在同名的非静态成员函数时,访问的是子类的非静态函数
- 多态情况下,子类和父类存在同名的静态成员函数时,访问的是父类的静态函数
- 多态情况下,接口和实现类中存在函数,调用时访问的是实现类的函数
多态的调用:
1、向上转型
Teacher teacher=new Teacher();
//new 出来的称为对象的类型
//声明出来的 称之引用的类型
一般的情况: 对象类型和引用的类型是同一种数据类型
向上转型是指: 子类对象 赋予 父类的引用,向上转型是非常的安全
Person person=new Teacher();
2.向下转型
向下转型: 把父类引用 赋予子类引用
Student student=new Person();//绝对错误
这是错误是Type mismatch: cannot convert from Person to Student 类型不匹配:无法从个人转换为学生
Student student2= (Student) person ;
student2.home();//绝对错误
这是错误是Teacher cannot be cast to duotai.Student 老师不能投给多台,学生
Person person1=new Student();
Student student1= (Student) person1 ;////向下转型不安全,能否转型成功取决于父类引用中保存的是哪个子类对象
student1.home();
必须判断父类引用中到底保存的是哪个类型的对象才可以向下转型,否则报错
instanceof
nstanceof 如果是,返回 ture 否则是false
写法格式:
- Person person2 =new Teacher();
- if(person2 instanceof Teacher ){
- Teacher teacher1 = (Teacher)person2;
- teacher1.home();
- }
代码如下:
public class Person {
public String name;
public String job;
public int age;
public char sex;
public void present() {
System.out.println("人高高兴兴地度过每一天");
}
public void work() {
System.out.println("对工作认真地负责");
}
}
public class Teacher extends Person {
public void shool() {
super.name="王五";
job="师范大学";
System.out.println(name+"在"+job+"教Java课");
}
public void home() {
super.name="王五";
System.out.println(name+"的家家庭充满知识的气氛");
}
}
public class Student extends Person{
String name="小花";
protected void operating() {
age=17;
System.out.println(name+"在"+age+"上高三");
}
public void home() {
System.out.println(name+"在家庭看书");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 向上转型
Teacher teacher=new Teacher();
teacher.shool();
//向下转型 把父类引用 赋予子类引用
// Type mismatch: cannot convert from Person to Student
Student student=new Student() ;
//Dog dog = (Dog)animal; //向下转型
student.operating();
Person person=new Teacher();
person.work();
Person person1=new Student();
Student student1= (Student) person1 ;
student1.home();
//instanceof 如果是,返回 ture 否则是false
Person person2 =new Teacher();
if(person2 instanceof Teacher ){
Teacher teacher1 = (Teacher)person2;
teacher1.home();
}
}
}