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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-邢广耀 中级黑马   /  2012-12-24 12:51  /  1536 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-邢广耀 于 2013-1-4 16:22 编辑

有一个问题一直挺困扰的,就是子父类中的方法,到底执行的是谁的呀,为什么这么执行呢,还有各种构造代码块,静态代码块等也是有执行顺序的,大神可否用通俗的语言指点一二

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

正序浏览
      如果子类引用指向子类对象,那么用的是子类的方法与变量,当然由于继承父类,所以父类的非私有的变量与方法也能调用。如果说父类变量名与子类一样,那就被覆盖了,方法名一样,可能重载也可能覆盖。 
    如果父类引用指向子类对象,即多态。对于非静态方法,编译看左边,运行看右边,即编译时看父类中有没有那些方法,若没有编译失败,运行时看子类对象,有没有那些方法,实际调用的是子类方法;对于静态方法,编译运行都看左边,即编译运行都看父类方法,而不是被子类覆盖的方法,因为静态,可以类名调用,所以父类不管指的是谁,调的都是父类;对于成员变量,编译运行都看左边,即编译时看父类有没有那变量,运行时也调用父类的变量。
    静态代码块是类一加载就执行,是给类初始化,构造代码块是创建对象时给对象初始化

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
给个例子给你参考一下,这是我自己学习的时候写的代码
/*
父类和子类都定义有相同的【静态变量】【静态方法】【成员变量】【成员方法】,
当 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);
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马