文章目录
1. 面向对象
面向对象即万事万物皆对象,其编程的核心点有三:
1.先编写类
2.使用类创建对象
3.通过类.对象名去调用类里的方法(使用对象)
面向对象有三大特征—封装、继承、多态。这里来描述一下个人对多态的理解。
2. 多态
多态的概念
通过相同的代码语句,根据需求去调用相应类里的方法,即执行方法一致,结果不一致。因此多态可以非常有效的缩减代码。
实现多态的前提条件
1.需要有继承
2.要有父类类型去接收子类类型的参数
3.重写(不必需)
多态的体现方式
第一种:父类类型作为参数出现
eg.
public abstract class Pet(){
public abstract void eat();
}
public class Dog extends Pet(){
public void eat(){
sout("小狗吃骨头");
}
}
public class Cat extends Pet{
public void eat(){
sout("小猫吃鱼");
}
}
public class Master(){
//父类类型作为参数
public void feed(Pet pet){
pet.eat();
}
}
在main方法里运行时,直接对Master类创建对象,master.feed(dog)
可调用
原因:
Pet为表面类型,仅仅决定是否可以调用此方法;
而真实类型是决定要调用哪个类的方法,即传进去的那个参数,例如master.feed(dog)
。Dog子类继承于Pet父类,在子类里重写了eat方法,传进去的真实类型是Dog类对象,可以直接调用Dog类里的eat方法。
第二种:父类类型作为返回值类型
第一种父类作为参数类型的方式,由于表面类型(调用的方法必须是父类中也存在的,不能调用子类中单独享有的方法),所以有一定的限制性,故还有一种返回值类型的多态使用方式。
//假定此方法写在Test类里
public Pet getPet(int num){
if (num == 1){
//返回一个狗类的对象
return new Dog();
/*
eg.
这里可以直接return new Dog(name,sex,type);
来直接进行赋值,方便后面的输出
*/
}else
//返回一个猫类的对象
return new Cat();
}
//Test类
public class Test(){
Test test = new Test();
Scanner in = new Scanner(System.in);
System.out.println("请输入您要领养的宠物:1.狗狗 2.小猫");
int choose = in.nextInt();
psvm{
Pet pet = test.getPet(choose);
pet.setName("明明");//公共属性直接赋值
pet.setHealth(30);//公共属性
pet.setLove(50);//公共属性
//由于调用getPet方法时就会返回一个对应的子类对象给父类,正好对应多态前提条件第二条:需要有父类类型去接收子类类型的参数
//通过父类对象直接调用
pet.eat();
/*
这里与第一种方式不同的是可以调用子类私有的属性和方法
要使用到instanceof关键字进行判断
*/
}
}
多态细节
第一种:向上转型
父类类型接收子类对象:
父类 变量名 = new 子类()
;是类型准换,自动类型转换
向上转型优点:实现多态
向上转型缺点:不能调用子类特有的属性和方法,只能调用父类存在的属性和方法
第二种:向下转型 父类—>子类
子类 变量 = (子类) 父类对象
向下转型优点:调用子类特有的属性和方法
向下转型缺点:可能会产出ClassCastExcepiton异常(类型转换异常)(instanceof关键字判断)
eg.
instanceof关键字
语法:
对象 instanceof 类
表达式结果:boolean 判断该对象是否是类的对象或者子类对象:如果是,返回true;否则false
经验:
在进行向下转型的时候,先使用instanceof进行判断,避免出现ClassCastExcepiton异常