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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-13 19:14  /  1693 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:44 编辑
  1. class FuZi
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Zi z = new Zi();
  6.                 //z.function();
  7.                 z.show();
  8.                 Fu f = new Zi();
  9.                 f.show();
  10.         }
  11. }
  12. class Fu
  13. {
  14.         void show()
  15.         {
  16.                 System.out.println("fu show");
  17.         }
  18. }
  19. class Zi extends Fu
  20. {
  21.         /*
  22.         void function()
  23.         {
  24.         }
  25.         */
  26.         void show()
  27.         {
  28.                 System.out.println("zi show");
  29.         }
  30. }
复制代码
问这个类的执行顺序?

4 个回复

倒序浏览
01.class FuZi

02.{

03.        public static void main(String[] args)

从这开始读程序
04.        {

05.                Zi z = new Zi();1,创建一个子类对象

06.                //z.function();

07.                z.show();2,调用子类方法,因为当子类复写了父类的方法时,会调用子类的所以此时输出一个zi show

08.                Fu f = new Zi();涉及到多态,创建一个子类对象,让父类变量去引用

09.                f.show();4,此时编译看左边,运行看右边这句话就起作用了,当然还是调用子类的show方法,输出zi show,程序执行完毕

10.        }

11.}

12.class Fu

13.{

14.        void show()

15.        {

16.                System.out.println("fu show");

17.        }

18.}

19.class Zi extends Fu

20.{

21.        /*

22.        void function()

23.        {

24.        }

25.        */

26.        void show()

27.        {

28.                System.out.println("zi show");

29.        }

30.}
希望你看懂了
回复 使用道具 举报
class FuZi
{
        public static void main(String[] args)     
        {
                Zi z = new Zi();---------------------------------------------------------,先去执行Zi的无参构造函数,因为没个构造函数的第一行都默认有super(),所以程序就去调用父类的无参构造函数,因为父类默认无参构造函数没有要执行的代码,于是这行代码就执行完了
                //z.function();
                z.show();  ---------------------------此时调用子类的show()方法,打印 zi show
                Fu f = new Zi();  -------------- 这是多态方面内容,一个父类引用指向了一个子类对象,
                 
                f.show();  ------------------------此时执行的这个show()是zi的方法而不是fu类的show()方法,因为编译看左边,执行看右边,所以打印的是 zi show
        }
}
class Fu
{
        void show()
        {
                System.out.println("fu show");
        }
}
class Zi extends Fu
{
        /*
        void function()
        {
        }
        */
        void show()
        {
                System.out.println("zi show");
        }
}
回复 使用道具 举报
本帖最后由 郑璋安 于 2012-7-13 20:29 编辑

  1. public class FuZi {

  2.         public static void main(String[] args) {
  3.                 Zi z1 = new Zi();
  4.                 System.out.println("-------------------------------");
  5.                
  6.                 Zi z2 = new Zi(3);        
  7.                 z2.show();
  8.                
  9.                 System.out.println("-------------------------------");

  10.                 Fu f = new Zi(4);

  11.                 f.show();

  12.         }

  13. }

  14. class Fu

  15. {
  16.         Fu(){
  17.                 System.out.println("Fu()");        [color=Red]//------3------        //第2次创建Zi对象时------7------[/color]
  18.         }
  19.         Fu(int i) {
  20.                 System.out.println("Fu(" + i + ")");        [color=Red]//-------8------
  21. [/color]        }

  22.         void show()

  23.         {

  24.                 System.out.println("fu show()");

  25.         }

  26. }

  27. class Zi extends Fu
  28. {
  29.         private Fu fu1= new Fu(1);        [color=Red]//------4------[/color]
  30.         private static Fu fu2 = new Fu(2);        [color=Red]//-------1------
  31. [/color]        Zi(){
  32.                 System.out.println("Zi()");        [color=Red]//------6------
  33. [/color]        }
  34.         Zi(int i) {
  35.                 System.out.println("Zi(" + i +")" );        [color=Red]//------10------
  36. [/color]        }
  37.         
  38.         public static void function() {
  39.                 System.out.println("function()");
  40.         }
  41.          
  42.         public void show()

  43.         {

  44.                 System.out.println("zi show()");        [color=Red]//------11------        由于子类覆盖了父类show()方法,多态机制就能够保证真正对象即Zi的show方法被调用[/color]

  45.         }
  46.         
  47.         {
  48.                 System.out.println("Zi的非静态代码块");        [color=Red]//------5------        //第2次创建Zi对象时------9------
  49. [/color]        }
  50.         static {
  51.                 System.out.println("Zi的静态代码块");        [color=Red]//------2------        //第2次创建Zi对象时这里没执行了,因为Zi.class文件已经加载到了内存中,而静态代码块只执行一次
  52. [/color]        }

  53. }
  54. /**输出结果为:
  55. Fu(2)
  56. Zi的静态代码块
  57. Fu()
  58. Fu(1)
  59. Zi的非静态代码块
  60. Zi()
  61. -------------------------------
  62. Fu()
  63. Fu(1)
  64. Zi的非静态代码块
  65. Zi(3)
  66. zi show()
  67. -------------------------------
  68. Fu()
  69. Fu(1)
  70. Zi的非静态代码块
  71. Zi(4)
  72. zi show()
  73. */
  74. 上面是我根据楼主的示例编写的一个展示Java中静态成员、非静态成员、子父类有参无参构造方法等执行顺序的代码,从输出中就可看到执行顺序,供楼主参考下。
复制代码
回复 使用道具 举报
  1. class FuZi
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Zi z = new Zi();//new了一个子类对象
  6.                 //z.function();
  7.                 z.show();//调用子类的show方法。
  8.                 Fu f = new Zi();//用父类引用指向子类对象,这个是多态的表现形式。
  9.                 f.show();//因为父类的show方法被子类复写,所以调用子类的show方法。
  10.         }
  11. }
  12. class Fu
  13. {
  14.         void show()//父类的show方法
  15.         {
  16.                 System.out.println("fu show");
  17.         }
  18. }
  19. class Zi extends Fu
  20. {
  21.         /*
  22.         void function()
  23.         {
  24.         }
  25.         */
  26.         void show()//子类复写了父类的show方法
  27.         {
  28.                 System.out.println("zi show");
  29.         }
  30. }
  31. 所以结果是
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马