多态:
多态是具有表现多种形式的特征,就是同一个实现接口,使用不同的实例二执行不同的操作。
protected关键字修饰的属性、方法,只能同包,子类调用。
使用父类作为方法形参和使用父类作为返回值类型是使用多态的常用方式。
子类转成父类的规则:
- 将一个父类发的引用指向一个子类的对象,称为向上转型,自动进行类型转换。
- 此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
- 此时通过父类引用变量无法调用子类特有的方法。
使用父类作为方法的形参,是java中实现和使用多态的主要方法之一。
/*
* 父类里的主人类
*
* 父类作为方法返回值实现多态
*/
class Mass{
//姓名
private String namString=" ";
//元宝数
private int money=0;
//构造器
public Mass(String namString,int money){
this.namString=namString;
this.money=money;
}
//宠物
public void feed(SL3_1 pet) {
pet.eat();
}
//狗狗
public void feed(SL3_2 dog) {
dog.eat();
}
/*
* 狗狗,子类
*/
public class Zi extends Fu{
//品种
private String string;
//构造器
public SL3_2(String name, String string) {
super(name);
this.string=string;
}
//重写
public void LLgg() {
super.LLgg();
System.out.println("我是一只"+string+"。");
}
@Override
public void eat() {
super.health=super.health+3;
System.out.println("狗狗"+super.name+"吃饱啦~健康值加3");
}
}
/*
*测试类
*
*/
public class CS {
public static void main(String[] args) {
Mass mass=new Mass("李先生", 100);//主人类
Fu eat=new Zi("嗷嗷", "雪纳瑞"); //父类名在前,子类名在后
mass.feed(eat);//使用父类作为方法的形参
}
实现多态的三个条件:
- 继承的存在(继承是多态的基础,没有继承就没有多态)
- 子类重写父类的方法(多态下调用子类重写后的方法)
- 父类引用变量指向子类对象(子类到父类的类型转换)
父类到子类的转换(向下转换):{有"上"才有"下"}
当需要调用子类特有的方法时,可以通过将父类再转换成子类实现。
将一个指向子类对象的父类引用赋给一个子类的引用,成为向下转换,此时必须进行强制类型转换。
instanceof
运算符:
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或者false。
使用它的时候,对象的类型必须和它的第二个参数所指定的类或者接口在继承树上有上下级关系,否则会编译出错。
语法:对象 instanceof
类或者接口
instanceof
通常是和强制类型结合使用,先通过instanceof
进行类型判断,在进行相应的强制转换。
public class CS {
public static void main(String[] args) {
if(Fl instanceof Lei){ //通过`instanceof`进行类型判断
Dog dog = (Dog) Fl; //在进行相应的强制转换。
dog.FF(); //调用输出方法
}
}