黑马程序员技术交流社区
标题: 关于多态的一点问题 [打印本页]
作者: 王桂丽 时间: 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)
作者: 余明辉 时间: 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)
作者: 王桂丽 时间: 2012-8-7 13:14
此问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |