面向对象的特征:多态性
1.多态性的理解:可以理解为一个事物的多种形态。
2.广义上多态性的体现:
方法的重载和重写;子类对象的多态性
3.狭义上多态性的体现:
子类对象的多态性
4.何为子类对象多态性:
将子类的实例赋给父类的引用(或父类的引用指向子类的实例
举例:
Person p = new Man();
Object obj = new String("Hello");
Number n = new Integer(122);
5.多态性的应用:虚拟方法调用 (动态绑定
编译时,对象的引用只能调用声明为父类的类型中的方法,但是当运行时,实际执行的是子类重写的方法。
总结:编译看左边,运行看右边。
6.多态性的说明:
多态性,只适用于方法,不适用于属性。
class Person{
int id = 1001;
public void eat(){}
}
class Student extends Person{
int id = 1002;
public void eat(){}
}
class Test{
main(){
Person p = new Student();//多态
p.eat();//虚拟方法调用
sysout(p.id);//1001
Student s = (Student)p;
sysout(s.id);//1002
sysout(p == s);//true
}
}
7.多态性使用的前提:
①类的继承性 ②方法的重写
**************************************************
8.关于向上转型与向下转型:
向上转型:多态
向下转型:
8.1为什么使用向下转型:
使用多态以后,创建的是子类的对象,意味着在内存空间中存在子类特的结构:属性、方法。但是编译看左边,导致我们通过父类的引用没法调用子类特的结构。此时,需要使用向下转型,方可实现对子类特有的结构的调用。
8.2如何实现向下转型:使用强转符:()
8.3 instanceof的使用:
为了避免在强转时出现ClassCastException,建议强转前使用instanceof进行判断,如果返回true,再强转。
a instanceof A:判断对象a是否是类A的实例。
1.如果a是类A的实例:返回true;如果a不是类A的实例:返回false.
2.如果返回值是true,那么 a instanceof B返回值也是true.其中类B是类A的父类。
图示:
需要注意的问题:
1.强转前,使用instanceof进行判断,避免出现ClassCastException
2.强转符只适用于子父类关系的类之间。
1.多态性的理解:可以理解为一个事物的多种形态。
2.广义上多态性的体现:
方法的重载和重写;子类对象的多态性
3.狭义上多态性的体现:
子类对象的多态性
4.何为子类对象多态性:
将子类的实例赋给父类的引用(或父类的引用指向子类的实例
举例:
Person p = new Man();
Object obj = new String("Hello");
Number n = new Integer(122);
5.多态性的应用:虚拟方法调用 (动态绑定
编译时,对象的引用只能调用声明为父类的类型中的方法,但是当运行时,实际执行的是子类重写的方法。
总结:编译看左边,运行看右边。
6.多态性的说明:
多态性,只适用于方法,不适用于属性。
class Person{
int id = 1001;
public void eat(){}
}
class Student extends Person{
int id = 1002;
public void eat(){}
}
class Test{
main(){
Person p = new Student();//多态
p.eat();//虚拟方法调用
sysout(p.id);//1001
Student s = (Student)p;
sysout(s.id);//1002
sysout(p == s);//true
}
}
7.多态性使用的前提:
①类的继承性 ②方法的重写
**************************************************
8.关于向上转型与向下转型:
向上转型:多态
向下转型:
8.1为什么使用向下转型:
使用多态以后,创建的是子类的对象,意味着在内存空间中存在子类特的结构:属性、方法。但是编译看左边,导致我们通过父类的引用没法调用子类特的结构。此时,需要使用向下转型,方可实现对子类特有的结构的调用。
8.2如何实现向下转型:使用强转符:()
8.3 instanceof的使用:
为了避免在强转时出现ClassCastException,建议强转前使用instanceof进行判断,如果返回true,再强转。
a instanceof A:判断对象a是否是类A的实例。
1.如果a是类A的实例:返回true;如果a不是类A的实例:返回false.
2.如果返回值是true,那么 a instanceof B返回值也是true.其中类B是类A的父类。
图示:
需要注意的问题:
1.强转前,使用instanceof进行判断,避免出现ClassCastException
2.强转符只适用于子父类关系的类之间。