Java多态
概念
多态:面向对象的三大特性之一
多态一句话概括就是,一个类下面的不同子类的实例,对同一个参数输入,得到不同的输出
举例:动物类下的小猫、小狗,两只动物分别拍一下,小猫输出“喵喵喵”,小狗输出“汪汪汪”。
实现方式
多态的方式:类的继承,方法的重载和重写
Animal.java
package oop;
public class Animal {
// 参数:拍打次数
public void shot(int times) {
System.out.println("不知名动物叫声...嘤嘤嘤 × " + times);
}
}
Dog.java
package oop;
public class Dog extends Animal{
private String name;
public Dog(String name) {
this.name = name;
}
// 重写shot方法
public void shot(int times) {
System.out.println("我是狗,我叫" + this.name + ",汪汪汪 × " + times);
}
// 狗撕咬沙发
public void biteSofa(){
System.out.println(this.name+"---又咬沙发了");
}
}
Cat.java
package oop;
public class Cat extends Animal {
private String name;
public Cat(String name) {
this.name = name;
}
// 重写shot方法
public void shot(int times) {
System.out.println("我是猫,我叫" + this.name + ",喵喵喵 × " + times);
}
}
FstJava.java
package oop;
public class FstJava {
public static void main(String[] args) {
Animal animal = new Animal();
Animal dog = new Dog("旺财");
Animal cat = new Cat("咕噜");
animal.shot(2);
dog.shot(3);
// dog.biteSofa() //此处不能执行
cat.shot(5);
}
}
对于“拍打次数”这个参数,猫和狗的反应是不一样的
上转型对象
思考:上述代码中,猫狗的对象创建都是
父类 变量名 = new 具体子类()
这样创建的字类,只能执行重写父类的方法,例如“狗”类中,定义了“撕咬沙发”的方法,由于Animal类中没有这个方法,所以对象dog不能执行“撕咬沙发”
这就是上转型对象
概念:上转型对象是指将一个子类对象赋值给一个父类类型的变量,此时该变量所引用的对象就是上转型对象
(可以理解为子类赋值给父类变量,父类不能承接子类的特殊方法,所以对于子类对象来说,特殊方法暂时作废)
思考:上转型对象有何用?
理解:上转型对象也是多态的一种体现,当不确定程序到底会接受哪种子类类型,且确定会执行与父类相同的方法,就可以使用上转型对象,保证了程序的可扩展性
(越原始的东西越方便扩展)
public class FstJava {
public static void main(String[] args) {
// 不确定ani 是猫还是狗,所以用Animal类声明
Animal ani = null;
Dog d = new Dog("dog");
Cat c = new Cat("cat");
// 确定了ani 是 Dog
ani = d;
ani.shot(3);
}
}
那要执行Dog特有的“撕咬沙发”,有两种方法
方式一:明确类对象的声明创建
Dog dog = new Dog(“旺财”)
dog.biteSofa()
方式二:把上转型对象通过强制类型转换,转换成子类对象
上转型对象是指将一个子类对象赋值给一个父类类型的变量,本质还是一个子类对象,强制类型转换可以把“暂时失去的子类方法”恢复回来
这个方式也叫“下转型”
(转上去的,再转下来就好了)
注意:向下转型前提是,已经存在经过向上转型的对象,对这个对象才能做向下转型,不存在 “子类 变量 = new 父类()”
public class FstJava {
public static void main(String[] args) {
Animal animal = new Animal();
Animal dog = new Dog("旺财");
Animal cat = new Cat("咕噜");
animal.shot(2);
dog.shot(3);
cat.shot(5);
// 强制转换,向下转型
((Dog)dog).biteSofa();
}
}
标签:shot,name,--,子类,多态,Dog,Animal,Java,public
From: https://blog.csdn.net/2402_89573492/article/details/144703362