1.多态的基本使用
1.前提:
a.必须有子父类继承关系,或者接口实现关系
b.必须有方法的重写(没有方法的重写多态没有意义)
c.父类引用指向子类对象:
父类类型 对象名 = new 子类对象() -> 好比是 double b = 10
2.使用:
a.创建子类,继承父类
b.重写父类方法
c.创建对象,调用重写的方法
3.注意:
多态条件下,不能直接调用子类特有功能
public class Animal {
public void eat(){
System.out.println("动物要进食");
}
}
public class Dog extends Animal{
public void eat(){
System.out.println("狗");
}
public void lookDoor(){
System.out.println("狗能看家");
}
}
public class Test01 {
public static void main(String[] args) {
//原始方式
Dog dog = new Dog();
dog.eat();
dog.lookDoor();
Animal animal = new Dog();
animal.eat();//重写的
//animal.lookDoor();//多态前提下,不能直接调用子类特有方法
}
}
2.多态的条件下成员的访问特点
成员变量的访问:看等号左边是谁
public class Fu {
int num=1000;
}
public class Zi extends Fu{
int num=100;
}
public class test02 {
public static void main(String[] args) {
Fu fu=new Zi();
System.out.println(fu.num);
}
}
成员方法的访问:看new的是谁
public class Fu {
int num=1000;
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu{
int num=100;
@Override
public void method(){
System.out.println("我是子类中的method方法");
}
}
public class test02 {
public static void main(String[] args) {
Fu fu=new Zi();
System.out.println(fu.num);
fu.method();
}
}
3.多态的好处(为什么学多态)
1.原始方式:
a.好处:既能调用重写的,还能调用子类特有的,还能调用继承的
b.弊端:扩展性差
2.多态方式:
a.好处:扩展性强
b.不能直接调用子类特有功能,只能调用重写的
4.多态中的转型
向上转型
父类引用指向子类对象 -> 向上转型 -> 多态默认的
向下转型
1.概述:向下转型其实就是强转,实质上就是将父类类型转成子类类型
2.比如:
Animal animal = new Dog() -> 向上转型
Dog dog = (Dog)animal; -> 向下转型 ->可以访问子类特有方法
public static void method(Animal animal){
animal.eat();
//向下转型
Dog dog = (Dog) animal;
dog.lookDoor();
}
5.转型可能会出现的问题
1.向下转型容易出现的问题:
ClassCastException:类型转换异常
2.什么时候出现:
当转型的时候等号左右两边类型不一致时
3.解决:
先判断类型,再强转成对应的类型
4.关键字: instanceof -> 判断类型
5.使用:
对象名 instanceof 类型 -> 判断关键字前面的对象是否属于关键字后面的类型
public class Test01 {
public static void main(String[] args) {
Dog dog = new Dog();
method(dog);
Cat cat = new Cat();
method(cat);
}
public static void method(Animal animal){
animal.eat();
if (animal instanceof Dog){
//向下转型
Dog dog = (Dog) animal;
dog.lookDoor();
}
if (animal instanceof Cat){
Cat cat = (Cat) animal;
cat.catchMouse();
}
}
}