实例对象调用构造函数的静态方法会输出什么




1.Array.of()——将参数中的所有值作为元素形成数组

  • 不同类型也可以形成数组
  • 与对比Array(),Array()当参数只有一个时,是指定数组的长度。

2.Array.from()——从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

 转换可迭代对象

使用箭头函数 (自动生成自增数字的数组)

  • 类数组对象:必须含有 length 属性,且元素属性名必须是数值或者可转换为数值的字符。
  • 从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

find() ——【查找】查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。

  • 参数1:用来填充的值 
  • 参数2:被填充的起始索引 
  • 参数3(可选):被填充的结束索引,默认为数组末尾 

copyWithin()——【填充】将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。

  •  参数1:被修改的起始索引
  •  参数2:被用来覆盖的数据的起始索引
  •  参数3(可选):被用来覆盖的数据的结束索引,默认为数组末尾  


 

8.keys()——【遍历】遍历键名

 
 

 

 

11.flat()——嵌套数组转一维数组

 
 
  •  如果有参数,则指定转换的嵌套层数
  • 参数Infinity :不管嵌套多少层,都是转为一维数组
 

flatMap()——先对数组中每个元素进行了的处理,再对数组执行 flat() 方法。

 
 

 

  •  filter 不会改变原数组,它返回过滤后的新数组。

  • 若需要提前终止循环,可以使用

  • 此方法不会更改现有数组,而是返回一个新数组。 
  • 不会改变this或任何作为参数提供的数组,而是返回一个浅拷贝

every() —判断数组内的所有元素是否符合判断条件,返回一个布尔值。 

  • 注意:若收到一个空数组,不管如何,都会返回 true! !!!

indexOf()—在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

  • 如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.

  • 如果该值大于或等于数组的长度,则整个数组会被查找。
  • 如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。
  • 如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。

join()——将一个数组(或一个)的所有元素连接成一个字符串。

  • 如果数组只有一个项目,那么将返回该项目而不使用分隔符。
  • 如果缺省该值,数组元素用逗号(,)分隔。
  • 如果separator是空字符串(""),则所有元素之间都没有任何字符。

map()—创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。 

pop()—从数组中删除最后一个元素,并返回该元素的值。

  • 此方法更改数组的长度。

push() —将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

  • 当调用该方法时,返回值为新的  属性值。

reduceRight()—接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。

reverse() —方法将数组中元素的位置颠倒,并返回该数组。

  • 返回一个颠倒后的类数组对象 的引用。

如果数组为空则返回 。

  • 如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。

some() —测试数组中是不是至少有1个元素通过了被提供的函数测试,返回Boolean类型。 

  • 如果用一个空数组进行测试,在任何情况下它返回的都是false

  • 默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的 
  • 于它取决于具体实现,因此无法保证排序的时间和空间复杂性。
  • 如上述例子,比较数字时,并没有按照数字大小排序,如果要按照数字大小排序,则要指定一个比较函数。

splice() —通过删除或替换现有元素或者原地添加新的元素来修改数组。

指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。

整数,表示要移除的数组元素的个数。

如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是说,如果它大于或者等于start之后的所有元素的数量),那么start之后数组的所有元素都会被删除。

如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。

  • 数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(例如一个逗号 ",")隔开。 

toString() —返回一个字符串,表示指定的数组及其元素。

unshift() —方法将一个或多个元素添加到数组的开头,并返回该数组的新长度

  • 方法修改原有数组。 


1.判断数组相等不能用==或===

因为JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。

}
 


当查询结果为多结果集时,循环处理,但我们使用的99%都是单结果集

 

 

 

自动映射 / 手动映射

手动映射:根据配置的ResultMap,根据配置的列名,从ResultSer里面获取数据,然后借助MetaObject存入Bean

自动映射:首先获取到未配置的映射,也就是SQL返回了,但是没有ResultMap没有设置的,一般使用ResultType来返回结果,SQL返回的所有字段都是未映射集合,把这些列的数据存入对应的Bean

 

 

