黑马程序员技术交流社区

标题: 关于多态中成员变量和静态成员函数的问题 [打印本页]

作者: 唐巍    时间: 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