高淇java基础教学教材笔记资料.doc

上传人:小** 文档编号:632814 上传时间:2019-04-22 格式:DOC 页数:26 大小:3.59MB
返回 下载 相关 举报
高淇java基础教学教材笔记资料.doc_第1页
第1页 / 共26页
高淇java基础教学教材笔记资料.doc_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《高淇java基础教学教材笔记资料.doc》由会员分享,可在线阅读,更多相关《高淇java基础教学教材笔记资料.doc(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-_第一讲:JAVA 如何学习 第二讲:计算机语言的发展史java 历史/核心优势 计算机语言发展历程:逐渐趋向人类能理解的语言机器语言 :即计算机能理解的语言。由 0 和 1 代码组成。 汇编语言 :使用英文缩写的助记符来表示基本计算机操作,主要通过操作指令来进行 对计算机的操作。 高级语言 :面向过程、面向对象 Java 简史: SUN ( Stanford University Network ) 公司 Green 项目 Java 发明人:James Gosling 发展历史: 1991 年,SUN 公司的 Green 项目,Oak 1995 年,推出 java 测试版 1996 年,J

2、DK1.0 1997 年,JDK 1.1 1998 年,JDK1.2 ,大大改进了早期版本的缺陷,是一个革命性的版本,更名为 Java22004 年,J2SE 5.0 ( 1.5.0 ) 2006 年,J2SE6.0 ( 1.6.0 ) 2011 年,JAVASE7.0 互联网发展(java 发展机遇) JAVA 核心优势: -跨平台 JAVA 各版本和体系结构 J2EE ( JAVAEE ) :JAVA 2 Enterprise Edtion定位在服务器端的应用 J2SE ( JAVASE ): JAVA 2 Standard Edtion 定位在个人计算机上的应用 J2ME ( JAVAM

3、E ):JAVA 2 Micro Edtion定位在消费性电子产品的应用上。 第三讲:JDK /JRE /JVM 区别 JDK /二进制 System.out.println( Intger.toOctalString( 需要转换的变量 ) ); /八进制 System.out.println( Intger.toHexString( 需要转换的变量 ) ); /十六进制 如果数据大小没有超过 byte/short/char 的表述范围,则可以自动转型 第八讲:浮点数/浮点数误差问题 浮点型 Float 类型又称作单精度类型,尾数可以精确到 7 位有效数字,在很多情况下, float 类型的精

4、度很难满足需求。 Double 表示这种类型的值精度是 float 类型的两倍,又被称为双精度,绝大多部 分应用程序都采用 double 类型。 Java 浮点类型常量有两种表示形式 十进制形式,如:3.14 科学记数法形式 ,如:134e2、314E2、314E-2 浮点数值默认为 double 类型。要将其变为 float 类型,需要在后面增加 F/f 如: 1.3f总结默认类型是 double 浮点数存在舍入误差,很多数字不能精确表示,如果需要进行不产生舍 入误差的精确数字计算,需要使用 BigDecimal 类。 最好避免比较中使用浮点数 第九讲:char 字符串入门 字符型 char

5、 单引号用来表示字符常量。如: A ,是一个字符,它与 ” A “是不同的, ”A “表示 含有一个字符的字符串。 Char 类型用来表示 unicode 编码表中的字符 Unicode 编码被设计用来处理各种语言的所有文字,它占 2 个字节,可允许有 65536 个字符; Java 语言允许使用转义字符 来将其后的字符转变为其它的含义。 Char 是在 0-65535 范围,运算时直接当作整数来运算。 可以把 0-65535 之间的整数直接转型为 char 布尔类型 boolean(一位,不是一个字节) Boolean 类型有两个值,true 和 false Boolean 用来判断逻辑条件

6、,一般用于程序流程控制 第十讲:基本数据类型自动转换/强制转型 自动类型转换 容量小的数据类型可以自动转换为容量大的数据类型(容量表示类型的范围,而-_不是字节数) 特例:可以将整型常量直接赋值给 byte,short, char 等数据类型变量,而不需 要进行强制类型转换,只要不超过其有效范围。强制类型转换 强制类型转换,又称为造型,用于显式的转换一个数值的类型,在有可能丢失信 息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。 当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被 截断成为一个完全不同的值。 基本类型转换时常见错误和问题 操作比较大的数时,

7、要留意是否溢出尤其是整数操作时 L 和 l 的问题不要命名名字为 l 的变量、long 类型使用大写 L 不要用小写 l 运行时表达式中的类型提升问题 所有的一元运算符(+ - * / %) ,都会有类型提升的问题 第十一讲:JDK 7.0 新特性/二进制整数/下划线 二进制整数/下划线 表示形式:0b 开头;如表示 byte 表示 1 为:0b00000001 若觉得查看不方便可以使用下划线分隔符(常用于写一些比较长的数字) 如:123_321_456 等 第十二讲: 变量-成员变量-局部变量/常量-命名规范 变量 Java 是一种强类型语言,每个变量都必须声明其类型。 Java 变量是程序

8、中最基本的存储单位,其要素包括变量名,变量类型和作用域。 变量在使用前必须对其声明,只有在变量声明以后才能为其分配相应长度的存储 单元,声明格式为: type varName =value ,varName =value ; 注意事项: 每个变量都有类型,类型可以是基本类型,也可以是引用类型。 变量名必须是合法的标识符。 变量声明 变量声明举例: int a; boolean value; double salary; 可以在一行中声明多个变量: int x,y,z ; /both are integers 不提倡这种风格,逐一声明每一个变量可以提高程序可读性。 可以将变量的声明和初始化放在同

9、一行中,如:int age = 18;-_局部变量和实例变量 局部变量:方法或语句块内部定义的变量 在使用前必须声明和初始化(赋初值) 。 实例变量(成员变量): 方法外部、类的内部定义的变量( 属性 ) 如果不自行初始化,它会自动初始化该类型的默认初始值(数值类型变量初 始化成 0 或 0.0 ,字符型变量的初始化值是 16 位的 0 ,布尔型默认是 false) u0000常量 final 其值无法改变的量 只能被初始化一次(只要赋值则其值无法改变) 常量的命名通常使用全大写,如果单词较多则使用下划线进行分隔 如: MAX_VALUE命名规范 所有变量、方法、类名:见名知意 变量、方法名:

10、 首字母小写和驼峰原则 如:run(), runRun(), age ,ageNew 常量:大写字母和下划线:MAX_VALUE 类名:首字母大写和驼峰原则 如:Man ,GoodMan 第十三讲: 运算符算术/逻辑/位运算/扩展运算符算术运算符 二元运算符类型提升(有两个操作数) 整数运算: 如果两个操作数有一个为 long,则结果也为 long 没有 long 时,结果为 int ,即使操作数全为 short、byte,结果也是 int 浮点运算 如果连个操作数有一个为 double,则结果为 double 只有两个操作数都是 float ,则结果才为 float 一元运算符(+,-) 如

11、:int a=3; 如:int b = a+; /执行完后,b=3 ,先给 b 赋值,再自增 如:int c = +a; /执行完后,c=5 ,先自增,再给 b 赋值-_逻辑运算符(只能操作布尔变量) 逻辑与 : 形式参数:在方法被调用时用于接收外界输入的数据 实参:调用方法时实际传给方法的数据 返回值:方法在执行完毕后返还给调用它的环境的数据 返回值类型:事先约定的返回值的数据类型,如:无返回值,必须给出返回值类 型 void。 Java 语言中使用下述形式调用方法:对象名.方法名(实参列表) 实参的数目,数据类型和次序必须和所调用方法声明的形参列表匹配 Return 语句终止方法的运行并指

12、定要返回的数据 Java 中进行方法调用中传递参数时,要遵循值传递的原则: 基本类型传递的是该数据值本身,引用类型传递的是对对象的引用,而不是 对象本身。 Java 中只有值传递! 第二十五讲:递归算法 递归算法 递归本身是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想 就是“ 自己调用自己 ” ,一个递归技术的方法将会直接或者间接的调用自己。 递归算法包括两个部分 定义递归头 /什么时候不调用自身方法,如果没有递归头,将会进入死循环。递归体 /什么时候需要调用自己 第二十六讲:API 文档package 的概念 API 是什么?Application Programming I

13、nterface 应用程序编程接口 Package 包的用法(作用类似于文件夹) 为什么需要 package? 为了解决类之间重名问题 为了便于管理类:合适的类位于合适的包! Package 怎么用? 通常是类的第一句非注释性语句。 用打包语句:package 包名; 包名:域名倒着写即可再加上模块名,并与内部管理类 注意事项: 写项目时都要加包,不要使用默认包 com.gao 和 com.gao.car ,这两个包没有包含关系,是两个完全独立的包,只 是逻辑上看起来后者是前者的一部分 JDK 中主要的包 Java.lang 包含一些 java 语言的核心类-_Java.awt 包含了构成抽象

14、窗口工具集的多个类用于(GUI) J 包含执行与网络相关的操作的类 Java.io 包含能提供多种输入/输出功能的类 Java.util 包含一些使用工具类 API 文档的生成 特殊的注释: 文档注释 :/* 使用 JAVADOC 生成 API 文档解决问题:代码和文档的分离 常用的 java 注释标签: auther 作者 version 版本 param 参数 return 返回值的含义 throws 抛出异常描述 第二十七讲:键盘输入scanner 类的使用import 使用 Scanner 类(实现计算机与用户的交互) Scanner s = new Scanner(System.in

15、); /系统输入 Import 导入包 第二十八讲:面向对象面向过程和面向对象的本质区分 面向对象以对象的方式,组织代码,封装数据 面向对象与面向过程区分-_第二十九讲:面向对象面向对象方式思考问题 高组织管理层 第三十/三十一讲:面向对象类和对象的关系 面向对象编程(OOP)的本质: 以类的方式组织代码,以对象的方式组织(封装)数据 面向对象思维:OOA(分析) , OOD(设计) 对象:具体的事物 类:是对对象的抽象(抽象 抽出象 相似 的部分)类似于分类 先有具体的对象,然后抽象各个对象之间的部分,归纳出类通过类再认识其他对象。 对象和类总结: 对象和类的关系:特殊到一般,具体到抽象 类

16、:class 对象:object ,instance(实例) 。 类可以看成一类对象的模版,对象可以看成该类的一个具体实例 类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具 有的静态和动态属性。 对象是 java 程序的核心,在 java 程序中 “ 万事万物皆对象” 。 JDK 提供了很多类供编程人员使用,编程人员也可以定义自己的类。 第三十一讲:面向对象程序执行过程内存分析 引用类型:(在没有进行赋值之前系统默认为 null) java 语言中除基本类型之外的变量类型都称为引用类型。 Java 中的对象是通过引用 reference(地址)对其操作的。 类的属性:(代

17、表静态数据) 属性:field ,或者叫成员变量 属性用于定义该类或该类对象包含的数据或者说静态属性 属性作用范围是整个类体 在定义成员变量时可以对其初始化,如果不对其初始化,java 使用默认的值对其 初始化。 (数值:0,0.0 char :u0000 , Boolean :false 所有引用类型:null) 属性定义格式: 修饰符 属性类型 属性名 = 默认值 类的方法:(动态行为) 面向对象中,整个程序的基本单位是类,方法是从属于类的。 方法定义格式:-_ 修饰符 方法返回值类型 方法名(形参列表)/n 语句 方法体 Java 中方法参数传递是 :值传递! 变量的作用域局部变量必须对

18、其进行初始化,实例变量则不必须 内存分析 栈 :自动分配连续的空间,后进先出 存放:局部变量 堆 :不连续的空间 存放 new 出来的对象 方法区:(属于堆里面的一个特殊示例) 存放:类的信息(代码-属性、方法) 、static 变量、常量池(字符串常量)等。操作对象就是操作地址-_代码(如下)第三十三讲:虚拟机内存管理垃圾回收机制-_垃圾回收机制(garbage collection) 对象空间的分配: 使用 new 关键字创建对象即可 对象空间的释放 将对象赋值 null 即可,垃圾回收器将负责回收所有“ 不可达 ” 对象的内存空间。 要点: 程序员无权调用垃圾回收器 程序员可以通过 Sy

19、stem.gc() .通知 GC 运行,但是 java 规范并不能保证立刻运 行。 finalize 方法,是 java 提供给程序员用来释放对象或资源的方法,但是尽量少 用。 第三十四讲:构造方法 构造方法(构造器):cinstructor 构造方法用于构造该类的对象(实例) 。 格式: 修饰符 类名 ( 形参列表 ) /n 语句; 是一种特殊的方法: 通过 new 关键字调用 构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类) ,不能 在构造器里调用 return 。 如果我们没有定义构造器,则系统会自动定义一个无参的构造函数。如果已定义 则编译器不会添加! 构造器的方法名

20、必须和类名一致! 作用:构造该类的对象,经常也用来初始化对象的属性。 第三十五讲:方法重载构造方法重载 重载(overload):一个名字对应多个方法 方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用 时,会根据不同参数表选择对应的方法。 两同三不同: 同一个类,同一个方法名 不同:参数列表不同(类型、 个数 、顺序不同) 只有返回值不同不构成方法的重载 只有形参的名称不同,不构成方法的重载 与普通方法一样,构造方法也可以重载 第三十六讲:static 变量和方法内存分析 static Static 关键字 在类中,用 static 声明的成员变量为静态变量:或者叫做类属

21、性,类变量。 它为该类的公用变量,属于类,该类的所有实例共享,在类被载入时被显式初始 化。 对于该类的所有对象来说,static 成员变量只有一份。被该类的所有对象共享。 可以使用“ 对象.类属性 ” ,来调用。不过一般都是用“ 类名.类属性 ”。 Static 变量置于方法区中!-_用 static 声明的方法为静态方法或者叫类方法 不需要对象,就可以调用(类名.方法名) 在调用该方法时,不会将对象的引用传递给它,所以在 static 方法中不可访问非 static 的成员。 Static 内存分析 第三十七讲:this 隐式参数内存分析 This 关键字 (是指向调用对象本身的引用名) 在

22、普通方法中,this 总是指向调用该方法的对象 构造方法中,this 总是指向正要初始化的对象 This 不能用 static 方法 常见用法: 引用类的隐藏数据域 第三十八讲:继承基本概念 继承 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。 (OOD 面向对象设计角度分析) 。 提高代码复用性(OOP 面向对象编码角度分析) extends 意思是“ 扩展 ”。子类是父类的扩展 继承小结: 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法) 。 Java 中只有单继承,没有象 c+ 那样的多继承。 Java 中的多继承可以通过接口来实现 如果定义一个

23、类时,没有调用 extends ,则它的父类是 java.lang.Object (也就是 根类) 。 不同的叫法:超类、父类、基类、子类、派生类 第三十九讲:继承方法的重写(override) 在子类中可以根据需要对从基类中继承来的方法重写。 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。-_重写方法不能用比被重写方法更严格的访问权限(由于多态) 。 第四十讲:继承object 类用法toString 和 equals 方法重写 toString Object 类 Object 类是所有 java 类的根基类 如果在类的声明中未使用 extends 关键字指明其基类,则默认基

24、类为 object 类 toString 方法 :返回该对象的字符串表示。 重写 :toString 方法:默认返回:包名+类名+哈希码 可以重写 equals 方法:指示其他某个对象是否与此对象“相等”。 第四十一讲:继承super 构造器的调用继承的内存分析 super 关键字(隐式参数) super 是直接父类对象的引用,可以通过 super 来访问父类中被子类覆盖的方法 或属性。 (必须在方法中使用) 普通方法:没有顺序限制,可以调用。 构造函数中:任何类的构造函数中,若是构造函数的第一行代码没有显式的调用 super() ;那么 java 默认都会调用 super() ; 作为父类的

25、初始化函数。 内存分析第四十二讲:继承组合 “ is a ” 关系使用继承“ hasa ” 关系使用组合 第四十三讲:final 修饰变量方法类(最终的值) 修饰变量 常量 修饰方法 该方法不能被重写,可以重载 修饰类-_修饰的类不能有子类,不能被继承。如:Math,String 第四十四讲:封装 封装(encapsulation) 封装的作用和含义? 封装对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统 的扩展型,可维护性。 程序设计追求“ 高内聚,低耦合 ” 。 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉; 低耦合:仅暴露少量的方法给外部使用。 使用访问权限符

26、,实现封装 封装要点: 类的属性的处理: 1.一般使用 private (除非本属性确定会让子类继承)常量和 static 的公开 2.提供相应的 get/set 方法来访问和设置相关属性,这些方法通常是 public ,从 而提供对属性的读取操作。 (注:boolean 变量的 get 方法是用:is 开头 ) 一些只用于本类的辅助性方法可以用 private 希望其他类调用的方法用 public。 第四十五讲:多态基本概念强制转型问题 多态(polymorphism) 多态性是 OOP 中的一个重要特性,主要是用来实现动态联编的,即程序的最终状 态只有在执行过程中才能被决定而非在编译期间就

27、决定了。这对于大型系统来说 能提高系统的灵活性和扩展性。 Java 中如何实现多态?使用多态的好处? 1.引用变量的两种类型:编译时类型(模糊一点,一般是父类) 由声明时的类型决定 2.运行时类型(运行时,具体是那个子类就是那个子类) 由实际对应的对象类型决定 多态的存在要有三个必要条件: 要有继承,要有方法重写,父类引用指向子类对象 多态是方法的多态 instanceof :判断一个对象是不是这个类型的对象 (强制类型转换问题) 第四十六讲:多态内存分析 this 指向本身创建完的对象 内存分析-_ 第四十七讲:内存分析深化(模拟 sevlet 中的方法调用) 第四十八讲:抽象类抽象方法 抽

28、象类 abstract class ( 包含了抽象方法的类 只有方法的声明而没有方法体 ) 为什么需要抽象类?如何定义抽象类? 是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版 基础上进行扩展。 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限 制子类的设计,使子类之间更加通用。 要点: 有抽象方法的类只能定义抽象类 抽象类不能实例化,及不能用 new 来实例化抽象类。 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来 new 实例, 只能用来被子类调用 抽象类只能用来继承 抽象方法必须被子类实现 抽象方法的意义在于:将方法的设计和方法的实现

29、分离了 第四十九讲:接口详解-_接口(interface) 接口中只有常量、抽象方法 接口的意义在于设计和实现分离 为什么需要接口?接口和抽象类的区别? 接口就是比“ 抽象类 ”还抽象的“ 抽象类 ” ,可以更加规范的对子类进行约束。 全面地专业地实现了:规范和具体实现的分离。 接口就是规范,定义的是一组规则,体现了现实世界中“ 如果你是则必须能” 的思 想。 第五十讲:回调的实现模版方法模式 回调的实现 CallBack Hook模版方法模式 第五十一讲:内部类详解 在另一个类里面定义的类,称为内部类 内部类的作用: 1.内部类提供了更好的封装,只能让外部类直接访问,不能允许同一个包 中其他

30、类访问。 2.内部类可以直接访问外部类的私有属性,内部类被当成外部类的成员,但外部类不 能访问内部类的属性 第五十二讲:数组数组基本概念内存分析 数组数组是相同类型数据的有序集合(数组也是对象) 数组特点: 1.其长度是确定的。数组一旦被创建,它的大小就是不可以改变的 2.其元素必须是相同类型,不允许出现混合类型 3.数组中的元素可以是数据类型,包括基本数据类型,引用数据类型 数组基本概念 数组是相同类型数据的有序集合(数组也是对象) 1.数组也是对象,数组元素相当于对象的成员变量 数组内存分析-_第五十三讲:数组数组的三种初始化方式 创建数组:java 中使用关键字 new 创建数组对象 数

31、组声明方式:1. type arr_name; 2. type arr_name ; 默认初始化:默认为 null 静态初始化 int b = 1,2,3 ; 动态初始化 int a=new int4; for ( int i=0 ; ia.Lemght;i+) ai=i*12; 第五十四讲:数组String 类的常用方法JDK 源码分析 字符串的使用 java 字符串就是 unicode 字符序列 java 没有内置的字符串类型,而是在标准 java 类库中提供了一个预定义的类 String,每个用双引号括起来的字符串都是 string 类的一个实例。 第六十五讲:Date 类的使用 时间处

32、理相关的类 java.util.Date ( 时间类 ) 在标准 java 类库中包含了一个 Date 类,它的对象表示一个特定的瞬间,精确到毫秒 java 时间的表示说白了也是数字,是从:标准纪元 1970.1.1.0 点开始到某个时刻的毫 秒数,类型是 long Date() ; setTime(); getTime();Date 类的核心就是所操作数比较,显示 第六十六讲:DateFormat 和 SimpleDateFormat时间和字符串的转换 DateFormat df = new SimpleDateFormat (“yyyy-MM-dd hh:mm:ss”)完成字符串和时间对象

33、的转化 format parseDateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析 日期或时间。 第六十八讲:可视化日历程序-_package cn.bjsxt.test; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.

34、util.Scanner; /* * 可视化日历程序 * author dell */ public class VisualCalendar public static void main(String args) System.out.println(“请输入日期(按照格式:2030-3-10):“); Scanner scanner = new Scanner(System.in); String temp = scanner.nextLine(); DateFormat format = new SimpleDateFormat(“yyyy-MM-dd“); try Date date

35、 = format.parse(temp); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); int day = calendar.get(Calendar.DATE); calendar.set(Calendar.DATE, 1); int maxDate = calendar.getActualMaximum(Calendar.DATE);System.out.println(“日t 一t 二t 三t 四t 五t 六“); for(int i=1;icalendar.get(Calendar.DAY_

36、OF_WEEK);i+) System.out.print(t);-_ for(int i=1;i=maxDate;i+) if(i=day) System.out.print(“*“); System.out.print(i+“t“); int w = calendar.get(Calendar.DAY_OF_WEEK); if(w=Calendar.SATURDAY) System.out.print(n); calendar.add(Calendar.DATE, 1); catch (ParseException e) e.printStackTrace(); 第七十讲: file 类的使用 file 类: java.io.File 类:文件和目录路径名的抽象表示形式。第七十二讲:异常机制ExceptionThrowable-Error 的概念 java 异常是 java 提供的用于处理程序中错误的一种机制 java 采用面向对象的方式来处理异常的。处理过程: 抛出异常:在执行一个方法时:在执行一个方法时:如果发生异常,则这个方法生成 代表该异常的一个对象,停止当前执行路径,并把异常对象提交给 JRE。 捕获异常:JRE 得到该异常后,寻找相应的代码来处理该异常。JRE 在方法的调用栈中 查找,从生成异常的方法开始回溯,知道找到相应的异常处理代码为止。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com