一、多态性的三个必要满足的条件
1、存在继承关系
Cat类继承了Animal类
2、子类要重写父类的方法
子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。
3、父类数据类型的引用指向子类对象。
测试类Demo_Test1中 Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
到此,满足了Java多态的的必要三个前提。
二、多态性是指一个名称可以对应多种不同的实现方式。Java的多态性体现在两个方面:编译多态和运行多态。
编译多态是指在程序编译过程中体现出的多态性,如方法重载,尽管方法名相同,但由于参数不同,在调用时系统根据传递参数的不同确定被调用的方法,这个过程是在编译时完成的
运行多态则是有类的继承和方法的重写引起的,由于子类继承了父类的属性和方法,因此,凡是父类对象可以使用的地方,子类对象也可以使用。
例如类A和类B,可以直接生成子类B的对象,并将该引用赋给父类A的对象。
A a=new B();
等价于
B b=new B();
A a=b;//隐式类型转换
三、多态的好处:可替换性、可扩充性、接口性、灵活性、简化性。
四、父类对象真实的指向什么类型才能转换成什么类型。
五、使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现变异错误。如:pet instanceof String 会出现编译错误.
instanceof通常和强制类型转换结合使用.
六、instanceof
子类转换为父类,向上转型会自动转换。
父类转换为子类,向下转型 使用 ·instanceof 判断是否是父类与子类
class A{
public void paly (Pet pet) {
if ( pet instanceof Dog) {
Dog dog = (Dog) pet ;//向下转型 进行强制转换。
}else if ( pet instanceof Penguin ) {
Penguin pe = (Penguin)pet ;
}else if ( pet instanceof Cat) {
Cat cat = (Cat)pet ;
}
}
}
class B {
A a = new A ();
a.paly(Dog);
}
什么时候会产生多态
a. 有继承关系的时候会产生多态
b. 方法重写的时候
当进行数据转换的时候,会丢失数据 , 可以是:
当子类转换为父类时 , 会丢失子类特有的方法和属性
1、存在继承关系
Cat类继承了Animal类
2、子类要重写父类的方法
子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。
3、父类数据类型的引用指向子类对象。
测试类Demo_Test1中 Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
到此,满足了Java多态的的必要三个前提。
二、多态性是指一个名称可以对应多种不同的实现方式。Java的多态性体现在两个方面:编译多态和运行多态。
编译多态是指在程序编译过程中体现出的多态性,如方法重载,尽管方法名相同,但由于参数不同,在调用时系统根据传递参数的不同确定被调用的方法,这个过程是在编译时完成的
运行多态则是有类的继承和方法的重写引起的,由于子类继承了父类的属性和方法,因此,凡是父类对象可以使用的地方,子类对象也可以使用。
例如类A和类B,可以直接生成子类B的对象,并将该引用赋给父类A的对象。
A a=new B();
等价于
B b=new B();
A a=b;//隐式类型转换
三、多态的好处:可替换性、可扩充性、接口性、灵活性、简化性。
四、父类对象真实的指向什么类型才能转换成什么类型。
五、使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现变异错误。如:pet instanceof String 会出现编译错误.
instanceof通常和强制类型转换结合使用.
六、instanceof
子类转换为父类,向上转型会自动转换。
父类转换为子类,向下转型 使用 ·instanceof 判断是否是父类与子类
class A{
public void paly (Pet pet) {
if ( pet instanceof Dog) {
Dog dog = (Dog) pet ;//向下转型 进行强制转换。
}else if ( pet instanceof Penguin ) {
Penguin pe = (Penguin)pet ;
}else if ( pet instanceof Cat) {
Cat cat = (Cat)pet ;
}
}
}
class B {
A a = new A ();
a.paly(Dog);
}
什么时候会产生多态
a. 有继承关系的时候会产生多态
b. 方法重写的时候
当进行数据转换的时候,会丢失数据 , 可以是:
当子类转换为父类时 , 会丢失子类特有的方法和属性