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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请看下面代码:
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?
               
        }
}

7 个回复

倒序浏览
在多态中,静态成员函数的特点:无论编译和运行,都参考左边.  (毕老师的视频在多态那部分会详细讲到)
所以就容易理解了,参考左边在该程序中当然就是指父类,换名话说,你程序中调用的方法就应该是父类的方法。
回复 使用道具 举报
静态方法是在编译时直接加载入内存,不是东他爱绑定的,子类扩展父类重写静态方法时,实际上相当于有创建了一个方法。
所以,lz这里子类父类各有一个静态method_2。
另外, Fu f=new Zi();
用子类实例化父类,重写了父类的一些方法。父类的变量是不能被重写的。
所以f.num是5
回复 使用道具 举报
静态方法不构成多态 自然不能按多态的思路类
static 方法不能被继承但可以重写:若重写: 父类 a=new 子类() a编译时引用类决定调用的方法,运行时调用的方法是引用类的方法
另外 用子类实例化父类,只能覆盖方法,变量是不会覆盖的。。
回复 使用道具 举报
Fu f=new Zi();的理解类型引用是Fu类型的 等于就是说本身就是向上自动转型的一样(比如定义个动物类我让他指向猫类),
关于调用方法,肯定是调用子类本身的方法,包括从父类继承来的方法和自己特有的方法,还有复写的方法((如果是子类方法静态的话是只能通过类名调用的这个有区别),)
关于成员变量,默认是父类的变量,想用子类的还得向下转型回去即可。
回复 使用道具 举报
对于静态的方法,不存在覆盖的方法一说,,
对于成员变量,当加载的时候,看父类的变量,当父类没有该变量的时候就出现编译错误。
对于非静态函数,同上,
对于静态的函数,没有覆盖的说法。。。
回复 使用道具 举报
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.
回复 使用道具 举报
静态方法运行看左,成员变量和静态成员变量编译看父类,运行看子类。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马