1、多态的定义
指父类的某个方法被子类重写时,可以产生自己的功能行为,子类对象调用同名方法时优先调用子类重写的方法。
实现前提:
1、必须有继承或接口的实现
2、子类对象指向父类的引用
3、通过父类对象掉用方法时,调用的子类对象方法。
语法: 子类 对象名 =new 子类();
Cat cat=new Cat()
Animal animal=new Cat();
public class Animal {//Animal类,父类
public void bark() {
System.out.println("叫叫叫");
}
public void showbark(Animal animal) {
animal.bark();
}
}
class Cat extends Animal {//猫咪类继承动物类
@Override
public void bark() {
System.out.println("喵喵喵");
}
@Override
public void showbark(Animal animal) {
animal.bark();
}
}
class Dog extends Animal {//狗类继承动物类
@Override
public void bark() {
System.out.println("汪汪汪");
}
@Override
public void showbark(Animal animal) {
animal.bark();
}
public void Seehome() {
System.out.println("看家!");
}
}
public static void main(String[] args) {//测试类
//多态
Animal animal=new Animal();
animal.showbark(animal);
System.out.println("----------");
Dog dog=new Dog();
dog.Seehome();
dog.showbark(animal);
System.out.println("----------");
Dog animal1=(Dog) new Animal();
animal1.Seehome();
System.out.println("---------");
//传统
Cat cat=new Cat();
//cat.bark();
cat.showbark(dog);
}
对象转型 上转型和下转型
2.1上转型对象
如果A类是B类的父类,当我们创建子类对象时,并把这个对象引用到父类的对象中时,称为子类对象的上转型。
例如:A a;
B b=new B() ;//A a=new B();
a=b;
称父类对象a是子类对象b的上转型对象。(就好像说:老虎是哺乳动物。)
特点:
1、上转型对象由子类负责创建,转型为父类对象,会失去子类的一些属性和功能。
子类对象:新增方法、变量;继承的变量,继承或重写的方法;
上转型对象:只剩继承的变量,继承或重写的方法发。
2、不能操作子类对象的新增成员变量和方法(已丢失)。
3、如果子类重写了父类的某个方法,上转型对象调用此方法时一定是调用重写的方法。
public static void main(String[] args) {
A a1=new A();
A a2=new B();//a2显然是B类子对象的上转型对象
//这里的话a2只能调用B类重写了A类和继承至A类的方法。
B b=new B();
C c=new C();
D d=new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
class A{
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A{
public String show(B obj){//a2是上转型对象,
//所以不能调用B类的新增方法public String show(B obj)
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B{
}
class D extends B{
}
2.2下转型对象
可以将一个对象的上转型对象强制转换到一个下转型对象,这时该子类对象又具备了子类所有的属性和功能。(转型前的对象必须是转型后对象的上转型对象才能被下溯。)
3.0Java的绑定原理
java的绑定机制有两种:
1、编译期间进行的绑定(静态绑定、前期绑定)
对象的属性以及对象的类方法与变量的声明类型进行绑定。
2、 java在运行时动态决定实例方法的调用(后期绑定,late binding)
根据引用的实体来决定实例方法的调用。(正因为动态绑定才实现了Java的多态行为)
扩展:instanceof
判断当前对象是否是一个类的实例。
eg:
System.out.println("----------");
System.out.println(cat instanceof Animal);
System.out.println(cat instanceof Cat);