此部分为通过ResultSet获取到行结果时,需要实例化Java接收对象,那么实例化为4种情况:

  1. 返回结果存在TypeHandler,一般常用的类型会默认注册,实体类我们也可以手动创建,这样通过 createPrimitiveResultObject()来实例化对象
  2. 接口 或者 有默认的无参构造方法 直接通过构造方法创建
  3. 此时则代表没有TypeHandler,也没有配置构造标签,也没有无参构造,实体类提供了一个有参构造,那么会通过createByConstructorSignature()来执行,该方法会找到构造方法,然后参数会从结果中获取,而不是从构造标签获取
 

当我们在使用ResultMap自动值映射时,如果子标签中使用了select属性,代表使用了嵌套查询,相当于这个值需要在单独调用一次查询,这和下面要将的嵌套映射不一样,

嵌套查询相当于某个结果字段需要通过一段单独的查询来获取

嵌套映射相当于只进行了一次查询,但是我们需要对结果处理,变成嵌套的形式

下面整块的代码的主要功能就是:

  1. 获取嵌套查询的类型 和 参数对象,参数对象可能为单个 / 多个
  2. 借助ResultLoader进行查询,底层也是使用了Executor进行查询,所以在创建ResultLoader把执行器也传进去了
 

 

 

该代码主要类似于一个if/else判断,如果此1对多结果已经存在,那么新的数据行直接存入即可,如果没有存在,则需要创建父级,然后在直接存入1对多的子级

 

 

 

在ResultContext里面会存储当前的对象,以及一个stop字段,它用来干什么呢? 当我们获取结果集的时候,如果只想获取一部分,那么可以通过该字段来停止

默认的Map结果处理器

存放当前的解析对象,以及解析状态和解析数量

装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

该类就应用了装饰器模式,将ResultSet存入,同时又将关于结果集的各种属性处理好,这样在DefaultResultSetHandler中,就可以直接使用,从而将代码功能隔离,符合设计模式的单一职责原则

  1. 该类的主要作用为:通过ResultSetHandler需要将结果赋值到JavaBean中,那么需要给哪些字段赋值,在该类中就提前解析好
  2. 该类为装饰类,主要用于处理ResultMap标签和SQL执行结果之间的参数映射
  3. 映射结果以SQL返回结果为准

初始化,并且遍历获取到结果集的 列明集合,JDBC类型集合、Java类型集合

 

解析自动映射参数和未映射参数

 

发现这里面就简单了,和我们最原始的JDBC就一样了

}

JRE :英文名称(Java Runtime Environment),我们叫它Java运行环境,包括Java虚拟机和Java程序所需的核心类库等。如果想要运行一个开发好的Java程序,计算机只需要安装JRE即可。

JDK :英文名称(Java Development Kit),JDK是提供给Java考法人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用了在单独安装JRE了。其中的开发工具:编译工具(javac.exe)、打包工具(jar.exe)等。

2.Java中一个char类型是否可以存储一个汉字?

java采用unicode,2个字节(16位)来表示一个字符, 无论是汉字还是数字字母,或其他语言,char 在java中是2个字节。所以可以存储中文。

4.自动类型转换规则是什么?

规则1:如果一个操作数为double型,则整个表达式可提升为double型

规则2:满足自动类型转换的条件

数值类型(整型和浮点型)互相兼容

5.运算符优先级顺序是什么?

算术运算符>关系运算符>逻辑运算符

6.if和switch选择结构的区别是什么?

都是用来处理多分支条件的结构

switch选择结构只能处理等值条件判断的情况

多重if选择结构适合某个变量处于某个连续区间时的情况

b.初始情况不满足循环条件时

While循环一次都不会执行

continue一般用于循环结构中

b.作用(循环结构中)

Break语句终止本层循环,程序跳转到循环块外的下一条语句

Continue跳出本次循环,进入下一次循环

3.赋值(边声明边赋值;动态从键盘录入信息赋值)

10.类和对象的关系?

1.类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。

2.对象是类的一个具体。它是一个实实在在存在的东西。

*简单来说:类是对象的模板,对象是类的实例化。

11.类的开发步骤是什么?

12.局部变量和成员变量的区别是什么?

成员变量作用在整个类内都是可见的;局部变量仅限于它定义的方法内。

会为成员变量赋初值;不会给局部变量赋初值。

在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级。

成员变量类内方法外,局部变量在方法内

13.静态变量和实例变量的区别?

a.静态变量是被 static 修饰符修饰的变量,在内存中只有一个内存空间,在加载类的过程中完成静态变量的内存分配,可以直接通过(类名.)来访问。

