DUFQ_2020.12.09-杜飞强-多态
Object类
object类是所有类的父类,在java中,所有的java类都直接或间接地继承了java.lang.Object类。
如果一个类没有显示继承父类,默认继承Object类。Object类中定义的属性和方法每个类都继承了
Object类中重要的方法:equals()和tostring()
方法重写
含义
子类从父类继承后,如果子类发现父类的方法不能满足子类的需要,此时子类可以重新在子类的类内再次定义一遍从父类继承的方法,这种重新定义父类方法的方式叫方法重写。
方法重写:override
方法重载:overload
方法重写的规则
重写方法与被重写方法必须有相同的方法名称
重写方法与被重写方法必须有相同的参数列表
重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类
写方法不能缩小被重写方法的访问权限
方法重载与方法重写的区别
重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关
重写涉及的是子类与父类之间的同名方法,要求方法名相同、参数列表相同、与返回值类型相同。
继承中的protected
protected是访问修饰符,是专门为继承而设计的访问修饰符。protected修饰的属性或方法在同包或者子类中可以访问
package cn.itlaobing.oop;
public class Person {
protected String name;
}
package itlaobing;
import cn.itlaobing.oop.Person;
public class Worker extends Person {
public static void main(String[] args) {
Worker w =new Worker();
Worker类与Person类不在同一个包中,但是worker类是Person类的子类,而person类中的name属性是protected访问修饰符修饰的,因此在子类workder中可以访问name属性。
多态
多态是面向对象的特征之一
含义
多态是多种形态,是指同一个行为有多种表现。
eg:
public abstract class Pet {
//定义父类属性
private String name;
//定义无参构造方法
public Pet() {
super();
}
//定义有参构造方法
public Pet(String name) {
super();
this.name = name;
}
//定义行为方法
public void toHospital(){
System.out.println("宠物"+this.name+"去看病!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重构父类方法
public void toHospital(String name) {
System.out.println("猫"+ getName()+"去看病");
}
//定义猫子类,继承宠物父类
public class Cat extends Pet{
//定义有参构造方法
public Cat(String name) {
super(name);
}
//定义无参构造方法
public Cat() {
}
//重写父类方法
@Override
public void toHospital() {
System.out.println("猫"+super.getName()+"去看病");
}
}
//定义狗子类继承宠物父类
public class Dog extends Pet{
//定义无参构造方法
public Dog() {
}
//定义有参构造方法
public Dog(String name) {
super(name);
}
//重写父类方法
@Override
public void toHospital() {
System.out.println("狗"+super.getName()+"去看病");
}
}
//定义一个宠物店
public class PetShop {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Pet pet = null;
System.out.println("请输入宠物,1.小狗 2.小猫");
int choice = sc.nextInt();
switch (choice){
case 1:
pet = new Dog("大黄");
break;
case 2:
pet = new Cat("花花");
break;
}
pet.toHospital();
if (pet instanceof Dog){
Dog dog = (Dog) pet;
}
if (pet instanceof Cat){
Cat cat = (Cat) pet;
}
}
}
多态:父类的引用指向子类的实例
当父类的引用指向子类对象后,在父类引用调用方法时,只能调用子类从父类继承的方法或被子类重写的方法(父类知道子类中有什么方法就能调用什么方法)
父类不能调用子类新增的方法,因为父类无法知道子类新增了什么方法
如果子类重写父类的方法,那么父类引用调用的就是子类的方法(父类引用指向哪个子类就调用哪个子类的方法)
父类引用指向子类对象时需要类型转换
父类引用 = 子类对象 不需要强制转换
子类引用 = 父类对象 需要强制转换
实现的三个条件
(1)子类继承父类,并且子类重写父类的方法
(2)父类引用指向子类对象(父类引用可以指向任意一个子类的对象)
(3)父类引用调用方法时,实际上调用的是子类的方法(父类指向哪个子类就调用哪个子类的方法),不同的子类有不同的方法实现,体现出同一个方法在不同子类中的不同形态的表现。
PS:多态一定存在于继承关系中
多态一定存在于方法重写中
多态一定存在于父类引用指向子类对象中,父类引用指向哪个子类就能调用哪个子类的方法
方法重写实现了多态
instanceof运算符
使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误。instanceof通常和强制性类型转换结合使用。
多态的应用
可替换性:多态对已存在的代码具有可替换性。
可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在的多态性、继承性,以及其他特性运算和操作。
接口性:多态是父类向子类提供了一个共同接口,由子类来具体实现。
灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。
简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时尤为重要。
评论留言