java中的多态理解

多态存在的必要条件:1.继承 2.重写 3.父类引用指向子类对象    一句话就是  子类在重写了父类方法时候有父类的引用指向子类的对象产生,这个现象叫做多态。

 

1、java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法;

 

2、父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法;

 

3、对于java当中的方法而言,除了final,static,private 修饰的方法和构造方法是前期绑定外,其他的方法全部为动态绑定;(编译看左边,运行看右边)

 

本质:java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。

class Animal{
public Integer zz =220;
Animal(){
System.out.println("Animal");
}
public static void move(){
System.out.println("动物可以移动");
}
public void bark(){
System.out.println("動物可以吠叫");
}

public void bark123(){
System.out.println("動物可以吠叫");
}
}
class Dog extends Animal{
public Integer zz =200;
Dog(){
System.out.println("Dog");
}
public static void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}

public static void main(String[] args) {
Animal b = new Dog();
b.move();
}
}
class TestDog{
public static void main(String args[]){
// Animal b = new Dog();
// System.out.println(b.zz);
Animal a = new Animal();
// System.out.println("123");
Animal b = new Dog();
a.move();
b.move();
//
// Dog c = new Dog();
// c.bark123();
// a.move();
// b.move();
// c.move();
// c.bark();
// b.bark();
/**
* 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
*
* 多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
*/
}
}

1、父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;

2、父类引用指向子类对象,如果想要调用子类中和父类同名的成员变量,则必须通过getter方法或者setter方法;

3、父类引用指向子类对象,如果想调用子类中和父类同名的静态方法,直接子类“类名点” 操作获取,不要通过对象获取;

4、父类引用指向子类对象的两种写法:(第二种得了解,面试中可能用到)

// 1、第一种常规写法
Father instance = new Son();
// 2、第二种变形写法;
Son son = new Son();
Father mson = (Father) son;(多态的另一种理解的解释方式,java当中的向上转型)

 

posted @ 2019-11-14 22:12  Gabriel1021  阅读(110)  评论(0)    收藏  举报