b.实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它,每创建一个实例对象,就会为实例变量分配不同的内存,各个对象访问自己的实例变量。

c.无论创建了一个类的多少个对象,静态变量只初始化一次,所有的实例都可以访问此静态变量,而且可以通过类名直接访问。

不可以。String 类是由final修饰的,所以不可以被继承。

15.String类中常用的方法都有哪些?

获得字符串的长度:length()

将所有英文字符转换为小写字母:toLowerCase()

将所有英文字符转换为大写字母:toUpperCase( )

String:适用于少量的字符串操作的情况

StringBuilder:线程不安全,适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:线程安全,效率低适用多线程下在字符缓冲区进行大量操作的情况

(操作就是对字符串的拼接)JDBC中拼接sql

17.你对面向对象4大特性的理解?

封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。(减少代码冗余)

继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。

多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

18.方法的重载和重写的区别是什么?(方法的重载是发生在一个类里面的,方法的重写是发生在父子类之间的)

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;

重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

1.方法名一致,参数列表中参数的顺序,类型,个数不同。

2.重载与方法的返回值无关,发生在一个类里面的。

3.可以抛出不同的异常,可以有不同修饰符。

1.参数列表、返回类型必须完全与被重写方法的一致。

2.构造方法不能被重写,声明为 final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。

3. 发生在父子类之间的,访问权限子类不能严于父类。

20.多重继承下初始化顺序是什么?

先父类后子类,先属性后构造方法。

21.使用运行时多态开发的思路是什么?

b.编写子类,子类重写父类方法

c.运行时,使用父类的类型,子类的对象

22.类中向上转型和向下转型的区别是什么?

向下转型:父类转换为子类(使用instanceof强制类型转换)(对象 instanceof 类或接口)

向上转型:子类转换为父类(自动进行类型转换)使用父类的类型,子类的对象

23.接口和抽象类的区别?

1.继承实现方面((抽象类单继承,接口多实现)接口也可以继承其他接口)

①.抽象类中可以有普通成员变量,接口中没有普通成员变量

②.抽象类和接口中都可以包含静态成员变量

①.抽象类可以有构造方法,接口中不能有构造方法。

②.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

③.抽象类中的抽象方法的访问类型可以是public,protected默认类型 , 但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

④.抽象类中可以包含静态方法,接口中不能包含静态方法。

抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,"has-a"的关系。

接口在设计时要注意稳定性,不能随意改动方法的参数和返回值。

抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

24.java中常见的异常类型?

25.多重异常编写的注意事项?

a.排列catch语句的顺序:先子类后父类

b.发生异常时按顺序逐个匹配

c.只执行第一个与异常类型匹配的catch语句

(不要“吃异常”,父类兜底)

在catch中要输出异常信息和打印异常发生的堆栈信息,如果没有输出,则会造成异常发生了,但因为没有相关错误信息的输出,不知道异常发生的情况。这种情况简称“吃异常”。

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

运行时异常(Runtime Exception)编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。(bug的来源,出现运行时异常要排查)(父类RunTimeException)

受检查的异常(Checked Exception)要么用 try。。。catch 捕获,要么用 throws 字句声明抛出,交给它的父类处理,否则编译不会通过。(父类Exception)

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally:异常处理语句结构的一部分,表示总是执行。

finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。这是一个被动的方法(其实就是回调方法),不需要我们调用。

a.语句用在方法体内,表示抛出异常,由方法体内的语句处理。

b.是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。

a.是声明异常语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

b.主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

c. 表示出现异常的一种可能性,并不一定会发生这种异常

30.什么是装箱和拆箱,包装类的应用场景?

拆箱——包装类的变量可以被赋值为一个基本类型

装箱——基本类型的变量可以被赋值为一个包装类

主要应用在集合类中.(集合不允许存放基础数据类型,存放数字时,要用到包装类型)

a、集合不允许存放基础数据类型,存放数字时,要用包装类型;

b、包装类提供一系列实用的方法

①.List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;

②.List 中存储的数据是有顺序,并且允许重复;

③.Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

