精华内容
下载资源
问答
  • 但是警告说我没有初始化数组,我尝试过完全搜索数组没有发现空的项。 ![图片说明](https://img-ask.csdn.net/upload/202005/14/1589462816_169812.png) 请问大佬们是什么情况?fei'chang'gan'xie
  • #include<iostream> #include<cstdlib> #define LEN 10 using namespace std;...R:\C++Test\useObjArray.cpp(10) : warning C4520: 'A' : multiple default constructors specified ...
  • JAVA类的初始化顺序给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的...

    JAVA类的初始化顺序

    给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了解。

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    public class InitialOrderTest {

    // 静态变量

    public static String staticField = "静态变量";

    // 变量

    public String field = "变量";

    // 静态初始化块

    static {

    System.out.println(staticField);

    System.out.println("静态初始化块");

    }

    // 初始化块

    {

    System.out.println(field);

    System.out.println("初始化块");

    }

    // 构造器

    public InitialOrderTest() {

    System.out.println("构造器");

    }

    public static void main(String[] args) {

    new InitialOrderTest();

    }

    }

    运行以上代码,我们会得到如下的输出结果:

    静态变量

    静态初始化块

    变量

    初始化块

    构造器

    这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

    class Parent {

    // 静态变量

    public static String p_StaticField = "父类--静态变量";

    // 变量

    public String p_Field = "父类--变量";

    // 静态初始化块

    static {

    System.out.println(p_StaticField);

    System.out.println("父类--静态初始化块");

    }

    // 初始化块

    {

    System.out.println(p_Field);

    System.out.println("父类--初始化块");

    }

    // 构造器

    public Parent() {

    System.out.println("父类--构造器");

    }

    }

    pblic class SubClass extends Parent {

    // 静态变量

    public static String s_StaticField = "子类--静态变量";

    // 变量

    public String s_Field = "子类--变量";

    // 静态初始化块

    static {

    System.out.println(s_StaticField);

    System.out.println("子类--静态初始化块");

    }

    // 初始化块

    {

    System.out.println(s_Field);

    System.out.println("子类--初始化块");

    }

    // 构造器

    public SubClass() {

    System.out.println("子类--构造器");

    }

    // 程序入口

    public static void main(String[] args) {

    new SubClass();

    }

    }

    运行一下上面的代码,结果马上呈现在我们的眼前:

    父类--静态变量

    父类--静态初始化块

    子类--静态变量

    子类--静态初始化块

    父类--变量

    父类--初始化块

    父类--构造器

    子类--变量

    子类--初始化块

    子类--构造器

    现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

    那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。

    静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

    Java构造时初始化陷阱

    让我们先来看两个类:Base和Derived类。注意其中的whenAmISet成员变量,和方法preProcess()

    public class Base {

    Base() {

    preProcess();

    }

    void preProcess() {}

    }

    public class Derived extends Base {

    public String whenAmISet = "set when declared";

    @Override void preProcess(){

    whenAmISet = "set in preProcess()";

    }

    }

    如果我们构造一个子类实例,那么,whenAmISet 的值会是什么呢?

    public class Main {

    public static void main(String[] args) {

    Derived d = new Derived();

    System.out.println( d.whenAmISet );

    }

    }

    再续继往下阅读之前,请先给自己一些时间想一下上面的这段程序的输出是什么?是的,这看起来的确相当简单,甚至不需要编译和运行上面的代码,我们也应该知道其答案,那么,你觉得你知道答案吗?你确定你的答案正确吗?

    很多人都会觉得那段程序的输出应该是“set in preProcess()”,这是因为当子类Derived 的构造函数被调用时,其会隐晦地调用其基类Base的构造函数(通过super()函数),于是基类Base的构造函数会调用preProcess() 函数,因为这个类的实例是Derived的,而且在子类Derived中对这个函数使用了override关键字,所以,实际上调用到的是:Derived.preProcess(),而这个方法设置了whenAmISet 成员变量的值为:“set in preProcess()”。

    当然,上面的结论是错误的。如果你编译并运行这个程序,你会发现,程序实际输出的是“set when declared ”。怎么为这样呢?难道是基类Base 的preProcess() 方法被调用啦?也不是!你可以在基类的preProcess中输出点什么看看,你会发现程序运行时,Base.preProcess()并没有被调用到(不然这对于Java所有的应用程序将会是一个极具灾难性的Bug)。

    虽然上面的结论是错误的,但推导过程是合理的,只是不完整,下面是整个运行的流程:

    进入Derived 构造函数。

    Derived 成员变量的内存被分配。

    Base 构造函数被隐含调用。

    Base 构造函数调用preProcess()。

    Derived 的preProcess 设置whenAmISet 值为 “set in preProcess()”。

    Derived 的成员变量初始化被调用。

    执行Derived 构造函数体。

    等一等,这怎么可能?在第6步,Derived 成员的初始化居然在 preProcess() 调用之后?是的,正是这样,我们不能让成员变量的声明和初始化变成一个原子操作,虽然在Java中我们可以把其写在一起,让其看上去像是声明和初始化一体。但这只是假象,我们的错误就在于我们把Java中的声明和初始化看成了一体。

    下面是对上面各个步骤的逐条解释。

    进入构造函数。

    为成员变量分配内存。

    除非你显式地调用super(),否则Java 会在子类的构造函数最前面偷偷地插入super() 。

    调用父类构造函数。

    调用preProcess,因为被子类override,所以调用的是子类的。

    于是,初始化发生在了preProcess()之后。这是因为,Java需要保证父类的初始化早于子类的成员初始化,否则,在子类中使用父类的成员变量就会出现问题。

    正式执行子类的构造函数(当然这是一个空函数,虽然我们没有声明)。

    其实 这些在理解了 Java运行原理  和  Java内存分配  之后就很容易理解了。

    展开全文
  • application.yml 的配置 server: port: 9001 app: id: speech knowledge: init: knowledgeTitles: - kdTitle: 听不清 keyWords: "[你说什么,没听清,听不清楚,再说一遍]" question: "[没听懂,听不清楚]...
    1. application.yml 里的配置
    server:
      port: 9001
    app:
      id: speech
    knowledge:
      init:
        knowledgeTitles:
          - kdTitle: 听不清
            keyWords: "[你说什么,没听清,听不清楚,再说一遍]"
            question: "[没听懂,听不清楚]"
          - kdTitle: 无应答
            kdInfos:
              - 你好
              - hello
              - hi
    

    (用 - 来表示数组)

    1. 初始化类
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import javax.annotation.PostConstruct;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    import org.springframework.util.ObjectUtils;
    
    /**
     * @author jly
     * @describe 从application.yml中读取初始值
     */
    @Component
    @ConfigurationProperties(prefix="knowledge.init")
    @Slf4j
    public class SpeechInfoConfig {
    	// 名称要和application.yml 里配置的一样,必须有get和set方法
      private List<KnowledgeTitle> knowledgeTitles = new ArrayList<>();
    
      public static class KnowledgeTitle{
    
        private String kdTitle;
        private String keyWords;
        private String question;
        private String[] kdInfos;
    
        public String getKdTitle() {
          return kdTitle;
        }
    
        public void setKdTitle(String kdTitle) {
          this.kdTitle = kdTitle;
        }
    
        public String getKeyWords() {
          return keyWords;
        }
    
        public void setKeyWords(String keyWords) {
          this.keyWords = keyWords;
        }
    
        public String getQuestion() {
          return question;
        }
    
        public void setQuestion(String question) {
          this.question = question;
        }
    
        public String[] getKdInfos() {
          return kdInfos;
        }
    
        public void setKdInfos(String[] kdInfos) {
          this.kdInfos = kdInfos;
        }
    
        @Override
        public String toString() {
          return "KnowledgeTitle{" +
              "kdTitle='" + kdTitle + '\'' +
              ", keyWords='" + keyWords + '\'' +
              ", question='" + question + '\'' +
              ", kdInfos=" + Arrays.toString(kdInfos) +
              '}';
        }
      }
    
      public List<KnowledgeTitle> getKnowledgeTitles() {
        return knowledgeTitles;
      }
    
      public void setKnowledgeTitles(
          List<KnowledgeTitle> knowledgeTitles) {
        this.knowledgeTitles = knowledgeTitles;
      }
    
    
    /**
       * Spring Boot中初始化资源的方式之一  @PostConstruct
       */
      @PostConstruct
      public void initSpeech(){
    
        if(!ObjectUtils.isEmpty(knowledgeTitles)){
          for(KnowledgeTitle knowledgeTitle : knowledgeTitles){
            log.info("knowledgeTitle is :{}",knowledgeTitle );
          }
        }
    
      }
    }
    
    •  
    1. 设置启动类
    @SpringBootApplication
    public class TestYmlApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(TestYmlApplication.class, args);
      }
    
    }
    
    •  
    1. 若SpringInfoConfig类提示飘红
      在这里插入图片描述
      在pom.xml中添加下面的jar包,即可解决:
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-configuration-processor</artifactId>
          <optional>true</optional>
        </dependency>
    
    •  
    1. 运行,查看log
      在这里插入图片描述
    2. 若中文显示为乱码,在setting 里修改下文件编码格式
      在这里插入图片描述
    展开全文
  • 大家去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台...

    大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的

    关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某

    种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际

    上是在考查我们对于继承情况下类的初始化顺序的了解。

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化

    顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下

    面的测试代码来验证这一点:

    Java 代码

    public class InitialOrderTest {

    // 静态变量

    public static String staticField = "静态变量";

    // 变量

    public String field = "变量";

    // 静态初始化块

    static {

    System.out.println(staticField);

    System.out.println("静态初始化块");

    }

    // 初始化块

    {

    System.out.println(field);

    System.out.println("初始化块");

    }

    // 构造器

    public InitialOrderTest() {

    System.out.println("构造器");

    }

    public static void main(String[] args) {

    new InitialOrderTest();

    }

    }

    运行以上代码,我们会得到如下的输出结果:

    1. 静态变量

    2. 静态初始化块

    3. 变量

    4. 初始化块

    5. 构造器

    这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获

    取最终结果:

    Java代码 :

    class Parent {

    // 静态变量

    public static String p_StaticField = "父类--静态变量";

    // 变量

    public String p_Field = "父类--变量";

    // 静态初始化块

    static {

    System.out.println(p_StaticField);

    System.out.println("父类--静态初始化块");

    }

    // 初始化块

    {

    System.out.println(p_Field);

    System.out.println("父类--初始化块");

    }

    // 构造器

    public Parent() {

    System.out.println("父类--构造器");

    }

    }

    public class SubClass extends Parent {

    // 静态变量

    public static String s_StaticField = "子类--静态变量";

    // 变量

    public String s_Field = "子类--变量";

    // 静态初始化块

    static {

    System.out.println(s_StaticField);

    System.out.println("子类--静态初始化块");

    }

    // 初始化块

    {

    System.out.println(s_Field);

    System.out.println("子类--初始化块");

    }

    // 构造器

    public SubClass() {

    System.out.println("子类--构

    展开全文
  • 成员变量数组初始化方法解析

    千次阅读 2010-09-16 20:41:00
    某些情况下,写C++的时候,希望能通过一个静态初始化函数来对的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员添加一些固定的内容等。这Java通过static块很容易实现。但...

    某些情况下,在写C++类的时候,希望能通过一个静态初始化函数来对类的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员里添加一些固定的内容等。这在Java里通过static块很容易实现。但在C++里该怎么办呢?

      如果要初始化一个普通的静态成员,只需要在实现文件(源文件)中定义该成员并赋予初始值即可,比如:

    class Test1 {
    public:
        
    static string emptyString;
    };

    string Test1::emptyString = "";
    // also can be
    // string Test1::emptyString;
    // string Test1::emptyString("");

      静态函数是不能像这样直接调用的。但是,不妨利用一下C++初始化普通成员的特点来调用静态初始化函数。当然,这需要定义一个额外的静态成员变量来辅助一下。如:

    class Test2 {
    public:
        
    static vector<string> stringList;
    private:
        
    static bool __init;
        
    static bool init() {
            stringList.push_back(
    "string1");
            stringList.push_back(
    "string2");
            stringList.push_back(
    "string3");

            
    return true;
        }
    };

    vector
    <string> Test2::stringList;
    bool Test2::__init = Test2::init();

      上面这个示例中初始化成静态成员__init的时候就“顺便”调用了静态初始化函数init(),达到预期目的。

     

    项目例子:

    #include "StdAfx.h"
    #include "CTrackView.h"
    #include "DataBaseInfo.h"

    CVSS_Rect CTrackView::m_WorldRt(0,0,0,0);
    CRect CTrackView::m_ScreenRt(0,0,0,0);
    HDC CTrackView::m_HDC = NULL;
    v_VnoPoint CTrackView::v_VnoPt;
    CTrackView::CTrackView(void)
    {
    }

    CTrackView::~CTrackView(void)
    {
    }

    .......

    展开全文
  • 如何初始化一个结构体数组背景第二次作业概述问题结论 用CSDN很长时间了也从中学到很多东西,从今天开始决定它上面留下点自己的痕迹,以便以后复习查阅,如果能够帮到或者被帮到就更好啦~ 背景 做算法课第二...
  • }注意不是构造函数里初始化的哦亲~先剧透一下……如果直接使用zend_declare_property来初始化一个属性为空数组,会得到以下错误:Fatal error: Internal zval's can't be arrays, objects or resources in Unknown...
  • 关于数组初始化的问题,如果每个值都不一样要如何给数组赋值呢? 关于变量在全局的地方定义和和类里面定义,我调用的结果显示不一样,比如类里面的变量输出1,全局的变量输出2。某个值我想保持在类里面的变量,...
  • [C++] 如何初始化常量数组成员

    千次阅读 2010-02-28 16:57:00
    今天编程时想在类中声明一个常量数组,发现无法初始化,后来在网上搜索,证明这是一个无法解决的问题。 因为根据C++语法,常量声明必须要在构造函数后用参数方式初始化,而x({1.0,2.0})又不符合语法。 只能声明成...
  • 基础是关于Java里面的数组拷贝,Java里面的数组有两种复制方式,一种是下面例子中的直接赋值相等,此时staff数组与managers数组引用的是同一个数组,修改staff数组也就等同于修改managers数组。此时的拷贝相当于...
  • 前几天碰到了一个很奇怪的问题 定义了一个CCalculator 里面有一个私有二维字符数组 char m_priTable[7][8] 构造函数里面无论怎样初始化都出现问题 于是最终的解决方法是 .h里面加 static char m_priTable[7][8...
  • 今晚论坛看到一篇帖子(http://topic.csdn.net/u/20100808/20/6d0557e2-62ca-4b5c-9f61-153206072de4.html),是关于常成员变量数组初始化的问题,以前碰到过这个问题,网上搜了一下,只看到两种替代的方案。...
  • 数组初始化的两种方式:静态初始化、动态初始化。 内存分析 第一步声明数组的时候,先栈里面压入了array。 第二步创建数组的时候,堆里面开辟了内存。 第三步给数组元素赋值。 数组使用 一、For-Each循环 ...
  • 的错误,我仔细看了这个定义,没错啊又查了查数组定义 也没错啊 小郁闷了一下,又google了数组初始化,也是对的。查了好多帖子 终于发现 不能class出现这样的初始化列表赋值定义。把它挪到class外面去了
  • 数组的申明 int[] a; //推荐 int b[]; //早期方便c 或 c++ 定义 int[] a =new int[999];... 建立一个 array变量 ,当array =new int【12】,arra变量堆中建立一个空间存放数组 数组的基本特点 .
  • 在类里定义一个数组 class A { public: A(); private: int m_a[3]; }; 在实现文件里初始化 A::A() { // 这样为什么不对 m_a = {1, 2, 3}; // 这样就可以 m_ap[0] = 1; m_ap[1] = 2; m_ap[2]...
  • Java内存分析 Java内存 1. 堆 存放 new 的对象和数组 可以被所有的线程共享,不会存放别的对象引用 2. 栈 存放基本变量类型(会包含基本类型的具体数值) 引用对象的变量(会存放... //自定义的类数组初始化 动态
  • 在类中声明一个字符型的数组,不进行初始化 class Person { public: char m_Name[64]; int m_Age; }; 然后在主函数中调用这个类里面的数组进行初始化的时候 显示说“表达式的左值必须为可修改的左值”。 int main()...
  • 编译报错 构造函数…中…数组被用作初始值设定 原因: 类里的属性有数组的,不能赋值。 解决办法: 将类里数组属性不赋值,只声明,构造函数里再初始化赋值。
  • 一个mouseclick监听器类里生成了一个随机数组,然后另一个窗口组件类中点击一下随机生成按钮就可以生成一个随机数组,但是问题是我用set方法没有办法将监听器里生成的随机数组传递到窗口组件类中,运行出来的...
  • 数组

    2019-08-06 11:28:51
    数组中的元素可以是任意类型(包括基本类型和引用),但同一个数组里只能存放类型相同的元素。创建数组大致包括如下步骤: . 声明一个数组类型的引用变量,简称为数组变量; . 用new语句构造数组的实例。new语句为数...
  • 7.6成员初始化Java尽量保证所有变量使用前都能得到恰当的初始化。对于方法的局部变量,这种保证会以编译时错误的方式呈现,所以如果写成:你会得到一条错误信息,告诉你i可能尚未初始化。编译器可以为i赋一个...
  • 数组初始化应该很简单了,可以直接{}中赋值,初始值的大小根据给定的元素决定的 然后 (使用添加的方法来实现)   1.添加数组 随着我们增加一个数据,这个elements就会自增1,;当我们第一次使用的...
  • } 2、对象成员的初始化,如果该对象成员有不带参数的构造函数,则构造函数处(瑶瑶按:这里的“本”指的是CMyClass)可以直接赋值,因为其默认调用了不带参数的构造函数为其分配空间: 3、但如果该对象...
  • 并用这一大小来初始化数组w。 该还提供一个方法addWeapon(Weapon wa),表示把参数wa所代表的武器加入到数组w中。 这个中还定义两个方法attackAll()让w数组中的所有武器攻击; 以及moveAll()让w数组中的所有可...
  • 数组的概念 概念 :用来存储一组相同数据类型的集合 引用数据类型: 接口 数组 ...2.数组的动态初始化 给定数组的长度由系统分配空间和初始值; 3.格式:数据类型[ ] 数组名=new 数据类型[长度]; 4. 数组中的数据的存取 5

空空如也

空空如也

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

在类里初始化数组