java多态的理解
2016-08-24 18:17
211 查看
转自:http://www.cnblogs.com/gnuhpc/
子类重写父类的方法,会存在多态,在子类用构造函数创建一个对象的时候,这个对象的本质就是子类类型的,即使它被强制转换成父类类型,但他的本质依旧是子类类型。
用以下代码说明:
使用子类创建一个对象:
B b = new B();
然后再将这个子类的引用放到父类对象中:
A
a = b; //这里也可以写成 A a = (A)b,b是子类对象,把他赋给a,是上转型,不需要强制转换。
那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:
得:上转型对象可以操作和使用子类继承或者重写的方法。
失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。
注:凡是涉及到多态的成员方法,那么上转型的对象都会指向子类的重写,不涉及到多态的,如数 值类型,字符串等成员变量,指向的是父类的成员变量。
下边这段测试代码,a2是上转型,他的本质还是B,但他能看到的只有B从A中继承的那部分,而继承的方法有多态效应,所以,B只能有public
String f(A obj) 这个方法是可以用的,对于成员变量,a2指向的是父类的成员变量。
<span style="font-size:18px;">public class Test {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A)new B(); //子类对象转化为父类,称为上转型,不需要强制转换。
B b = new B();
System.out.println(b.f(b)); //“D”
System.out.println(a2.i); // 1
System.out.println(b.i); // 2
System.out.println(a2.s); // AA
System.out.println(b.s); // BB
if (a2 instanceof B) {
B b1 = (B) a2; //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例
System.out.println(b1.f(b));//"C"
System.out.println(b1.f(a1));//"D"
}
}
}</span>
总结:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。
另外说说向上转型的作用:由于向上转型的作用,在要传入子类实例的时候,我们可以方便的将父类实例作为参数定义在方法的传入参数上,这样不用利用多态特性进行方法的重载了。其实向上转型也是一种多态特性的体现。
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
子类重写父类的方法,会存在多态,在子类用构造函数创建一个对象的时候,这个对象的本质就是子类类型的,即使它被强制转换成父类类型,但他的本质依旧是子类类型。
用以下代码说明:
<span style="font-size:18px;">class A { int i = 1; String s = "AA"; <span style="white-space:pre"> </span>public String f(A obj) { return("A"); } } class B extends A { <span style="white-space:pre"> </span>int i = 2; <span style="white-space:pre"> </span>String s = "BB"; public String f(B obj) { return("C"); } public String f(A obj) { return("D"); } }</span><pre name="code" class="java">
使用子类创建一个对象:
B b = new B();
然后再将这个子类的引用放到父类对象中:
A
a = b; //这里也可以写成 A a = (A)b,b是子类对象,把他赋给a,是上转型,不需要强制转换。
那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:
得:上转型对象可以操作和使用子类继承或者重写的方法。
失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。
注:凡是涉及到多态的成员方法,那么上转型的对象都会指向子类的重写,不涉及到多态的,如数 值类型,字符串等成员变量,指向的是父类的成员变量。
下边这段测试代码,a2是上转型,他的本质还是B,但他能看到的只有B从A中继承的那部分,而继承的方法有多态效应,所以,B只能有public
String f(A obj) 这个方法是可以用的,对于成员变量,a2指向的是父类的成员变量。
<span style="font-size:18px;">public class Test {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A)new B(); //子类对象转化为父类,称为上转型,不需要强制转换。
B b = new B();
System.out.println(b.f(b)); //“D”
System.out.println(a2.i); // 1
System.out.println(b.i); // 2
System.out.println(a2.s); // AA
System.out.println(b.s); // BB
if (a2 instanceof B) {
B b1 = (B) a2; //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例
System.out.println(b1.f(b));//"C"
System.out.println(b1.f(a1));//"D"
}
}
}</span>
总结:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。
另外说说向上转型的作用:由于向上转型的作用,在要传入子类实例的时候,我们可以方便的将父类实例作为参数定义在方法的传入参数上,这样不用利用多态特性进行方法的重载了。其实向上转型也是一种多态特性的体现。
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
相关文章推荐
- 理解Java多态
- 理解JAVA多态
- JAVA多态的理解
- 如何理解java中重写,重载与多态(整理)
- 深入理解Java的多态
- java多态的理解
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- JAVA多态的理解
- 对JAVA多态的理解
- 黑马程序员_JAVA基础_多态的理解
- java中对面向对象的三大特征:封装、继承、多态的理解
- 理解java多态的概念和作用
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- JAVA多态的理解
- 理解JAVA多态,总结整理
- 理解JAVA多态
- JAVA里多态的理解
- 理解JAVA多态
- 我理解java的多态
- 理解java中的多态,多态的例子