1.多态是java中封装和继承之外的第三个基本特征,我觉得也是java最核心的东西,也叫动态绑定,或者后期绑定,或者运行时绑定。在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用相应的方法。
2. 多态理解起来比较抽象一些,举个例子,宝马是车,台灯是灯,拿铁是咖啡,吉他是乐器。
多态的存在有3个条件,1)要有继承 2)要有重写3)父类引用指向子类对象
2. 多态理解起来比较抽象一些,举个例子,宝马是车,台灯是灯,拿铁是咖啡,吉他是乐器。
多态的存在有3个条件,1)要有继承 2)要有重写3)父类引用指向子类对象
(说两句,为什么重写是必要的,首先不重写,继承了就可以用,没什么意义。也就是说,假如父类有一个方法,子类没有重写,或者甚至连定义都没有,那么就相当于继承。仍然可以调用父类的该方法。只是没什么意义而已。
3.我们常常先定义一个类,然后另一个类继承它,我们说,前者叫父类,后者叫子类。比如上面的例子。那么多态的字面意思也就是这样,“子类”是“父类”,换句话说,父类的引用可以指向子类的对象。
4. Car car = new BMW();
当使用多态调用方法时,首先检查父类中是否有该方法,如果没有,则编译器会报错;如果有,再去调用子类的方法。
5.一共有2种强制类型转换
1)向上类型转换(upcast),意思就是子类转换为父类。比如Cat类型转换为Animal类型。如下:
Cat cat = new Cat();
Animal animal = cat;
网上找到一个很好的例子:http://zhidao.baidu.com/question/72034787.html
2)向下类型转换(downcast),意思就是父类转换为子类。比如Animal类型转换为Cat类型。
Animal a = new Cat();
Cat c =(Cat)a;
其次,需要说明的一点是,如果使用了多态,子类调用某方法,若父类没有该方法,那么就出错,所以必须是重写才能保证父类肯定有该方法)
3.我们常常先定义一个类,然后另一个类继承它,我们说,前者叫父类,后者叫子类。比如上面的例子。那么多态的字面意思也就是这样,“子类”是“父类”,换句话说,父类的引用可以指向子类的对象。
4. Car car = new BMW();
当使用多态调用方法时,首先检查父类中是否有该方法,如果没有,则编译器会报错;如果有,再去调用子类的方法。
特别注意:当继承的时候,子类会继承父类的一切属性和方法,但是呢,只有方法支持后期绑定,而成员变量不支持,所以,使用多态的时候,成员变量的调用是和引用的类型保持一致的。方法支持后期绑定,所以对象是什么类型就用什么类型里面的方法。
但是,如果子类没有重写父类的,就会调用父类的。
5.一共有2种强制类型转换
1)向上类型转换(upcast),意思就是子类转换为父类。比如Cat类型转换为Animal类型。如下:
Cat cat = new Cat();
Animal animal = cat;
网上找到一个很好的例子:http://zhidao.baidu.com/question/72034787.html
2)向下类型转换(downcast),意思就是父类转换为子类。比如Animal类型转换为Cat类型。
Animal a = new Cat();
Cat c =(Cat)a;
向下转换比较常见的情况就是返回值,调用了别人一个方法,返回一个类型的对象(假如说是Object类),而你想要更加精确的类型(比如String),而且你知道这个转换不会出现问题,这时候就要使用向下类型转换了。
//注意:举个例子,比如Integer是继承自Object的,所以向下可以转换,但是Integer[ ]和Object[]数组是不能转换的,因为根本就没有继承
对于向下类型转换,必须要显式地指定(必须使用强制类型转换)。
6.有了多态,那么就有了3种情况定义对象。
前面2种本身就有
1)父类的引用指向父类对象 Animal animal = new Animal();
2)子类的引用指向子类对象 Cat cat = new Cat();
这一种是有了多态以后的
3)父类的引用指向子类对象 Animal animal =new Cat();
7.要说好处,我觉得还是挺多的,简单一点说就是增强代码的健壮性
//注意:举个例子,比如Integer是继承自Object的,所以向下可以转换,但是Integer[ ]和Object[]数组是不能转换的,因为根本就没有继承
对于向下类型转换,必须要显式地指定(必须使用强制类型转换)。
6.有了多态,那么就有了3种情况定义对象。
前面2种本身就有
1)父类的引用指向父类对象 Animal animal = new Animal();
2)子类的引用指向子类对象 Cat cat = new Cat();
这一种是有了多态以后的
3)父类的引用指向子类对象 Animal animal =new Cat();
7.要说好处,我觉得还是挺多的,简单一点说就是增强代码的健壮性
最常见的就是写一个接口,然后写一个子类,通过子类去调用一些方法。突然有一天,发现方法还是那些,但是想换个实现方法,如果以前写死了,那每次你有新想法了,都要重构代码,项目一旦大了,维护起来就很困难了。通过多态的方式,可以保证子类使用的方法父类全部都定义过了,于是你重新写一个子类,然后用父类的引用指向它,并不需要改原来的代码,改的仅仅是这一行代码的赋值语句。
总之,一旦项目大了,实现方式多样化了,多态的作用就会体现出来了。
注意: Java中除了static方法和final方法(private方法也属于final方法)之外,其它的方法都是后期绑定。
所以说,对于private方法,假如你在子类中重写了,然后使用了多态来调用,并不会调用子类的方法,因为方法根本就没有被重写,private方法是不能被重写的。但是编译器又不报错,所以在执行的时候仍然只会执行基类的方法,而不会执行子类所谓的"重写过的"方法。