wordpress 搭建网站,重庆建设管理信息网站,长安镇网站建设,免费网站如何做宣传多态
多态的概念 所谓多态#xff0c;通俗地讲#xff0c;就是多种形态#xff0c;具体点就是去完成某个行为#xff0c;当不同的对象去完成时会产生出不同的状态。 比如#xff1a; 这一时间爆火的“现代纪录片”中#xff0c;麦克阿瑟总是对各种“名人”有不同的评价通俗地讲就是多种形态具体点就是去完成某个行为当不同的对象去完成时会产生出不同的状态。 比如 这一时间爆火的“现代纪录片”中麦克阿瑟总是对各种“名人”有不同的评价这也可看做多态。
总的来说同一件事情发生在不同对象身上就会产生不同结果。
多态的实现条件
在Java中要实现多态必须满足以下几个条件缺一不可 1.必须在继承体系下向上转型 2.子类必须对父类中的方法进行重写 3.通过父类的引用调用重写的方法 多态体现在代码运行时当传递不同对象会调用对应类中的方法。
举个例子
class Animal {String name;int age;public Animal(String name, int age) {this.name name;this.age age;}public void eat() {System.out.println(name 吃饭);}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}Overridepublic void eat() {System.out.println(name 吃骨头);}
}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}Overridepublic void eat() {System.out.println(name 吃鱼干);}
}public class TestAnimal {//编译器在编译代码的同时并不知道要调用Cat还是Dog中的eat方法//等程序运行起来后形参a引用的具体对象确定后才知道调用哪个方法//注意此处的形参类型必须是父类类型才可以public static void eat(Animal a) {a.eat();}public static void main(String[] args) {Dog dog new Dog(小七, 2);Cat cat new Cat(元宝, 1);eat(dog);eat(cat);}
} 当类的调用者在编写eat这个方法时参数类型为Animal父类此时在该方法内部不知道 也不关注当前的a引用指向的是哪个类型哪个子类的实例。此时a这个引用调用的eat方法可能会有多种不同的表现和a引用的实例相关这个行为就叫多态。 重写 重写(override)也称为覆盖。重写是子类对父类非静态非private修饰非final修饰非构造方法等的实现过程进行重新编写返回值和形参都不能改变即外壳不变核心重写 重写的好处在于子类可以根据需要定义特定于自己的方法。也就是说子类能够根据需要实现父类的方法。 方法重写的规则 1.子类在重写父类的方法时一般必须与父类方法原型一致即返回值类型 方法名参数列表要完全一致 2.被重写的方法返回值类型可以不同但是必须具有父子关系的 3.访问权限不能比父类中被重写的方法的访问权限更低。例如如果父类方法被public修饰则子类中重写该方法就不能声明为protected 4.父类被static,private,final修饰的方法都不能被重写 5.重写的方法可以用Override注解来显式指定。有了这个注解能帮我们进行一些合法性的校验。例如不小心将方法名字拼写错了比如上面的eat错写为aet,这时编译器就会发现父类中没有aet方法就会显示编译报错 重写和重载的区别
区别点重写override重载overlaod参数列表一定不能修改必须修改返回类型一定不能修改除非可以构成父子类关系可以修改访问限定符不能做更严格的限制可以降低限制可以修改
即方法重载是一个类的多态性表现而方法重写是子类与父类的一种多态性表现
重写的设计原则 对于已经投入使用的类尽量不要进行修改。最好的方式是重新定义一个新的类来重复利用共性的内容并且添加或者改动新的内容。 例如若干年前的手机只能打电话发短信来电显示只能显示号码而今天的手机在来电显示的时候不仅仅可以显示电话号码还可以显示地区姓名等。在这个过程当中我们不应该在原来老的类上进行修改因为原来的类可能还有用户使用正确的做法是新建一个手机类对来电显示进行方法重写即可这就达到了今天的需求。 静态绑定也称为前期绑定早绑定即在编译时根据用户所传递实参类型就确定了具体调用哪个方法。典型代表函数重载。 动态绑定也成为后期绑定晚绑定即在编译时不能确定方法的行为需要等到程序运行时才能确定具体调用哪个方法。