Java 多态①

发布时间:2026/7/24 18:01:47
Java 多态① 目录1. 什么是多态2. 构成多态的条件3. 重写3.1 条件和注意点3.2 向上转型3.3 重写4. 静态绑定和动态绑定4.1 什么是静态绑定4.2 什么是动态态绑定1. 什么是多态不同对象完成相同的行为,产生不同的结果例如产生产生写代码C语言JavaC语言程序Java程序2. 构成多态的条件必须有继承关系//没有继承不能形成多态classStudentextendsPerson必须有方法重写classAnimal{publicvoideat(){System.out.println(name正在吃);}}classDogextendsAnimal{publicvoideat(){System.out.println(name正在吃狗粮);}}3. 重写3.1 条件和注意点构成重写的条件 子类的权限修饰关键字必须父类的。子类和父类的方法名称必须一样。子类和父类的方法的参数列表必须一样即参数类型、参数顺序、参数个数相同。子类和父类的方法的返回类型必须相同除返回类型构成父子关系注意被以下关键字修饰的方法无法构成重写 final修饰的方法private修饰的方法static修饰的方法3.2 向上转型子类对象赋值给父类引用方式①直接赋值classAnimal{publicvoideat(){System.out.println(动物吃东西);}}classDogextendsAnimal{publicvoidbark(){System.out.println(狗叫);}}publicclassTest{publicstaticvoidmain(String[]args){AnimalaninewDog();}}方式② :通过方法传参classAnimal{intage;Stringname;publicvoideat(){System.out.println(name正在吃);}publicAnimal(Stringname,intage){this.namename;this.ageage;}publicvoidsleep(){System.out.println(name正在睡觉);}}classDogextendsAnimal{Stringbreed;publicDog(Stringname,intage,Stringbreed){super(name,age);this.breedbreed;}publicvoideat(){System.out.println(name正在吃狗粮);}}publicclassTest{publicstaticvoidfunc(Animalani){ani.eat();}publicstaticvoidmain(String[]args){DogdognewDog(B,7,black);func(dog);}}3.3 重写classAnimal{intage;Stringname;publicvoideat(){System.out.println(name正在吃);}publicAnimal(Stringname,intage){this.namename;this.ageage;}}classDogextendsAnimal{Stringbreed;publicDog(Stringname,intage,Stringbreed){super(name,age);this.breedbreed;}publicvoideat(){System.out.println(name正在吃狗粮);}}publicclassTest{publicstaticvoidmain(String[]args){AnimalaninewDog(A,10,golden);ani.eat();}}返回值类型构成父子关系的重写classAnimal{Stringname;publicAnimaleat(){AnimalaninewAnimal();System.out.println(name正在吃);returnani;}}classDogextendsAnimal{publicDogeat(){DogdnewDog();System.out.println(name正在吃狗粮);returnd;}}publicclassTest{publicstaticvoidmain(String[]args){AnimalaninewDog();ani.nameA;ani.eat();}}向上转型后父类引用只能访问父类中声明的成员变量和成员方法如果子类重写了父类的方法调用时会执行子类重写的方法。classAnimal{intage;Stringname;publicvoideat(){System.out.println(name正在吃);}publicAnimal(Stringname,intage){this.namename;this.ageage;}publicvoidsleep(){System.out.println(name正在睡觉);}}classDogextendsAnimal{Stringbreed;publicDog(Stringname,intage,Stringbreed){super(name,age);this.breedbreed;}publicvoideat(){System.out.println(name正在吃狗粮);}}publicclassTest{publicstaticvoidmain(String[]args){AnimalaninewDog(A,10,golden);ani.eat();ani.breedgrey;//❌ani.sleep();//✅}}屏蔽错误代码加上错误代码4. 静态绑定和动态绑定4.1 什么是静态绑定publicclassTest{publicstaticvoidprint(){System.out.println(无参数 print);}publicstaticvoidprint(inta){System.out.println(参数a print);}publicstaticvoidmain(String[]args){print();print(1);}}静态绑定在编译阶段根据参数来确定执行哪个方法4.2 什么是动态态绑定classAnimal{intage;Stringname;publicvoideat(){System.out.println(name正在吃);}publicAnimal(Stringname,intage){this.namename;this.ageage;}}classDogextendsAnimal{Stringbreed;publicDog(Stringname,intage,Stringbreed){super(name,age);this.breedbreed;}publicvoideat(){System.out.println(name正在吃狗粮);}}publicclassTest{publicstaticvoidmain(String[]args){AnimalaninewDog(A,10,golden);ani.eat();}}通过字节码文件可以看到编译的时候还是Animal的eat方法。但是程序运行的时候变成了子类的eat , 这个过程叫做动态绑定。动态绑定即在编译时不能确定方法的行为需要等到程序运行时才能够确定具体调用那个类的方法。