黑马程序员技术交流社区

标题: 关于方法执行顺序的问题 [打印本页]

作者: 黑马-邢广耀    时间: 2012-12-24 12:51
标题: 关于方法执行顺序的问题
本帖最后由 黑马-邢广耀 于 2013-1-4 16:22 编辑

有一个问题一直挺困扰的,就是子父类中的方法,到底执行的是谁的呀,为什么这么执行呢,还有各种构造代码块,静态代码块等也是有执行顺序的,大神可否用通俗的语言指点一二
作者: 黄锦成    时间: 2012-12-24 13:04
给个例子给你参考一下,这是我自己学习的时候写的代码
/*
父类和子类都定义有相同的【静态变量】【静态方法】【成员变量】【成员方法】,
当 Father son = new Son();时,son调用变量和方法,到底是调用哪个呢?
*/
class Father
{
        static int n = 10;
        int c = 100;
        public static void run()
        {
                System.out.println("staic father is funning");
        }

        public void go()
        {
                System.out.println("father is going");
        }
}
class Sun extends Father
{
        static int n = 20;
        int c = 200;
        public static void run()
        {
                System.out.println("staic sun is funning");
        }
        public void go()
        {
                System.out.println("sun is funning");
        }
}

public class FS
{
        public static void main(String args[])
        {
                Father sun = new Sun();
                sun.run();//静态调用父类的
                sun.go();//调用子类的
                //不管是静态变量还是成员变量,都是调用父类的
                //System.out.println("n="+Father.n);两者结果一样
                System.out.println("n="+sun.n);
                System.out.println("c="+sun.c);

                //如果想调用Sun中的n,则使用
                System.out.println("n="+Sun.n);
        }
}
作者: 马志军    时间: 2012-12-25 08:40
      如果子类引用指向子类对象,那么用的是子类的方法与变量,当然由于继承父类,所以父类的非私有的变量与方法也能调用。如果说父类变量名与子类一样,那就被覆盖了,方法名一样,可能重载也可能覆盖。 
    如果父类引用指向子类对象,即多态。对于非静态方法,编译看左边,运行看右边,即编译时看父类中有没有那些方法,若没有编译失败,运行时看子类对象,有没有那些方法,实际调用的是子类方法;对于静态方法,编译运行都看左边,即编译运行都看父类方法,而不是被子类覆盖的方法,因为静态,可以类名调用,所以父类不管指的是谁,调的都是父类;对于成员变量,编译运行都看左边,即编译时看父类有没有那变量,运行时也调用父类的变量。
    静态代码块是类一加载就执行,是给类初始化,构造代码块是创建对象时给对象初始化




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