多态
定义:同一对象,执行同一方法,表现出不同的行为。
多态满足以下条件
存在继承关系,在继承的基础上,父类的引用指为不同的子类对象;有方法的重写,父类存在此方法,子类对其重写,表现不同的行为特征。
多态的表现形式
父类名 对象名 = new 子类名();//此为自动类型转换,右边的类型小于左边的类型
多态访问成员的特点
成员变量:编译看左,运行看左。
成员方法:编译看左,运行看右。
即 编译的时候父类中 属性名和方法一定是存在的。变量访问时还是父类中的变量,方法访问时执行子类中重写的方法。
多态的缺点
不能使用子类独有的功能,需进行强制转换,强转写法如下:
//强转写法1:
Animal1 cat = new Cat1();
Cat d = (Cat)dog;
//强转写法2
if (cat instanceof Cat1 c){
c.play(); //Cat1特有方法
}else {
System.out.println("类型无法转换");
}
多态使用示例
在这里插入代码片
public class FuZiTest3 {
public static void main(String[] args) {
Animal1 cat = new Cat1("happy"); //Animal1的有参构造方法
cat.eat(); //Cat1的eat方法
System.out.println(cat.getName()); //happy
if (cat instanceof Cat1 cat1) {
cat1.play(); //Cat1的play方法
} else {
System.out.println("类型无法转换");
}
Animal1 dog = new Dog1(); //Animal1的无参构造方法
dog.eat(); //Dog1的eat方法
cat.eatSome(cat); //Dog1的eat方法
dog.eatSome(dog); //Dog1的eat方法
}
}
class Animal1 {
String name;
public Animal1() {
System.out.println("Animal1的无参构造方法");
}
public Animal1(String name) {
this.name = name;
System.out.println("Animal1的有参构造方法");
}
public void eat() {
System.out.println("Animal1的eat方法");
}
public void eatSome(Animal1 animal1) {//使用父类型接收对象
animal1.eat();
}
public String getName() {
return name;
}
}
class Cat1 extends Animal1 {
public Cat1(String name) {
super(name);
}
public void eat() {
System.out.println("Cat1的eat方法");
}
public void play() {
System.out.println("Cat1的play方法");
}
}
class Dog1 extends Animal1 {
public void eat() {
System.out.println("Dog1的eat方法");
}
}
结果
Animal1的有参构造方法
Cat1的eat方法
happy
Cat1的play方法
Animal1的无参构造方法
Dog1的eat方法
Cat1的eat方法
Dog1的eat方法