`
aroundall
  • 浏览: 1689 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

类、对象初始化简析

阅读更多
一、除了Object外没有继承其他类的类
class Base {
    protected static int a = 3;
    protected int b = 5;
    static{
        System.out.println("a = " + a);
    }
    {
        System.out.println("b = " + b);
    }

    public Base(){
        System.out.println("In constructor...");
    }
}
class Initailization {
    public static void main(String[] args) {
        System.out.println("Before use...");
        System.out.println("Base.a = " + Base.a);
        System.out.println("After use...");

        System.out.println("Before new...");
        new Base();
        System.out.println("After new...");
    }
}

执行结果:
Before use...
a = 3
Base.a = 3
After use...
Before new...
b = 5
In constructor...
After new...

  当然初始化的顺序不言而喻额:类加载、校验、准备后便初始化静态变量及执行静态块;对象先执行成员的初始化,然后在执行自身的构造函数。如果类没有被加载,直接调用new创建对象,则先加载类,并做相关初始化,然后再创建对象,如下所示:
class Base {
    protected static int a = 3;
    {
        System.out.println("a1 = " + a);
    }
    protected int b = 5;
    static{
        System.out.println("a = " + a);
    }
    {
        System.out.println("b2 = " + b);
    }

    public Base(){
        System.out.println("In constructor...");
    }
}
class Initailization {
    public static void main(String[] args) {
        System.out.println("Before new...");
        new Base();
        System.out.println("After new...");
    }
}

执行结果:
Before new...
a = 3
a1 = 3
b2 = 5
In constructor...
After new...


二、除了Object还继承了其他类的类
一个原则——先父后子,两个过程——先加载后创建对象。详细过程如下:
先加载、初始化父类,然后加载、初始化子类;先创建父类对象,然后创建子类对象。
class A {
    static {
        System.out.print(1);
    }
    public A() {
        System.out.print(2);
    }
}
class B extends A {
    static {
        System.out.print(3);
    }
    {
    }
    public B() {
        System.out.print(4);
    }
    public static void main(String[] args) {
        B b1 = new B();
        System.out.print(",");
        new B();
    }
}

所以,上述代码的执行结果为:
1324,24

0
0
分享到:
评论

相关推荐

    JAVA几个常见错误简析

    空指针异常(NullPointerException)发生在试图访问或操作一个未初始化或已释放的对象引用时。在Java中,当一个对象引用为null,但尝试调用其方法或访问其属性时,就会抛出此异常。基本数据类型不会引发此问题,因为...

    JVM ClassLoader简析

    初始化阶段则对类进行静态变量的赋值和初始化块的执行。 在Java中,每个类都有一个唯一的ClassLoader实例与其关联。当需要加载一个类时,ClassLoader首先检查该类是否已经加载。如果未加载,它会委托给父...

    UBIFS文件系统简析

    例如,UBIFS初始化时会注册文件系统类型,当文件系统挂载时,UBIFS会解析其Super区信息,并初始化其内部数据结构。UBIFS通过VFS提供的文件操作接口,如读取、写入、同步、删除等操作,能够被应用程序调用。 垃圾...

    Vue-cli@3.0 插件系统简析

    Service类作为运行时服务的核心,它在实例化过程中会加载插件、初始化相关配置,并缓存动态注册的CLI命令。具体来看,Service类中包含用于Webpack配置的函数数组(webpackChainFns和webpackRawConfigFns)、dev...

    基于Oracle的面向对象技术入门基础简析开发者网络Oracle

    如果对象没有成员函数,可以直接通过初始化构造函数的形式进行初始化。 对象在Oracle数据库中的存储有两种方式: - 对象列:将对象作为数据表中某列的数据类型,使得对象可以直接存储在数据库列中。 - 对象行:...

    002DirectX游戏开发之代码的框架简析

    1. **初始化与资源管理**:游戏启动时,需要初始化DirectX的相关组件,如创建设备、设置渲染目标、加载纹理和模型等。同时,资源管理模块负责内存分配、资源加载与释放,确保高效且无内存泄漏。 2. **主循环**:...

    android 简析xml源码

    在解析布局文件时,`LayoutInflater`会利用`XmlPullParser`解析XML,创建并初始化UI组件。`LayoutInflater.from(Context)`获取到`LayoutInflater`实例后,调用`inflate(int resource, ViewGroup root)`方法,其中...

    简析Android语音助手开发的一种实现方案.pdf

    1. 语音交互:使用科大讯飞语音 SDK 实现语音听写和语音合成功能,包括语音配置对象的初始化、语音听写和语音合成的监听器对象的创建、音频数据的处理和语音听写结果的数据解析。 2. 网络请求:使用 Retrofit 框架和...

    PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——PHP SDK中Demo程序简析

    2. **配置文件**:`config.php`包含AppKey和AppSecret,它们被定义为常量`WB_AKEY`和`WB_SKEY`,并用于初始化`WeiboOAuth`对象。 3. **创建WeiboOAuth对象**:`WeiboOAuth`类是SDK提供的,用于处理OAuth授权。通过`...

    java_串口通讯实例

    通过对 `SerialBean` 类中的主要方法进行解析,我们了解到如何使用这个类库来完成串口的初始化、读取、写入以及关闭等基本操作。此外,`SerialBuffer` 和 `ReadSerial` 类分别负责数据管理和读取逻辑,进一步完善了...

    OpenJDK1.8源码简析V1.0.pptx

    JVM启动流程大致包括:环境设置和检查、查找JAVA_DLL、加载动态库、解析参数、初始化虚拟机和执行主类。这一过程涉及到许多底层细节,如CreateExecutionEnvironment函数的调用和线程的创建。 5. 所用技术 OpenJDK的...

    Vue数据绑定简析小结

    作为MVVM框架的一种,Vue最为人津津乐道的当是数据与视图的绑定,将直接操作DOM节点变为修改 ...初始化 Vue 实例 在阅读源码时,因为文件繁多,引用复杂往往使我们不容易抓住重点,这里我们需要找到一个入口文件,从 V

    ZigBee技术应用开发

    #### 三、Z-Stack协议栈OSAL初始化流程简析 Z-Stack中的OSAL(Operating System Abstraction Layer)是操作系统抽象层,用于提供一个统一的接口来访问底层操作系统服务。OSAL初始化流程是Z-Stack启动过程中的关键...

    Symbian控件架构.pdf

    在构造 `CCoeControl` 类时,通常会调用此方法来初始化控件的窗口。例如,在示例代码中可以看到: ```cpp void CIeAppView::ConstructL(const TRect& aRect, CQikAppUi* aAppUi) { // ... 其他初始化代码 ... ...

    python中的list、tuple、set、dict用法简析.doc

    Tuple 也是一种有序的列表,但与 List 不同的是,Tuple 一旦初始化就不能再修改。Tuple 的元素可以是字符串、数字、布尔值等,但不能包含列表。 Tuple 的定义可以使用小括号 (),例如: `classmates = ('Michael',...

    QGroundControl代码分析

    1. **构造函数**:在构造函数中,最重要的操作是初始化`toolbox`指针,即`new QGCToolbox(this);`。 2. `_initForNormalAppBoot`函数: - 初始化样式表。 - 连接信号槽,确保最后一个窗口关闭时退出程序。 - ...

    C++虚函数及虚函数表简析

    2. 虚函数不能是构造函数,因为构造函数用于初始化对象,而在对象尚未完全构建时无法进行多态调用。 3. 析构函数可以被声明为虚函数,这在处理继承链中的对象删除时非常有用,确保正确调用到子类的析构函数。 4. 在...

    ATM.rar_easy

    例如,ATM.java.html可能包含了初始化ATM、验证用户卡、处理交易请求等功能。ATM类通常会有一个或多个实例,每个实例对应一台实际的ATM设备。 2. **Bank类**:Bank类代表了银行系统,它管理着所有账户的信息,执行...

Global site tag (gtag.js) - Google Analytics