新手请教,很惭愧地发现,多态还没学透请教高人下述代码,当子类向上转型,成为父类时,此时的父类,成员变量访问的是父类的,而方法却是子类的,这是怎么回事?我认为强转后,应该都访问子类的呀.package com.ocjp.polymorphism;public class Child extends Parent {
String name;
static String str = "static child"; Child(String s){ this.name = s; x=2;}
void happy(){
System.out.println("child is happy");
}
public static void main(String[] args) {
Child c = new Child("Mike");
Parent p = (Parent)c;
System.out.println(p.name);
System.out.println(c.name);
System.out.println(p.str);
//子类向上转型为父类后,可以访问到父类字符串常量...
System.out.println(c.str);
p.happy(); //子类向上转型为父类后,父类只能看到子类重写后的方法???
c.happy();
}
}class Parent{
String name;
int x;
static String str = "static parent";
Parent(){ name = "Parent"; x=1;}
Parent getParent(){return this;}
void happy(){
System.out.println("parent is happy");
}
}
运行结果:
Parent
Mike
static parent //成员变量是父类的;这是为什么呢?我认为强转后,应该都访问子类的呀.
static child
child is happy //方法却是子类的;
child is happy
继承
String name;
static String str = "static child"; Child(String s){ this.name = s; x=2;}
void happy(){
System.out.println("child is happy");
}
public static void main(String[] args) {
Child c = new Child("Mike");
Parent p = (Parent)c;
System.out.println(p.name);
System.out.println(c.name);
System.out.println(p.str);
//子类向上转型为父类后,可以访问到父类字符串常量...
System.out.println(c.str);
p.happy(); //子类向上转型为父类后,父类只能看到子类重写后的方法???
c.happy();
}
}class Parent{
String name;
int x;
static String str = "static parent";
Parent(){ name = "Parent"; x=1;}
Parent getParent(){return this;}
void happy(){
System.out.println("parent is happy");
}
}
运行结果:
Parent
Mike
static parent //成员变量是父类的;这是为什么呢?我认为强转后,应该都访问子类的呀.
static child
child is happy //方法却是子类的;
child is happy
继承
解决方案 »
- 关于java的一个问题,求解决```
- java播放ppt
- 裸体跪求文本比较器的代码或算法!
- 依旧是jasperreports 问题,iReport title段的内容为什么要占用正一页?$F,$P{},V{}的字段如何在java里面给它们赋值?
- java 漏洞? 关于final 和 method anonymous class
- 关于java正则表达式的问题!着急
- 大家给推荐一本学习swing的书吧!
- 准备学java...向大家请教一二...
- 关于JAVA的文件操作的问题
- 各位大虾怎么解决java swing 在win2000下的中文??(加100分)
- 蛋疼的一道java题
- 线程实现开门后三秒自动关门 在线等
那么这一句代码
Person p = ...;
System.out.println(p.str);
由于是静态变量,那么当通过应用进行访问时,java虚拟机只会判断是哪一个类里面的静态变量,然后进行调用,而不会去判断p到底是什么类型,看下面一段代码
Person p = null;
System.out.println(p.str); //这里可以输出,没有报错,想一下吧
String name = "child";
//因为参数不同,这里不能算是重写这个方法可以有比父类更严格的权限
private String getName(ParamPolymorphism p){
return p.name;
}
public static void main(String[] args) {
ParamPolymorphism child = new ParamPolymorphism(); ParamParent parent = new ParamParent();
//问题一:child对象调用getName()方法时,需要的参数为子类,我传了父类,这不是相当于把父类转成子类了么?
//ParamPolymorphism child = (ParamPolymorphism) new ParamParent();这样把子类转父类不行,为什么方法传参时可以?
//问题二:child.getName(parent),子类为什么调用的竞争是父类的getName()? System.out.println(child.getName(parent)); //Output: Parent
System.out.println(child.getName(child)); //Output: Child
}
}class ParamParent{
String name = "Parent";
String getName(ParamParent p){
return p.name;
}
}
import java.util.*;public class ArrayWArraylist {
public static void main(String[] args) {
ArrayList[] ls = new ArrayList[3];
for(int i = 0; i < 3; i++) {
ls[i] = new ArrayList();
ls[i].add("a" + i);
}
//数组转成对象,父类引用指向子类;o作为一个普通的对象,指向仍然是数组;
Object o = ls;
do3(ls);
for(int i = 0; i < 3; i++) {
//问题一:Object对象向下转型成数组?是不是又违背了“父类不能强转成子类“的原则?为什么运行时不抛CastClassException?
System.out.print(((Object[])o)[i] + " ");
//
System.out.print(((ArrayList[])o)[i]+"###");
}
}
static Object do3(ArrayList[] a) {
for(int i = 0; i < 3; i++) a[i].add("e");
return a;
}
}
子类当然可以重载父类的方法,因为子类首先就继承了父类的方法,变成了自己的方法
String getName(ParamPolymorphism p)
String getName(ParamParent p)
这两个函数参数类型就不一样,不存在多态问题
这个Object之所以能转成数组,是因为它本来就是数组转过来的,也就是说它看起来是Object但实际内容还是个数组,所以不会出错
所谓的“子类可以转换成父类,父类不能转换成子类”是说,前者可以直接转换,一定不会出错,而后者必须强制转换,但是有风险,结果不能保证,你给它一个本来就是数组的Object,所以转换成功了,如果你给它一个别的Object,它就出错了
http://blog.csdn.net/gideal_wang/article/details/4913965