文章目录
1.多态的概念
2.多态的实现条件
3.重写
总结
一 . 多态的概念
什么是多态? 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
定义一个基类Animal和两个派生类cat,dog,派生类重写基类中的eat()方法
定义Test测试类,用来测试方法method执行的结果。
public class Test { public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); method(dog); method(cat); } public static void method(Animal animal){ // 子类的对象由父类接受,称之为向上转型,反之,则为向下转型 animal.eat(); } } class Dog extends Animal{ @Override public void eat() { System.out.println("狗吃饭"); } } class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃饭"); } } class Animal{ String name; int age; public void eat(){ System.out.println("动物吃饭"); } }
代码执行结果
一个函数中,传入不同的对象,输出结果却不同,猫和狗在吃饭上有不同的表现形式,但却都是继承了
Animal类,一个对象在不同条件下所表现出的不同形式,这便是多态!
2.多态的实现条件
- 必须在继承条件下
- 子类必须对父类中要实现多态的方法进行重写
- 通过父类的引用调用重写的方法(实现多态的方法中的参数是父类)
3.重写
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
规则:
1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的
3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected
4.父类被static、private修饰的方法、构造方法都不能被重写。
5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心 将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法 构成重写.
重写和重载的区别:
静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。
public class Test { public static void main(String[] args) { Animal animal = new Dog(); System.out.println(animal.name); //调用成员变量:编译看左边,运行也看左边 //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。 //运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值 } } class Dog extends Animal{ String name = "狗"; int age = 2; @Override public void eat() { System.out.println("狗吃饭"); } } class Cat extends Animal{ String name = "猫"; int age = 2; @Override public void eat() { System.out.println("猫吃饭"); } } class Animal{ String name = "动物"; int age = 2; public void eat(){ System.out.println("动物吃饭"); } }
成员变量便是属于静态绑定
动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。
public class Test { public static void main(String[] args) { Animal animal = new Dog(); animal.eat(); //调用成员方法:编译看左边,运行看右边 //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。 //运行看右边:java运行代码的时候,实际上运行的是子类中的方法 } } class Dog extends Animal{ String name = "狗"; int age = 2; @Override public void eat() { System.out.println("狗吃饭"); } } class Cat extends Animal{ String name = "猫"; int age = 2; @Override public void eat() { System.out.println("猫吃饭"); } } class Animal{ String name = "动物"; int age = 2; public void eat(){ System.out.println("动物吃饭"); } }
成员方法属于动态绑定文章来源:https://www.toymoban.com/news/detail-444563.html
总结
以上便是多多态的相关内容了,望大家多多支持!文章来源地址https://www.toymoban.com/news/detail-444563.html
到了这里,关于JAVA-多态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!