资讯动态

Java 4——方法的重写 多态

发布时间:2026/8/22 12:04:52 来源:尧图企业网站定制
方法的重写重写子类对父类中提供的方法进行重新定义语法子类和父类中的方法的声明即方法名参数列表返回值类型完全一致重写又被称为方法的覆盖public class LiYuan { public void makeCountry(){ System.out.println(李渊想建立一个自己的国家); } } public class LiShiMing extends LiYuan{ //子类中的方法必须和父类中的方法完全一致 public void makeCountry(){ //半盖 super.makeCountry();//super可以调用父类中被重写了的内容 System.out.println(李世明也想建立一个自己的国家); } public static void main(String[] args) { LiShiMing l new LiShiMing(); l.makeCountry(); } } /*输出 李渊想建立一个自己的国家 李世明也想建立一个自己的国家 */规则规则说明方法签名必须相同方法名 参数列表顺序、个数、类型完全一致返回值类型可以更小允许返回父类返回类型的子类称为协变返回类型JDK 1.5访问权限不能更严格父类public→ 子类只能是public父类protected→ 子类可以是protected或public不能重写private方法private方法在子类中不可见无法重写但可以定义同名方法那是一个新方法不能重写final方法被final修饰的方法不能被重写不能重写static方法静态方法属于类不存在重写子类可以定义同名静态方法称为“隐藏”不能抛出比父类更宽泛的异常子类方法抛出的异常类型必须是父类方法抛出异常的子类或相同重写vs重载比较项重写Override重载Overload发生范围子类与父类之间同一个类中方法名必须相同必须相同参数列表必须相同必须不同个数、类型、顺序返回值相同或协变可以不同修饰符不能更严格无限制异常不能抛出更宽泛的异常无限制静态方法不能被重写只能隐藏可以重载多态多态同一个对象拥有多种形态是面向对象编程的三大特性之一封装、继承、多态。它允许同一个行为具有多个不同表现形式或者说一个接口多种实现。前提条件1.继承关系或接口实现2.方法重写子类重写父类的方法3.父类引用指向子类对象Animal a new Dog(); // 父类引用指向子类对象 a.sound(); // 调用的是 Dog 的 sound()作用把不同的数据类型进行统一让程序具有超强的可拓展性//猫是一种懂动物 public class Animal { public void eat() { System.out.println(猫吃鱼); } } //猫是一种动物 - 继承关系 //可以把猫当成动物来看 public class Cat extends Animal{ public void eat() { System.out.println(猫吃鱼); } } public class Dog extends Animal{ public void eat(){ System.out.println(狗吃骨头); } } public class Person { // public void feedCat(Cat c) { // c.eat(); // } // public void feedDog(Dog d) { // d.eat(); // } // public void feedDaXiang(DaXiang dx) { // dx.eat(); // } public void feed(Animal ani) { //接收到的所有动物都是animal ani.eat(); } } public class Client { public static void main(String[] args) { // Cat c new Cat(); // Dog d new Dog(); // Person p new Person(); // p.feedCat(c); // p.feedDog(d); //Cat c new Cat();//创建一只猫 Animal ani1 new Cat();//可以把猫当成动物来看把子类的对象赋值给父类的引用变量 向上转型 Animal ani2 new Dog(); Animal ani3 new DaXiang(); Person p new Person(); p.feed(ani1); p.feed(ani2); p.feed(ani3); //多态把不同的数据类型进行统一 } }多态的两种形式形式示例基于继承的多态Parent p new Child();基于接口的多态List list new ArrayList();多态中的成员访问成员类型编译看左边父类运行看右边子类成员变量✅ 父类变量❌ 子类变量不可见成员方法父类声明的方法✅ 子类重写的方法静态方法父类方法不存在重写父类方法向上转型向下转型把子类的对象赋值给父类的变量 - 向上转型(缺点屏蔽掉子类中特有的方法把父类的变量转化回子类的变量 - 向下转型向下转型有可能会有风险 Java要求必须要写强制类型转换格式(转换之后的数据类型)变量//猫是一种懂动物 public class Animal { public void eat() { System.out.println(猫吃鱼); } } //猫是一种动物 - 继承关系 //可以把猫当成动物来看 public class Cat extends Animal{ public void eat() { System.out.println(猫吃鱼); } public void catchMouse() { System.out.println(猫喜欢抓老鼠); } } public class Dog extends Animal{ public void eat(){ System.out.println(狗吃骨头); } } public class Person { // public void feedCat(Cat c) { // c.eat(); // } // public void feedDog(Dog d) { // d.eat(); // } // public void feedDaXiang(DaXiang dx) { // dx.eat(); // } public void feed(Animal ani) { //接收到的所有动物都是animal ani.eat(); } } public class Client { public static void main(String[] args) { // Cat c new Cat(); // Dog d new Dog(); // Person p new Person(); // p.feedCat(c); // p.feedDog(d); //Cat c new Cat();//创建一只猫 Animal ani1 new Cat();//可以把猫当成动物来看把子类的对象赋值给父类的引用变量 向上转型 但是向上转型会屏蔽掉子类中特有的方法 Animal ani2 new Dog(); Animal ani3 new DaXiang(); // Person p new Person(); // p.feed(ani1); // p.feed(ani2); // p.feed(ani3); //多态把不同的数据类型进行统一 //向下转型 Cat cc (Cat)ani1; cc.catchMouse();//猫又可以抓老鼠了 } }多态与重写、重载的关系概念关系多态 重写动态绑定运行时决定调用哪个方法多态的核心机制多态 重载重载是编译时决定静态多态属于早期绑定不是真正的多态应用场景1.方法参数接收父类类型传入任意子类对象。2.返回值返回父类类型实际返回子类对象。3.数组/集合存储父类类型的元素实际放入子类对象。// 集合多态 ListAnimal list new ArrayList(); list.add(new Dog()); list.add(new Cat());误区误区正确理解父类引用不能调用子类新增方法是的需要向下转型才能调用成员变量也具有多态错误成员变量没有多态编译看左边静态方法可以被重写从而实现多态错误静态方法不能被重写没有多态private方法可以被重写错误private方法对子类不可见

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价