黑马程序员技术交流社区
标题:
关于多态中成员变量和静态成员函数的问题
[打印本页]
作者:
唐巍
时间:
2012-3-4 01:25
标题:
关于多态中成员变量和静态成员函数的问题
请看下面代码:
class Fu
{
int num=5;
void method1()
{
System.out.println("fu method_1");
}
static void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
int num=4;
void method1()
{
System.out.println("zi method_1");
}
static void method2()
{
System.out.println("zi method_2");
}
}
class DuoTaiDemo5
{
public static void main(String[] args)
{
Fu f=new Zi();
f.method1();
f.method2();//打印结果:fu method_2 为什么子类method2方法没有覆盖父类中的method2方法?
System.out.println(f.num);//打印结果:5 为什么打印的是父类中的num?
}
}
作者:
刘刚洪
时间:
2012-3-4 08:10
在多态中,静态成员函数的特点:无论编译和运行,都参考左边. (毕老师的视频在多态那部分会详细讲到)
所以就容易理解了,参考左边在该程序中当然就是指父类,换名话说,你程序中调用的方法就应该是父类的方法。
作者:
dangfei
时间:
2012-3-4 08:22
静态方法是在编译时直接加载入内存,不是东他爱绑定的,子类扩展父类重写静态方法时,实际上相当于有创建了一个方法。
所以,lz这里子类父类各有一个静态method_2。
另外, Fu f=new Zi();
用子类实例化父类,重写了父类的一些方法。父类的变量是不能被重写的。
所以f.num是5
作者:
张乃智
时间:
2012-3-4 09:00
静态方法不构成多态 自然不能按多态的思路类
static 方法不能被继承但可以重写:若重写: 父类 a=new 子类() a编译时引用类决定调用的方法,运行时调用的方法是引用类的方法
另外 用子类实例化父类,只能覆盖方法,变量是不会覆盖的。。
作者:
泮和顺
时间:
2012-3-4 12:12
Fu f=new Zi();的理解类型引用是Fu类型的 等于就是说本身就是向上自动转型的一样(比如定义个动物类我让他指向猫类),
关于调用方法,肯定是调用子类本身的方法,包括从父类继承来的方法和自己特有的方法,还有复写的方法((如果是子类方法静态的话是只能通过类名调用的这个有区别),)
关于成员变量,默认是父类的变量,想用子类的还得向下转型回去即可。
作者:
种法腾
时间:
2012-3-4 12:42
对于静态的方法,不存在覆盖的方法一说,,
对于成员变量,当加载的时候,看父类的变量,当父类没有该变量的时候就出现编译错误。
对于非静态函数,同上,
对于静态的函数,没有覆盖的说法。。。
作者:
种法腾
时间:
2012-3-4 12:44
You cannot override a non-virtual or static method. The overridden base method must be virtual, abstract, or override.
No you cannot override a static method.
作者:
花开~的季节
时间:
2012-3-4 15:16
静态方法运行看左,成员变量和静态成员变量编译看父类,运行看子类。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2