多态
1. 实现多态需要具备哪些条件?
(1) 发生向上转型
(2) 需要方法的重写
1.1 什么是向上转型?
所谓的向上转型,就是将子类对象给到父类对象,换句话说,就是父类引用了当前对象的子类。
向上转型有三种方式:
(1) 直接赋值
public class Animal {
public String name;
public int age;
public Animal(String name){
this.name = name;
this.age = age;
}
}
class Dog extends Animal{
public Dog(String name,int age){
super(name, age);
}
}
class Test{
public static void main(String[] args) {
Dog dog = new Dog("旺财",3);//正常的实例化Dog对象
Animal animal = new Dog("旺财",4);//发生了向上转型的Dog对象
}
}
上面这段代码,定义了一个父类Animal
,一个子类Dog
继承自Animal
,在下面main
函数中,第一行实例化了一个Dog
对象,第二行就是一个实现了向上转型的Dog
对象,即将子类Dog
对象给到父类Animal
对象。这就是向上转型的第一种形式直接赋值。
(2) 作为方法的参数进行传递
class Test{
public static void func(Animal animal){
animal.eat();
}
public static void main(String[] args) {
Dog dog1 = new Dog("旺财",3);//发生了向上转型的Dog对象
Dog dog2 = new Dog("阿黄",4);//发生了向上转型的Dog对象
func(dog1);
func(dog2);
}
}
输出结果:
旺财正在吃饭.....
阿黄正在吃饭.....
上面这段代码中,定义了一个func()
方法,形参为父类型的引用,可以任意接收子类对象。这种就是让父类型作为方法的参数进行传递的向上转型
(3) 作为返回值类型
class Test{
public static Animal func2(){
Dog dog = new Dog("旺财",3);
return dog;
}
public static void main(String[] args) {
Animal animal3 = func2();
}
}
func2
的返回值类型为父类型,当调用func2
时,可以用Animal
的对象接收。
1.2 什么是方法的重写?
当父类有一个方法时,子类的需求这个方法不能满足,子类就需要对父类的方法进行重写。
1.2.1 方法重写要符合三个要求:
(1)方法名相同
(2)参数列表相同(数据类型,顺序,个数)
(3)返回值类型相同
public class Animal {
public void eat(){
System.out.println(name + "正在吃饭.....");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println(name + "正在吃狗粮.....");
}
}
父类Animal
中有一个eat
方法,在Dog
子类中对eat
方法进行了重写。
1.2.2 重写的注意事项
(1)被 private, static, final
修饰的方法不能被重写
(2)子类中被重写的方法的访问权限要大于等于父类,比如父类是public
,子类必须是public
,父类是protected
,子类可以是protected
,也可以是public
2. 什么是多态?
2.1 多态的定义
所谓多态,就是一种事物的不同结果,简单来说就是同一件事情,发生在不同对象身上,就会产生不同的结果。
public class Book {
public String name;
public int Date;
public void type(){
System.out.println("这本书叫做:"+ name);
}
}
class English extends Book{
@Override
public void type() {
System.out.println("这是一本英语书");
}
}
class Chemistry extends Book{
@Override
public void type() {
System.out.println("这是一本化学书");
}
}
class Test {
public static void func(Book book){
book.type();
}
public static void main(String[] args) {
Book book1 = new English();
Book book2 = new Chemistry();
func(book1);
func(book2);
}
}
输出结果:
这是一本英语书
这是一本化学书
此时book
这个引用,引用的对象不同,当使用不同的对象调用type
方法时,会出现不同的结果,这就叫做多态。
2.2 多态的优缺点
优点:
多态可以降低 圈复杂度,(圈复杂度就是条件分支语句,循环语句的个数)
多态的扩展能力强
缺点:
成员变量没有多态性
构造方法没有多态性