A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-8-6 21:58  /  1736 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王桂丽 于 2012-8-6 22:00 编辑

class Fu//定义父类,父类里有一个成员变量num=5,还有一个静态方法method1,一个成员函数method2
{
int num=5;
static void method1()
{
  System.out.println("Fu method_1");
}
void method2()
{
  System.out.println("Fu method_2");
}
}
class Zi extends Fu//定义子类,父类里有一个成员变量num=8,还有一个静态方法method1,一个成员函数method2。并继承父类
{
int num=8;
static void method1()
{
  System.out.println("Zi method_1");
}
void method2()
{
  System.out.println("Zi method_2");
}
}
class  ExtendsDemo
{
public static void main(String[] args)
{
  Fu f=new Fu();//创建父类对象并调用起方法
  {
   System.out.println(f.num);//5
      f.method1();//Fu method_1
   f.method2();//Fu method_2
  }
  
  Fu z=new Zi();//建立子类对象并调用方法
  {
   System.out.println(f.num);//5
   f.method1();//Fu method_1
   f.method2();//Zi method_2
       System.out.println(z.num);//8
   z.method1();//Zi method_1
   z.method2();//Zi method_2
  }
}
}


根据:
1)在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2)在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
3)在多态中,静态成员函数的特点;
无论编译和运行,都参考左边

我可以知道运行的结果,我想知道的是代码在内存中是怎样分配的?即各变量与方法在栈、堆、方法区的体现形式。
还有,代码倒数第三行,为什么运行的结果会是5,而不是所说的8呢?是哪里出了问题?

未命名1.jpg (25.14 KB, 下载次数: 1)

未命名1.jpg

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

2 个回复

倒序浏览
先给你说下基本的东西吧
栈:存放局部变量和方法的形参,还有对象的引用也是在栈上面
堆:存放对象的
方法区:放代码的地方

就你的程序这句代码 Fu f = new Fu();  简单说下
这句是写在main方法中的,main方法也是方法,里面的所有变量都是局部变量,而变量的作用域是方法一结束,变量就消失。。
f是对象的引用,存放在栈上。
而new Fu()就是f所指向的对象,存放在堆上面。

你问的倒数第三行为什么出现5,Fu z=new Zi();
z是父类的一个引用,指向了一个子类对象,多态只存在于方法中,z作为父类的引用,只看的到父类的属性,是看不到子类的属性的

下面的图画的有点抽象,我不太会画图,希望能帮到你理解

1111.png (18.06 KB, 下载次数: 1)

1111.png
回复 使用道具 举报
此问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马