④.Set 中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashcode决定,位置是固定的(Set集合根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。

LinkedList采用链表存储方式。插入、删除元素时效率比较高。

33.如果一个HashMap存放有很多值,但是在不知道KEY是什么的情况下,如何遍历出所有的KEY和VALUE?

entrySet(),返回此映射中包含的映射关系(键-值)

取出所有key的集合、获取Iterator对象、取出key、根据key取出对应的值

34.进程和线程的区别?

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程。

进程包含了线程,线程必须属于某个进程,进程中的多个线程共享进程的内存,二者之间是一对多的关系。

35.线程的实现方式有哪几种?

特点:编写简单,可直接操作线程;适用于单继承

特点:避免单继承局限性;便于共享资源

特点:需要实现call()方法,call方法与run方法不同,call有返回值.

36.多线程中调用start方法和run方法的区别?

调用run()方法:只有主线程一条执行路径;不启动新线程(普通方法调用)。

调用start()方法:多条执行路径,主线程和子线程并行交替执行;启动一个线程。

调用start方法就是线程启动,调用后线程进入了就绪状态,

Run方法编写了线程要实现的功能,一般不直接调用,由系统来调用,如果调用就是普通的方法调用。

37.多线程中的问题?

①.程序需要同时执行两个或多个任务。例如:手机淘宝中"我的界面"的后台程序,开启多个线程从不同系统获取数据,组合发给前端APP。

②.程序需要实现一些需要等待的任务,例如:导出过大的Excel文件。

③.需要一些后台运行的程序,例如:Java垃圾回收器程序。

1、出现线程安全问题:当多线程有共享数据的时候,由于一个线程对共享数据的操作尚未完成,其它线程就参与进来,于是就产生了数据篡改的问题。

2、如何解决线程安全的问题:要保证一个线程操作共享数据的时候,其它线程必须在外边等候,直到操作共享数据的线程执行完,其它线程才可以操作共享数据。

3、同步方法的锁就是当前对象this,同步代码块需要指定锁对象(必须保证唯一);相比较而言,同步代码块能够更加精准地控制所要管理的代码。

另:调试多线程的排查手段是多输出日志,不再是Debug,使用log4j来输出中间处理结果,来进行问题的排查。

Hashtable是线程安全的,效率低,键和值都不允许为空。

Hashmap是非线程安全的,效率高,键和值都允许为空。

Hashtable为什么效率低就是线程安全的:

线程安全是以牺牲效率为代价的,Hashtable是synchronized(一种同步锁,用来共享数据,一次仅有一个线程能够访问共享数据)的,所以线程安全,多个线程访问时不需要为他自己的方法实现同步。

Yield:(礼让)当前线程贡献出对CPU的使用权,但是当前线程还是有可能再次获得CPU的使用权。

Join:当出现该方法时,暂停当前线程,执行其他进程,等待其他线程执行完后再执行暂停的进程。

线程在一定条件下,状态会发生变化。线程一共有以下几种状态:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

41.获取Class对象的三种方法是什么?

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

能够动态获取类的信息以及动态调用对象的方法。

反射机制主要提供以下功能

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法。

1、平时我们创建对象的时候,都是通过New某某类来创建的,但是通过反射技术,我们可以通过Class.forName(类的全路径)来创建实例,例如:加载JDBC驱动的时候,就是采用反射技术。

2、反射在平时开发中主要应用于框架层的开发,例如Spring框架内部就采用了反射技术来创建实例。

43.工厂模式和单例模式?

单例模式:应用该模式的类一个类只能有一个实例。它必须自行创建这个实例,必须自行向整个系统提供这个实例。从具体实现角度来说:一是单例模式的类只提供私有的构造函数;二是类定义中含有一个该类的静态对象私有对象;三是该类提供了一个静态的公有函数用于创建或获取它本身的静态私有对象。

工厂模式:就简单说,对象的创建由传统的自身创建交付给一个工厂类创建,然后自身通过工厂类的工厂方法获得对象即可,适用场景是对象的创建步骤繁琐,过程比较复杂。

工厂模式和单例模式的区别:

区别1:工厂模式可以创建不同种类的对象实例,单例模式只能创建一种的对象实例;

区别2:工厂模式创建的对象实例在内存中没有只能创建一份的要求,单例模式创建的对象实例在内存中只有一份。

}

我要回帖

更多关于 静态方法可以通过类的实例对象调用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信