精华内容
下载资源
问答
  • java里初始化一个类的对象通过初始化快或者构造方法进行数据赋值。与其相关的执行代码有这么几种: 静态初始化初始化块 构造方法 静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块...

    java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值。与其相关的执行代码有这么几种:

    • 静态初始化块
    • 初始化块
    • 构造方法

    静态初始化块

    静态初始化块只在类加载时执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。


    非静态初始化块

    非静态初始化块在每次初始化实例对象的时候都执行一次,可以给任意变量赋值。


    构造方法

    在每次初始化实例对象时调用。


    重点:执行顺序->

    1. 在加载类时执行一次静态初始化块(之后不再调用)。
    2. 在每次初始化实例对象时:先执行非静态初始化块,再执行构造方法。

    若是概念不好懂,请看如下实例:

    package com.mgh;
    
    public class Main {
    
        String name; // 声明变量name
        String sex; // 声明变量sex
        static int age;// 声明静态变量age
    
        // 构造方法
        public Main() {
            System.out.println("通过构造方法初始化name");
            name = "tom";
        }
    
        // 初始化块
        {
            System.out.println("通过初始化块初始化sex");
            sex = "男";
        }
    
        // 静态初始化块
        static {
            System.out.println("通过静态初始化块初始化age");
            age = 20;
        }
    
        public void show() {
            System.out.println("姓名:" + name + ",性别:" + sex + ",年龄:" + age);
        }
    
        public static void main(String[] args) {
    
            // 创建对象
            Main obj1 = new Main();
            Main obj2 = new Main();
            // 调用对象的show方法
            obj1.show();
            obj2.show();
        }
    }
    
    output:
    通过静态初始化块初始化age
    通过初始化块初始化sex
    通过构造方法初始化name
    通过初始化块初始化sex
    通过构造方法初始化name
    姓名:tom,性别:男,年龄:20
    姓名:tom,性别:男,年龄:20
    from https://www.cnblogs.com/Berryxiong/p/6245100.html

    转载于:https://www.cnblogs.com/shizhijie/p/8819029.html

    展开全文
  • 0.初始化赋值的区别意义上:1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质2)赋值:在一个变量或者一个...对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值执行...

    0.初始化与赋值的区别

    意义上:

    1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质

    2)赋值:在一个变量或者一个对象在产生之后的任意时刻赋予一个值,属于任意性质

    宏观代码上:

    1)两者作用相同

    2)对于数组和结构体来说,初始化和赋值的的形式不同。对于数组,可以使用花括号一起初始化,如果赋值的话,就只能单个元素就行;对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值

    85255c1c189fed48b0d54dfdfdd18c42.png

    执行结果:

    0891afa52b60ec96ae011e5155e27926.png

    3)对于引用和const常量来说,只能初始化不能赋值

    1.类中的变量初始化

    1)一般情况下,声明一个类是并不占内存的,如果直接在类中给变量初始化也是不允许的,但在VS2017下自己测试了一下,居然可以

    7d48d02c3be191847e8fa251362dcad0.png

    执行结果:

    cef1f6bdb2fb901b5d52a06d32661472.png

    2.什么是构造函数

    构造函数也是一个函数,这个函数有几个特点:

    1)函数的名字与类的名字相同

    2)在创建一个对象时,构造函数就自动执行,但是在声明一个类的指针对象时,构造函数不会被调用,当new一个空间的时候,构造函数才会被调用

    3)构造函数一般用来对数据成员的赋值,这也是它的一般性作用

    4)构造函数没有返回值

    5)一个类里面也可以有多个构造函数,这些构造函数根据参数的不同,构成重载,根据参数的传递来选择调用哪个构造函数

    6)可以不用显式的定义构造函数,这种情况下,编译器会自动帮我们生成一个空构造函数,什么也不执行;如果我们显式的声明了一个构造函数,那么这个构造函数就会覆盖默认的空构造函数

    1538e14cde144febda47228f22769de9.png

    执行结果:

    e7091307188031e86c01de2aa4b0a4f4.png

    3.构造函数的类型

    虽然构造函数没有返回值,但可以有参数,如果构造函数有参数,那么在创建对象时,就一定要传入参数,否则会报错。同时,构造函数也可以指定形参默认值,在传递参数不够时就使用默认值,这一点与基本的函数相同;也可以重载

    f14561240facf3ff24efb9281d955445.png

    执行结果:

    5b7c2d59b5f21d5f1f971a5752b942a4.png

    4.初始化列表

    4.1作用:

    对数据成员进行初始化

    4.2格式:

    构造函数():变量名1(数值),变量名2(数值)

    {} //!变量名不在花括号的后面,而是在花括号的前面

    7478acab38833aab40a04c4e9e408165.png

    4.3传递参数初始化列表

    717bba1ad78deee8831e4cb82228409f.png

    注意:

    1)在构造函数执行时,先执行初始化列表,实现变量的初始化,然后再执行函数内部的语句

    2)成员初始化的顺序只与声明的顺序有关,而跟初始化列表的顺序无关。例如在上面的初始化列表中,我们写成:_c(cc), _b(bb), _a(aa),但是我们还是先初始化变量_a,然后_b,然后_c,因为我们先声明的变量_a,然后_b,然后_c

    3)成员之间可以相互初始化:a(12), b(a) //a,b为相同类型的话

    看一个例子:

    866a5496c0098b6ff33a8a01a449429a.png

    从这个结果就可以看出来,在初始化列表中,虽然我们把_b的初始化写在前面的,但由于先声明的变量_a,所以_a先被初始化,并且用_b的值去初始化_a,但此时_b并没有被初始化,所以是一个随意值去初始化的_a,然后再用12初始化的_b,所以得到这样的结果

    5.引用和const常量的初始化

    1)当类成员中有引用和const常量时就一定得初始化,否则会报错

    6ec8cfd57e3e7c546e701a50130266e0.png

    为什么中间那行不是12呢?首先在主函数中,12传递给形参dd,dd变成12,所以第一行输出三个12;但是dd的作用域只在构造函数中,在执行函数show的时候,dd已经被销毁了,而引用_b关联了一个未知的内存,所以得到了一个未知的值

    如果想要得到正确的结果,我们应该在构造函数的形参那里加上一个&,使之成为一个实参的引用,即:

    Cperson(int &dd):_a(dd),_b(dd),_c(dd)

    这样dd是实参aa的引用,_b是dd的引用,也是aa的引用,但aa的作用域就在整个主函数内了,所以得到正确结果

    注意:

    在有多个构造函数的时候,初始化列表的使用,依靠于使用的那个构造函数。即,使用哪个构造函数就使用那个构造函数后面的初始化列表

    6.数组初始化

    格式:构造函数():数组名() //后面的这个括号里不能添加0或者其他数值

    注意:这种写法在VS是支持的,但是在VC中是不支持的,一般话的做法是:在构造函数中使用for循环来实现数组的每个元素赋值,或者用memset函数一次性为数组设

    011d0b690972e2e51a4fe29c333521e7.png

    7.结构体的初始化

    格式1:构造函数():结构体名({各个结构体成员的初始值,按顺序用逗号隔开})

    注意:结构体可以这样用花括号进行初始化,但是数组不可以

    59ecd6e7d9273bc6c48ec67a401a4ebb.png

    原文链接:https://blog.csdn.net/qq_33757398/article/details/81331918

    展开全文
  • 一. 类相关非成员函数Time mytime;... const成员变量的初始化 在头文件定义时赋初值进行初始化 在构造函数的初始化列表中进行初始化,不可以通过赋值来初始化//类定义(类声明) class Time { pr...

    一. 类相关非成员函数

    Time mytime;
    writeTime(mytime);
    

    二. 类内初始化

    c++11中,可以为类内成员变量提供一个初始值,在创建对象的时候,初始值就可以用来初始化该成员变量。在头文件中可以赋初值。

    三. const成员变量的初始化

    1. 在头文件定义时赋初值进行初始化
    2. 在构造函数的初始化列表中进行初始化,不可以通过赋值来初始化
    //类定义(类声明)
    class Time
    {
    private:
        int MilliSecond; //毫秒
    public:
        void initMilliSecond(int mls);
    public:
        int Hour; //小时
        int Minue; //分钟
        int Second = 0; //秒钟
        mutable int test; //测试变量
        const int ctestvalue = 80;  //定义了常量
    
        void initTime(int tmphour, int tmpmin, int tmpsec);
    }
    //构造函数列表
    Time::Time():ctestvalue(70)
    {
        Hour = 12;
        Second = 13;
        initMilliSecond(0);
        std::cout<<"调用了无参构造函数"<<std::endl;
    }
    

    四. 默认构造函数:没有参数的构造函数

    没有构造函数,这些类对象如何初始化?

    默认初始化, 通过一个特殊的构造函数来执行默认的初始化过程,这个特殊的构造函数就叫做默认构造函数 即无参数的构造函数。 原来,在类定义中如果没有构造函数的情况下,编译器就会为我们隐式的自动定义一个默认构造函数(无参) 称为合成的默认构造函数。 合成的默认构造函数其实什么也没做,成员变量有初始化值给初始化值,没有随机初始化。 一旦我们自己写了一个构造函数,不管构造函数的参数个数是多少,编译器都不会为我们创建“合成的默认构造函数”

    五. =default =delete

    time2.h

    #ifndef __MYTIME2__
    #define __MYTIME2__
    
    class OtherClass
    {
    public:
        OtherClass(int x);
    
    };
    
    //类定义(类声明)
    class Time2
    {
    public:
        explicit Time2(int a); //默认构造函数
        // Time2() {};
        Time2() =default; //编译器能够为这种=default的函数自动生成函数体 普通函数不能这样写, 带参数的构造函数也不能这样写
        Time2() =delete;  //让程序员显式的禁用某个函数
    public:
        int Hour;
        int Minute;
        int Second = 0;
        OtherClass oc1;
    };
    
    #endif
    

    time2.cpp

    #include "time2.h"
    
    Time2::Time2(int a ):oc1(3) //使用成员初始列表初始化oc1
    {
        Second = 11;
    }
    
    OtherClass::OtherClass(int x)
    {
    
    }
    
    展开全文
  • 0.初始化赋值的区别意义上:1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质2)赋值:在一个变量或者一个...对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值执行...

    0.初始化与赋值的区别

    意义上:

    1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质

    2)赋值:在一个变量或者一个对象在产生之后的任意时刻赋予一个值,属于任意性质

    宏观代码上:

    1)两者作用相同

    2)对于数组和结构体来说,初始化和赋值的的形式不同。对于数组,可以使用花括号一起初始化,如果赋值的话,就只能单个元素就行;对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值

    94473fc9370056af36875dd545d309c4.png

    执行结果:

    cd4b50125d2b5ee3eaa643d5723e5c61.png

    3)对于引用和const常量来说,只能初始化不能赋值

    1.类中的变量初始化

    1)一般情况下,声明一个类是并不占内存的,如果直接在类中给变量初始化也是不允许的,但在VS2017下自己测试了一下,居然可以

    5572498e43ac41418119faf19c53dbe8.png

    执行结果:

    1384fbf01db3ccb6a48144972532503c.png

    2.什么是构造函数

    构造函数也是一个函数,这个函数有几个特点:

    1)函数的名字与类的名字相同

    2)在创建一个对象时,构造函数就自动执行,但是在声明一个类的指针对象时,构造函数不会被调用,当new一个空间的时候,构造函数才会被调用

    3)构造函数一般用来对数据成员的赋值,这也是它的一般性作用

    4)构造函数没有返回值

    5)一个类里面也可以有多个构造函数,这些构造函数根据参数的不同,构成重载,根据参数的传递来选择调用哪个构造函数

    6)可以不用显式的定义构造函数,这种情况下,编译器会自动帮我们生成一个空构造函数,什么也不执行;如果我们显式的声明了一个构造函数,那么这个构造函数就会覆盖默认的空构造函数

    5e62cda93b188f8a8d347be4c33d07ba.png

    执行结果:

    7b7ae0d5e834e82d2063cb6404e45572.png

    3.构造函数的类型

    虽然构造函数没有返回值,但可以有参数,如果构造函数有参数,那么在创建对象时,就一定要传入参数,否则会报错。同时,构造函数也可以指定形参默认值,在传递参数不够时就使用默认值,这一点与基本的函数相同;也可以重载

    972bb6999ac0bd889fad8a6116969e4e.png

    执行结果:

    121f18d3dec5567edb7201d38566cb8e.png

    4.初始化列表

    4.1作用:

    对数据成员进行初始化

    4.2格式:

    构造函数():变量名1(数值),变量名2(数值)

    {} //!变量名不在花括号的后面,而是在花括号的前面

    3b90cf84d7ba493fd2e40a468a1251ee.png

    4.3传递参数初始化列表

    17151d48860bd8610f92d364034f046b.png

    注意:

    1)在构造函数执行时,先执行初始化列表,实现变量的初始化,然后再执行函数内部的语句

    2)成员初始化的顺序只与声明的顺序有关,而跟初始化列表的顺序无关。例如在上面的初始化列表中,我们写成:_c(cc), _b(bb), _a(aa),但是我们还是先初始化变量_a,然后_b,然后_c,因为我们先声明的变量_a,然后_b,然后_c

    3)成员之间可以相互初始化:a(12), b(a) //a,b为相同类型的话

    看一个例子:

    9d0cf7541951c4b327e02ed8b821bb49.png

    从这个结果就可以看出来,在初始化列表中,虽然我们把_b的初始化写在前面的,但由于先声明的变量_a,所以_a先被初始化,并且用_b的值去初始化_a,但此时_b并没有被初始化,所以是一个随意值去初始化的_a,然后再用12初始化的_b,所以得到这样的结果

    5.引用和const常量的初始化

    1)当类成员中有引用和const常量时就一定得初始化,否则会报错

    cfea249f00d3c4baff8d1339bd4dc22a.png

    为什么中间那行不是12呢?首先在主函数中,12传递给形参dd,dd变成12,所以第一行输出三个12;但是dd的作用域只在构造函数中,在执行函数show的时候,dd已经被销毁了,而引用_b关联了一个未知的内存,所以得到了一个未知的值

    如果想要得到正确的结果,我们应该在构造函数的形参那里加上一个&,使之成为一个实参的引用,即:

    Cperson(int &dd):_a(dd),_b(dd),_c(dd)

    这样dd是实参aa的引用,_b是dd的引用,也是aa的引用,但aa的作用域就在整个主函数内了,所以得到正确结果

    注意:

    在有多个构造函数的时候,初始化列表的使用,依靠于使用的那个构造函数。即,使用哪个构造函数就使用那个构造函数后面的初始化列表

    6.数组初始化

    格式:构造函数():数组名() //后面的这个括号里不能添加0或者其他数值

    注意:这种写法在VS是支持的,但是在VC中是不支持的,一般话的做法是:在构造函数中使用for循环来实现数组的每个元素赋值,或者用memset函数一次性为数组设

    06d61ccc94bf4d31e787c14e813891b0.png

    7.结构体的初始化

    格式1:构造函数():结构体名({各个结构体成员的初始值,按顺序用逗号隔开})

    注意:结构体可以这样用花括号进行初始化,但是数组不可以

    741adcaeb17f329a9732c867178f22fd.png

    原文链接:https://blog.csdn.net/qq_33757398/article/details/81331918

    展开全文
  • 之所以推荐在变量声明时进行初始化,是因为我们定义的类型往往有多个成员变量,这样会导致有多个构造器,这样成员变量和构造器之间很可能做不到同步更新。我们可以通过“在声明变量的同时初始化它们”的方式来解决这...
  • 无参构造只创建对象,不对对象的属性进行赋值。 有参构造创建对象,并且对对象的属性进行赋值。 this关键字:指当前类所产生的对象 this可以来修饰类中的属性和方法,只能在方法中使用。 在方法中的用法 this.属性名...
  • 对属性可以赋值的位置: 默认初始化 显式初始化 构造器中初始化 有了对象以后,可以通过对象,属性”或”对象,方法”的方式,进行赋值 在代码块中赋值
  • 注意不能在类声明中给数据成员赋值,只有在类的对象定义之后才能给数据成员赋初值 ...可以通过构造函数的初始化列表或构造函数的函数体实现。 初始化列表: Class A { Int I,j; Public: A(int a):i(a),j(a){} }
  • 2.含有类对象的最好在列表初始化中完成,如果在函数体内进行赋值,实际上是在列表初始化中先调用了类对象默认构造函数,然后在函数体内调用了operator=赋值运算符。另外,若一个函数没有默认构造函数,并且不在列表...
  • 这种是在构建对象的时候的初始化,是在对象创建成功之前完成的,和在函数体内赋值是不一样的,函数体内赋值是你的对象成员都已经创建好后对成员进行赋值。 Date(int year=1990,int month=1,int day=1) :_year...
  • java里初始化一个类的对象通过初始化块或者构造方法进行数据赋值。与其相关的执行代码有这么几种: 静态初始化初始化块 构造方法 静态初始化块 静态初始化块是由static修饰的初始化块,只在类加载时执行一次...
  • Java类 初始化

    2019-09-30 08:01:19
    java里初始化一个类的对象通过初始化快或者构造方法进行数据赋值。与其相关的执行代码有这么几种: 静态初始化初始化块 构造方法 静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块...
  • 成员初始化

    2019-09-17 00:36:27
    成员初始化 局部变量须初始化,否则编译错误。...C++中所不允许,可直接在类的定义的时候给出初值,并可以通过函数等各种方式进行赋值。 public class InitialValues2 { boolean bool = true; char ch = 'x'...
  • Java 中可以通过初始化进行数据赋值。如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。 需要特别注意:静态...
  • C++参数初始化

    2015-07-09 14:07:00
    通过上一节,我们知道构造函数的主要用途就是...如本例所示,本例在定义带参构造函数book(char *a, double p)时,不再是在函数体中一一赋值进行初始化,其函数体为空。在函数首部与函数体之间增添了一个冒并加上tit...
  • 属性可以赋值的位置

    2021-05-06 21:07:17
    /* * 对属性可以赋值的位置: * 1.默认初始化 * 2.显示初始化 5.在代码块中赋值 ...有了对象以后,可以通过对象.属性”或“对象.方法”的方式,进行赋值 * * * 执行的先后顺序:1 - 2 /5 - 3 - 4 * */ ...
  • 在创建一个新对象之后,一般可以通过将已有的对象赋值给新对象已完成对象初始化; 如: Computer newcom; newcom = oldcom; 如果类没有显示的定义类赋值操作符,一般编译器会为类生成一个默认的赋值操作符,...
  • 1.默认初始化 2.显示初始化 3.构造器中初始化 4.有了对象以后,可以通过对象.属性”或“对象.方法”的方式,进行赋值 5.在代码块中赋值
  •  1、普通成员变量:在生成对象实例的时候进行初始化,如没有显式赋值,则由系统默认初始化;  2、static成员变量:类加载的时候初始化,如没有显式赋值,则由系统默认初始化;  3、final常量:生成实例对象的...
  • ①默认初始化 * ②显式初始化/⑤在代码块中赋值 * ③构造器中初始化 * ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值 * * * 执行的先后顺序:① - ② / ⑤ - ③ - ④
  • c++参数初始化

    千次阅读 2019-04-15 09:32:57
    我们知道构造函数的主要用途就是初始化对象的,除了采用上节所讲述的那种在函数体中一一赋值的方法外,通过参数初始化表同样可以对象进行初始化,请看下面的代码(例1): class book { public: book(){} book...
  • java类的三种初始化块的执行顺序java里初始化一个类的对象通过初始化块或者构造方法进行数据赋值。与其相关的执行代码有这么几种:静态初始化初始化块构造方法静态初始化块静态初始化块只在类加载时执行一次,...
  • 一、初始化赋值的区别 ...对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值 二、构造函数特点 1、造函数也是一个函数,这个函数有几个特点: 1)函数的名字与类的名字相同 2)在创
  • Java 中可以通过初始化进行数据赋值。如: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500
精华内容 200
关键字:

对象可以通过赋值进行初始化