黑马程序员技术交流社区

标题: 关于多态的一点问题 [打印本页]

作者: 王桂丽    时间: 2012-8-6 21:58
标题: 关于多态的一点问题
本帖最后由 王桂丽 于 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

作者: 余明辉    时间: 2012-8-6 23:22
先给你说下基本的东西吧
栈:存放局部变量和方法的形参,还有对象的引用也是在栈上面
堆:存放对象的
方法区:放代码的地方

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

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

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

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

1111.png

作者: 王桂丽    时间: 2012-8-7 13:14
此问题已解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2