关于upcasting,高手高手高高手进,谢谢!

ddxxtt 2007-03-17 02:08:13
class SuperClass{
int a;
public SuperClass(){a=12;System.out.println("1"+a);}
void test(){System.out.println("this is the super!");}
}

class SubClass extends SuperClass{
int a;
public SubClass(){a=13;System.out.println("2"+a);}
void test(){System.out.println("This is the subclass");}
}

public class Test{
public static void main(String args[]){
SuperClass temp = new SubClass();
temp.test();
System.out.println(temp.a);}
}

这段代码有两个问题想请教一下:
一、为什么System.out.println(temp.a);这句输出的是12?temp不是一个指向SubClass的SuperClass类型的句柄马?如果这么理解不是应该输出的是13马?temp.test();输出的不就是SubClass里的方法吗?

二、如果SuperClass中test,改写成private void test() eclispe会抱错,又没有调用SuperClass中的test方法,为什么会抱错呢?谢谢大家拉!
...全文
213 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kaiser288977 2007-10-19
SuperClass temp = new SubClass();这样定义后,在内存中是有几个对象呢?是一个还是二个?还请大手们指教。
创建两个对象,从JAVA虚拟机的角度讲,temp是一个类引用变量,new SubClass()是一个类引用。
对于用父类指向子类对象,主要的一点就是父引用变量只能访问到它本身定义的所有对象,而它不知道其子类又重新定
义了哪些属性和方法,所以才会得到这样的结果。
回复
yeah920 2007-03-19
up
回复
interpb 2007-03-19
只有一个对象

但是子类的对象包含相应的父类对象
回复
liuguangyi12 2007-03-19
SuperClass temp = new SubClass();这样定义后,在内存中是有几个对象呢?是一个还是二个?还请大手们指教。
回复
cll0320 2007-03-17
同意楼上的
面向对象语言的多态性只是针对函数而言
对于属性来说,基类与派生类没有重载的可能性。并且是用SuperClass还是SubClass中的属性,在编译期间就已经确定下来了。
也就是说如果你写System.out.println(((SubClass)temp).a);
做个类型转化,那么输出的就是13了
回复
interpb 2007-03-17
一、为什么System.out.println(temp.a);这句输出的是12?temp不是一个指向SubClass的SuperClass类型的句柄马?如果这么理解不是应该输出的是13马?temp.test();输出的不就是SubClass里的方法吗?



属性是不具有多态性的 你是声明的什么类型 调用属性调用相应类的属性
temp被声明为SuperClass 调用它的a就是SuperClass的a

调用test的时候 因为方法的多态性 这时候时SubClass的



二、如果SuperClass中test,改写成private void test() eclispe会抱错,又没有调用SuperClass中的test方法,为什么会抱错呢?谢谢大家拉!

你通过tmp调用test方法 首先起码要SuperClass的这个方法 你可以访问,然后才涉及到多态
你既然设为private 肯定就不能调用了

虽然你是调用Sub的方法但是你是通过Super调用的 起码这个入口你要有权限
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2007-03-17 02:08
社区公告
暂无公告