1.什么是多台:同种类型,表现不同形态.
2.多态的表现形式:父类类型 对象名称 = 子类对象.
3.多态的前提:
a.有继承/实现关系;
b.有父类引用指向子类对象; 例如:Fu f = new Zi();
c.有方法重写.
4,多态的好处:
使用父类作为参数,可以接受所有子类对象,体现多态的扩展性和便利.
public class Text {
public static void main(String[] args){
Student s= new Student("zhangsan" , 18 );
way(s);
Teacher t = new Teacher("lisi" , 19);
way(t);
}
//这个方法既能接受老师的信息,又能接受学生的信息
public static void way(Person p){
p.show();
}
}
class Person{
private String name;
private int age;
public Person(){};
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void show(){
System.out.println("信息为" + name + "," + age);
}
}
class Student extends Person{
public Student(){};
public Student(String name,int age){
super(name, age);
}
public void show(){
System.out.println("学生的信息为:" + getName() + "," + getAge());
}
}
class Teacher extends Person{
public Teacher(){};
public Teacher(String name,int age){
super(name,age);
}
public void show(){
System.out.println("老师的信息为:" + "," + getName() + "," + getAge());
}
}
5,多态调用成员的特点:
a.成员变量调用:编译看左边,运行也看左边;
Person p = new Student();
System.out.println(p.name);
编译看左边:Javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败;
运行也看左边:Java运行代码的时候,实际获取的就是左边父类中成员变量的值(理解:在子类的对象中,会把父类的成员变量继承下来,如果是子类类型就用子类的name,如果是父类类型的就用父类的name,如果子类中没有变量name就会用父类的);
b.成员方法调用:编译看左边,运行看右边.
Person p = new Student();
p.show();
编译看左边:Javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败;
运行看右边:Java运行代码的时候,实际上运行的是子类中的方法(理解:子类对方法进行了重写,虚方法表中父类的方法会被覆盖);
6.多态的优势:
a.在多态形态下,右边对象可以实现解耦合,便于维护和扩展;
Person p = new Student();//只需要修改new Student()
p.work();//业务逻辑发生改变时,后续代码无需修改
b.定义方法的时候,使用父类类型作为参数,可以接收所有子类对象,体现多态的扩展性和便利;
7.多态的弊端:
a.不能调用子类的特有功能
解决方法:强制类型转换为子类类型
细节:转换的时候不能乱转,如果转换成其他类的类型,就会报错
Person p = new Student();
Student s = (Student)p;//变回原来的Student类型
Teacher t = (Teacher)p;//乱转为其他类型,系统会报错
做一个判断来确定转换的类型:if(变量名 instanceof 类名){..}
if(p instanceof Student){
Student s = (Student) p;
...
}
新特性:if(变量名 instanceof 类名 新的类名){...}
if(a instanceof Student s){...}
8.引用数据类型的类型转换的方式:
a,自动类型转换
b.强制类型转换
Person p = new Student();//自动类型转换
Student s = (Student)p;//强制类型转换
标签:name,--,子类,age,多态,Student,父类,public,三大
From: https://blog.csdn.net/m0_73545557/article/details/137403955