zoukankan      html  css  js  c++  java
  • Java中的类初始化和实例初始化

    我也是小白,各位倘若看到一定要带思考的去看。

    一、背景:

    存在类Father和类Son,其中类Son继承了Father类。

    1.父类Father代码

     2.子类Son代码

    *初始化包括?

    成员变量赋初值、代码块、构造器

    注意方法是被调用的,有人调用它它才执行相应的东西。

     二、类初始化

    在一开始,注释掉main方法中的代码,执行结果如下。

    类初始化:

    1.创建实例需要先加载并初始化该类

      此处main方法所在的类需要先加载并初始化

    2.子类初始化要先初始化其父类

    3.类初始化即是执行clinit(ClassInit)方法

      A.(静态!)分为 静态变量的显式赋值操作 和 静态代码块
      B.上到下的顺序执行
      C.这个clinit方法只执行一次

     将父类中的static代码块放到静态变量之前,可以看到结果按顺序改变。

    三、实例初始化

    取消Son类中main方法的第一句注释,如下图所示。

     此时将会先进行类初始化,再进行实例初始化,结果如下。

    实例初始化:

    1.实例初始化即是执行init方法

    2.有几个构造器就有几个init方法,每次创建对象都会执行相应的init方法。

    3.init方法由非静态实例变量显式赋值、非静态代码块和相应的构造器组成。

    4.非静态实例变量赋值与非静态代码块按上到下的顺序执行,构造器在最后执行。

    5.init方法的首行是super()或者带参数的super(),即父类init方法。

    父类中的test()方法输出的是(4),为何父类中结果为932?

    非静态方法前有一个默认的对象this

    this在构造器(或者init方法)表示的是正在创建的对象。

    这里是在创建Son类的对象,所以执行的是重写后的代码。

    四、总结

    初始化操作包括成员变量、静态/非静态代码块和构造器。

    1.先类初始化,再实例初始化。

    2.都是先父类再子类。

    3.类初始化关键词"静态"。

    4.实例初始化关键词"非静态",构造器在最后。

    5.注意构造器和实例初始化init方法中的this对象。

    五、补充

    哪些方法不能被重写?
    final方法
    静态方法
    private等子类中不可见方法

    多态性的体现?
    子类若重写了父类的方法,则通过子类对象调用的一定是子类重写过的方法
    非静态方法默认的调用对象是this
    this对象在构造器或者init方法中就是正在创建的对象


  • 相关阅读:
    Linux环境下安装jdk1.8(CentOS7)
    MySQL创建外键报错ERROR 3780 (HY000): Referencing column ‘user_id’ and referenced column ‘id’ in foreign key constraint ‘fk_user_id’ are incompatible.
    scrapy框架的使用
    开源《热血传奇》服务端引擎(C#编写),可以顺利进行游戏(更新编译和部署教程)
    记录一下今天刚开通的博客
    Sql Server 2005中还原整个数据库重命名问题
    第一次学开车
    转载:c#与ASP.NET中DateTime.Now函数详解
    winform进度条收藏
    今天新注册的,庆祝一下
  • 原文地址:https://www.cnblogs.com/yang37/p/12676668.html
Copyright © 2011-2022 走看看