Java语言基础PPT.ppt

上传人:本田雅阁 文档编号:2124854 上传时间:2019-02-19 格式:PPT 页数:110 大小:453.51KB
返回 下载 相关 举报
Java语言基础PPT.ppt_第1页
第1页 / 共110页
Java语言基础PPT.ppt_第2页
第2页 / 共110页
Java语言基础PPT.ppt_第3页
第3页 / 共110页
亲,该文档总共110页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java语言基础PPT.ppt》由会员分享,可在线阅读,更多相关《Java语言基础PPT.ppt(110页珍藏版)》请在三一文库上搜索。

1、第2章 Java语言基础,与其他编程语言一样,Java也包含变量、表达式等基本编程要素。 Java语言的基础编程知识:,数据类型 变量 运算符 字符串 数组 控制结构,2.1 数据类型,Java属于强类型语言,每一个变量声明时必须指定一种类型。 Java程序中所处理的数据是将各种数据类型实例化后的数据。 数据类型实例化的方法:说明语句 实例化数据的两种形式:变量与常量,数据类型,数据类型 关键字 占用比特数 缺省数值 布尔型 boolean 8 false 字节型 byte 8 0 字符型 char 16 u0000 短整型 short 16 0 整型 int 32 0 长整型 long 64

2、 0 浮点型 float 32 0.0F 双精度型 double 64 0.0D,2.1.1 整型,整型数据类型用来表示整数。Java中4种整型分别是:byte、short、int和long。 通常情况下,int型是应用得最多的。如果要表示特别巨大的数,就要使用long型。而byte型和short型主要用于特定的场合,如占用大量存储空间的大数组或者底层的文件处理等。在Java中可以用3种进制来表示整数: 十进制:int x=678; 八进制:int y=0456; 十六进制:int z=0xa9bc;,2.1.2 浮点型,浮点型用来表示有小数部分的数值,包括float型和double型。这两种

3、数据类型全部为有符号数。浮点型数据默认为double型,因此要使用float型字面常量时,必须添加后缀F或f,示例如下所示。 float x = 12.3456; /错误的情况 float y = 12.3456F; /正确的情况 使用double型数据时,可以添加后缀D或d,也可以不用添加,例如: double d = 12.3456789; /正确的情况 double d = 12.3456789D; /也是正确的情况,2.1.3 char型,char型用来表示字符。每个char型变量占两个字节。在Java中,字符的编码是采用Unicode编码。 Unicode编码字符是用16位无符号整数

4、表示的,有216个可能值,即065 535。可以表示目前世界上的大部分文字语言中的字符。 一般情况下,char类型数据被表示为用一对单引号包含的单个字符,例如: char c1 = n; char c2= ; 转义字符:参见教材P29,2.1.4 boolean型,boolean型的取值范围很简单,非“True”即“False”,用来表示逻辑值的“真”或“假”。其字面常量也只有“True”和“False”两种选择,例如: boolean b1 = True; boolean b2 = False; 在C+中用数值或指针可以代替boolean值,0相当于False,非0相当于True。 在Jav

5、a中没有这样的规定,boolean型的值不能与任何其他基本类型的值进行转换代替。,说明语句,基本数据类型说明语句: boolean b = true; short si = 128; int i,j,k = -99; long l = 123456789; char ch = J; char chc = 中 ; float f = 3.1415926f; double d = -1.04E-5; Java几乎是将字符串视为基本数据类型 String s = “你好!”;,2.1.5 基本数据类型值间的转换,在开发Java程序的过程中经常需要把不同基本数据类型的值进行相互转换。Java中基本数据

6、类型的值进行转换主要包括3种情况: 自动转换 强制类型转换 隐含强制转换,3、数据类型转换,同种数据类型转换: 短类型 长类型:默认 长类型 短类型:强制 不同数据类型转换字符/数值:强制 例:int a ; long b ; char c; b = a ; a = ( int ) b ; c= (char) a ; a=(int) c 布尔型与其他数据类型之间不能强制类型转换 byte x=123; /隐含转换,byte short int long float double,数据类型转换,import java.io.*; public class a public static void

7、 main(String args) int i=65; char c=a, cc=刘; System.out.println(i); 65 System.out.println(char)i); A System.out.println(c); a System.out.println(int)c); 97 System.out.println(cc); 刘 System.out.println(int)cc); 21016 System.out.println(char) 29579); 王 ,2.2 变 量,变量主要用来保存数据,是用标识符命名的数据项,是程序运行过程中可以改变值的量。变

8、量在程序中起着十分重要的作用,如存储数据、传递数据、比较数据、简练代码、提高模块化程度和增加可移植性等。要使用变量,首先要声明变量。,2.2.1 变量声明,变量类型 变量名 变量声明包括两项内容:变量名和变量的类型。变量声明的位置决定了该变量的作用域。在程序中,通过变量名来引用变量包含的数据。变量的类型决定了它可以容纳什么类型的数值以及可以对它进行怎样的操作。,2.2.2 变量名和变量类型,在Java语言中,程序通过变量名来使用变量的值。变量名应满足如下3个要求: 必须是一个合法的标识符。 不能是关键字或者保留字(如true、false或者null)。 在同一个作用域中必须是唯一的。 Java

9、语言规定标识符由字母、下划线(_)、美元符($)和数字组成,且第一个字符不能是数字。其中,字母包括大小写字母、汉字等。Java语言使用Unicode字符集,它包含65 535个字符,适用于多种人类自然语言。,2.2.3 变量的初始化,变量可以在它们声明的时候初始化,也可以利用一个赋值语句来初始化。变量的数据类型必须与赋给它的数值的数据类型相匹配。 1 /整型 int x = 8 , totle=1000; long y = 12345678 L; byte z = 55; short s = 128; 2 /浮点型 float f = 234.5F; double d = -1.5E-8 ,

10、square=95.8; 3 /其他类型 char c = a; boolean t = true ;,2.2.4 final变量,可以在任何作用域声明一个final变量。final变量的数值在初始化之后不能再进行改变。这样的变量和其他语言中的常量很相似。 为了声明一个final变量,可以在类型之前的变量声明使用final关键字,例如: final float stuSum = 48 ; 这个语句声明了一个final变量并对它进行了初始化。如果在后面还想给stuSum赋其他的值,就会导致编译错误,因为final变量的值不能再改变。,2.3 运 算 符,有了数据,就可以对其进行操作。Java中的

11、运算符主要分以下几类。,2.3.1 算术运算符,1加运算符“+” 加法运算,就是将两个操作数进行求和操作,且只能对数值型数据进行。 2减运算符“” 减法运算功能,就是将两个操作数相减,只能对数值型数据进行,其一般形式如下: op1-op2 3乘法运算符“*” 使用“*”运算符将进行乘法运算,但需要注意的是,此运算同样遵循类型自动提升的规则。,2.3.1 算术运算符,4除法运算符“/” 使用“/”运算符将进行除法运算,此运算也满足类型提升规则。根据操作数的不同,除法又分为整数除和浮点除。 int x=10/2; double y=20.0/5.0; 5取余运算符“%” 使用“%”运算符将进行求余

12、运算(取模运算),实质就是将左边的操作数除以右边的操作数,余数便是得到的结果,此运算也遵循类型自动提升的规则。,2.3.1 算术运算符,6自增/自减运算符 除了上述的运算符以外,还有自增和自减两种简单的算术运算符。它们分别是“+”和“。 前缀形式为+op或op,它在加/减之后才计算运算对象的数值; 后缀形式为op+或op,它在加/减之前就计算运算对象的数值。 x=5; y=+x; z=x+;,2.3.2 关系和逻辑运算符,关系运算符用于比较两个值,并根据它们的关系给出相应的取值。例如,“!=”在两个运算对象不相等的情况下返回true。,2.3.3 位运算符,位运算符是对操作数以二进制位为单位进

13、行的操作和运算,其结果均为整型量。位运算符分为移位运算符和逻辑位运算符。,2.3.4 赋值运算符,赋值是编程中最常用的运算之一,Java中的赋值运算有两种:普通赋值运算和运算赋值运算,下面将对这两种赋值运算符进行介绍。 1普通赋值运算 X=5; 2运算赋值运算 Y*=10;,程序举例2-1,public class Sample2_1 public static void main(String args) int x = 12; byte y = 12; x = 1; y += 3; System.out.println(“x=“ + x); System.out.println(“y=“

14、+ y); ,2.3.5 其他运算符,2.3.5 其他运算符,1.三目条件运算符(?:) 是一个条件运算符,相当于一个简化的if-else语句。 D=表达式A ?表达式B :表达式C A为真,返回表达式B A为假,返回表达式C 总是返回B,C中的长类型 例:int x=5, y=8; long z=2; long k=x3?y:z; /k=8 2.“ ”运算符 可以使用方括号来声明数组、创建数组以及访问数组中的元素。,2.3.5 其他运算符,3点运算符“.” 点运算符“.”用来访问对象实例或者访问类的成员变量或成员方法。 System.out.println(“y=“ + y); 4.“()”

15、运算符 当声明或调用一个方法的时候,可以在“()”之间列出方法的参数,也可以利用“()”来指定一个空的参数列表。,2.3.5 其他运算符,5.“(type)”运算符 这个运算符可以将某个类型的值或对象转换为type类型。 6.“new”运算符 可以使用“new”运算符来创建一个新对象或者一个新数组。 7.“instanceof”运算符 “instanceof”运算符用来测试第一个运算对象是否是第二个运算对象的实例。 a instanceof B,2.4 表达式和语句,表达式和语句都属于Java的语法,也是Java编程中最重要、最基础的部分。几乎所写的任何东西都是一个表达式;而语句则是完整的表达

16、式单元。,2.4.1 表达式,表达式是由运算符、操作数和方法调用,按照语言的语法构造而成的符号序列。表达式可用于计算一个公式的值、为变量赋值以及辅助控制程序的执行流程。 表达式主要用来进行计算,并返回计算结果。表达式返回数值的数据类型取决于在表达式中使用的元素。例如,如果aInt是整型,则表达式aInt = 10返回一个整型的值。 Java语言允许将多个子表达式构造成复合表达式。 (x * y * z)/ w 在这个例子中,括号内各个运算对象的先后顺序不是很重要,因为乘法的结果跟顺序无关。但是对于其他表达式并不都是这样,例如: x + y / 100 它关系到是先除还是先加的问题。 优先级参见

17、教材P39,2.4.2 语句,语句是一个执行程序的基本单元,Java语言的语句可分为以下几类。 表达式语句 复合语句 控制语句 包语句和引入语句 其中,表达式语句是用分号“;”结尾,具体包括如下几种。 赋值表达式语句 +、语句 方法调用语句 对象创建语句 变量的声明语句,2.5 控 制 结 构,结构化程序设计原则是公认的面向过程编程应遵循的原则。Java语言虽然是面向对象的语言,但在局部的语句块内部,仍然需要借助于结构化程序设计的基本流程结构来组织语句,完成相应的逻辑功能。 结构化程序设计的三种基本控制语句 顺序 按语句书写的先后顺序执行 选择 在若干路径中有条件地择一执行 循环 当某条件成立

18、时,反复执行一段代码,2.5.1 条件语句,1if条件语句 基本语法:if()语句序列 2switch分支语句,2.5.1 条件语句,if ( 条件 ) 语句块; else 语句块;,多重嵌套的if语句 if (条件1) 语句块1; else if (条件2) 语句块2; else if (条件3) else 语句块n;,语句块 用大括号括起的 语句集合 else与最近的if配合,1、条件语句,2、switch 开关语句,switch(表达式) case 判断值1:语句块1; break ; case 判断值2:语句块2; break ; default:语句块n; switch 的常量和表达

19、式可以是整型、字符型及byte型 任何两个case常量不可以有相同的值。 先计算表达式的值,根据表达式取值的不同转向不同的分支。 每个case分支中的语句块无须用花括号括起来。 每个case分支都只是入口点 break 语句是转移语句(跳出switch),程序举例2-2,public class Sample2_2 public static void main(String args) int day = 3; switch (day) case 1 : System.out.println(“Monday“); break; case 2: System.out.println(“Tues

20、day“); break; case 3: System.out.println(“Wednesday“); break; case 4: System.out.println(“Thursday“); break; case 5: System.out.println(“Friday“); break; case 6: System.out.println(“Saturday“); break; case 7: System.out.println(“Sunday“); break; ,思考:下面程序输出结果?,public class LxSwitch public static void

21、 main(String args) int x=1,y=2,i=0,j=0; switch(x) case 1:switch(y) case 1:i+;break; case 2:j+;break; default:i+;j+; case 2:i+;j+;break; default:i+;j+; System.out.println(“i= “+i); System.out.println(“j= “+j); ,2.5.2 循环语句,While(表达式) do 语句块; 语句块; while(表达式); for(表达式1;表达式2;表达式3) 语句块; 表达式1:循环变量赋初值,可使用外部

22、没有定义 的循环变量 表达式2:循环条件 表达式3:循环变量修正,2.5.2 循环语句,1while循环 while循环适用于不知道代码需要被重复的次数,但有明确的终止条件的循环流程。其基本语法如下所示: while() 语句序列 2do-while循环 与while循环不同,do-while循环先执行一次循环体再计算条件表达式的值,所以不论条件表达式返回什么值,都将至少执行一次循环体,其语法为: do 语句序列 while(条件表达式); 3for循环 for循环通常用于明确知道循环体需要执行的次数的程序,此时使用for循环是最佳选择。,Java的循环语句,while语句 当型循环:whil

23、e(表达式) 语句块; 执行过程: 先计算表达式 若为真则执行语句块,并转回再计算表达式 若为假则跳出循环,执行后面的语句。,Java的循环语句,do-while语句 直到型循环: do 语句块; while(表达式); 执行过程: 先执行语句,再计算表达式 若为真则转回再执行语句,若假则跳出循环 循环体至少执行一次。,Java的for循环语句,例2-3: 用while语句求100以内所有奇数的和,public class WhileTry public static void main(String args) int i,sum; sum=0; i=1; while (i=100) sum

24、+=i; i+=2; System.out.println(“sum=“+sum); ,例2-4:用for语句求100以内所有奇数的和,public class ForTry public static void main(String args) int i,sum; sum=0; for(i=1;i=100;i+=2) sum+=i; System.out.println(“sum=“+sum); ,例2-5:编程输出下图,public class Loop1 public static void main(String args) int i,j,k; for(i=0;i=3;i+) f

25、or(j=0;j=2-i;j+) System.out.print(“ “); /画空格 for(k=0;k=2*i;k+) System.out.print(“*“); /画星号 System.out.println(); / 换行 for(i=0;i=2;i+) for(j=0;j=i;j+) System.out.print(“ “); /画空格 for(k=0;k=4-2*i;k+) System.out.print(“*“); /画星号 System.out.println(); / 换行 ,* * * * * * *,2.5.3 跳转语句,。 break语句 在Java中break

26、语句有两个用途,一是在switch语句中,表示一个case的结束,退出switch;二是作为循环控制语句,在循环体中表示退出循环。第一种用途已经在前面进行了介绍,这里主要讨论第二种。 continue语句 continue也是循环控制语句,也起中断循环的作用,与break不同的是,continue只是中断当次循环。在循环体中,当continue执行时,本次循环结束,进入条件判断,如果条件满足,进入下一次循环。 return语句 return语句用于函数或方法的返回,其一般形式如下所示。 return 表达式;,2.5.3 跳转语句- break,Java没有goto语句 break 从一个封闭

27、的语句块中, 如switch 、循环体中跳出来 break 标号 从包含本break语句的标号指示的封闭语句中跳出来。 while (e1) aaa: while (e1) while(e2) while(e2) break; break aaa; ,2.5.3 跳转语句- break,break语句: 不带标号break 语句 从循环体内跳出至后面语句,结束当前循环体。 循环嵌套时,break 语句只跳出当前循环体。 带标号的break语句 采用 label: 的形式定义标号 跳出标号标志的循环体,2.5.3 跳转语句- continue,continue语句须用在循环结构中 continu

28、e 不带标号 提前结束本次循环,即跳过后面的循环体语句,回到循环的条件测试部分继续执行。 continue 带标号 跳过循环剩余语句,直接进入标号所指的循环体的下一轮循环 。 continue不是goto 语句,标号不能指向与本循环并列的其他循环,也不可指向非循环语句。 循环的正常退出途径:符合结束条件,2.5.3 跳转语句- continue,label1: outer-iteration inner-iteration . break; / 1 . continue; / 2 . continue label1; / 3 . break label1; / 4 ,例2-6:求2100的素数

29、,每行打印5个数字,import java.io.*; public class prime public static void main(String args) First_Loop: for(int i=2,k=0;i100;i+) for(int j=2;j=Math.sqrt(i);j+) if(i%j=0) continue First_Loop; System.out.print(i+“t“); k+; if(k%5=0) System.out.println(); /for /main /class,例2-7:输出所有1到300间的满足x2+y2=z2的整数x,y,z的组合(

30、要求x,y,z各不相同),public class Test_key public static void main(String args) int x,y,z; int max=(int)( Math.sqrt(300); for(x=1;x300) break; if(z*z=x*x+y*y) System.out.println(x+“t“+y+“t“+z); ,public class Test12 public static void main(String args) int x,y,z,h; int max=(int)( Math.sqrt(300); for(x=1;x=ma

31、x;x+) for(y=1;y=max;y+) if(y=x) continue; h=x*x+y*y; z=(int)Math.sqrt(h); if(z*z=h ,3 4 5 4 3 5 5 12 13 6 8 10 8 6 10 8 15 17 9 12 15 12 5 13 12 9 15 12 16 20 15 8 17 16 12 20,例2-8 百钱买百鸡问题,公鸡每只5元,母鸡每只3元,小鸡3只一元,问一百元买一百 只鸡有几种解法。 for(x=0; x=19; x+) for(y=0;y=33-x; y+) z=100-x-y; if (z%3=0 ,例2-9:用辗转相除法求

32、二个正整数的最大公约数。,class GreatestCommonDivisor public static void main(String args) if(args.length2) System.out.println(“请向应用程序传递二个参数:“); System.exit(0); int a=Integer.parseInt(args0); int b=Integer.parseInt(args1); System.out.println(a+“和”+b+“的最大公约数为: “+result(a,b); ,Static int result(int m,int n) int r;

33、 r=m%n; while(r!=0) System.out.println(“m=“+m+“n=“+n+“r=“,r); m=n; n=r; r=m%n; return n; ,例2-10 求fibonacci数列的前30个数,分析:设当前项为f,前一项为f1,前二项为f2。首先根据f1和f2推出f,再将f2作为f1,f作为f2,再推出f,如此一直递推下去: 1 1 2 3 5 第一次 f1 + f2 f 第二次 f1 + f2 f 第三次 f1 + f2 f,递推法:递推是指在一个数的序列值中,下一项的值是在前一项的基础上推算出来的,即下一项对前一项有某种依赖关系。 f1=1.0;f2=1

34、.0;n=2; System.out.print(f1+”,”+f2); for (i=3;i=30;i+) f=f1+f2; if (n%4 =0) System.out.println(“); System.out.print(“,”+f); f1=f2; f2=f; n+; ,对例2-9进行简化,只设两个变量f1和f。递推过程如下: 1 1 2 3 5 第一次 f1 + f f1 f + f1 f 第二次 f1 + f f1,f1=1.0;f=1.0;n=2; for (i=1;i=15;i+) System.out.print(f1+”, ”+f); f1=f1+f; f=f+f1;

35、if (n%4 =0) System.out.println(“); n+; ,例2-11采用递归算法求n!,class Factorial static long fac(int n) if(n=1) return 1; else return n*fac(n-1); public static void main(String args) int k; long f; k=Integer.parseInt(args0); f=fac(k); System.out.println(f); ,2.6 字 符 串,字符串指的是字符序列。Java中的字符串分为两类:字符串常量和字符串变量。 字符串

36、常量,包括直接字符串常量和String类的对象。字符串常量的值一旦创建不会再变动。 字符串变量,指的是StringBuffer类的对象。创建字符串变量的值之后允许对其进行扩充、修改。 Java语言为String类、StringBuffer类提供了许多方法,如比较串、求子串、检索串等,以提供各种串的运算与操作。,2.6.1 String类型,String类型建立的字符串不能更改,如果程序需要使用字符串常数,String类型比较合适。 1String字符串创建 创建String字符串的最简单方式是使用字符串文本。 String aString1=“This is a string.”; Strin

37、g aString2= aString1; String aString3= new String (“java”);,2String类型字符串的操作,在Java中为String类定义了一些操作字符串的方法。 1)操作符+:实现字符串的合并; 2)Length()方法:计算字符串的长度; String str=“Java”; int l=str.length(); 3)getChars()方法:字符复制; getChars(int,int,char,int); str.getChars(1,3,char1,0);,4)compareTo()方法:,用于字符串比较; pareTo(str1);

38、public class Sample2_6 public static void main(String args) String temp; String str = “VC“, “Visual Stdio“, “AS“, “Java“ ; int l = str.length; for (int i = 0; i 0) temp = stri; stri = strj; strj = temp; for (int k = 0; k l; k+) System.out.println(strk); ,5)subString(),作用:提取字符串中的子串。 格式:String substri

39、ng(int begin,int end); 例: public class Sample200 public static void main(String args) String str1=“Java_Learning“,str2; str2=str1.substring(4,9); System.out.println(str2); ,作用:将字符串转换成字符数组例 class toCharArray public static void main(String args ) String s1 = “We like apple.“; char s2=s1.toCharArray();

40、 System.out.println(String.valueOf(s2,8,5); ,toCharArray()方法,结果为:apple,2.6.2 StringBuffer类型,StringBuffer类用于处理可变的字符串,提供修改字符串的方法。 生成StringBuffer对象后,可通过调用toString()方法将其转换为String对象。,StringBuffer有三个构造方法: StringBuffer(); StringBuffer(int length); StringBuffer(String str); 示例: StringBuffer s0 = new StringB

41、uffer(); StringBuffer s1 = new StringBuffer(512); StringBuffer s2 = new StringBuffer(“Happy new year!”);,StringBuffer提供的方法,实现对字符串的修改,包括字符替换、插入字符、在末尾添加一个子串等。 原因就是它使用了缓冲区。 从StringBuffer类创建的对象都分配比给定字符串还多16个字节长度的缓冲区。 StringBuffer类提供了方法来检测和获得缓冲区容量,在对字符修改过程中,如果缓冲区不够用,那么,系统会自动扩大缓冲区。,StringBuffer提供的主要方法:,字符

42、设置和替换 setCharAt(int index,char ch); 此方法将指定的字符ch放到index指出的位置。 例: StringBuffer s= new StringBuffer(“stadents”); s.setCharAt(2,u); 上述语句将字符串s中第2个字符a替换为u。 字符的插入 insert(int offset, char ch); insert方法用来在字符串的指定位置插入字符ch。,例2-12:StringBuffer的insert方法的使用1,public class MyString public static void main(String arg

43、 ) String s1=“Wecome“; StringBuffer sb1=new StringBuffer(s1); sb1.insert(2,l); System.out.println(sb1); 程序结果: 打印“Welcome”。,insert方法还允许插入字符串、布尔量、数组和各种类型的数据,甚至插入一个对象。即按照入口参数的不同,StringBuffer提供了以下insert方法: insert(int offset, char c); insert(int offset, boolean b); insert(int offset, char str ); insert(i

44、nt offset, double d); insert(int offset, float f); insert(int offset, int i); insert(int offset, long l); insert(int offset, Object obj); insert(int offset, String str);,用append方法在字符串末尾添加内容,随着入口参数的不同,append方法可以用来添加字符串、各种类型的数据和数组等: append(boolean b); append(char c); append(char str ); append(char str

45、 , int offset, int len); append(double d); append(float f); append(int i); append(long l); append(Object obj); append(String str);,toString ()方法将可变字符串转化为不变字符串,下面的程序段中用了append方法和toString方法,将字符串修改后转化为字符串常量。 char c = e; StringBuffer s = new StringBuffer(“We ar“); s.append(c); s.append(“ students.“); s.

46、toString(); 结果:S成为字符串常量,其值为We are student,StringBuffer类提供了length()方法检查缓冲区中字符串的长度,用charAt (int index)方法得到入口参数所指位置的字符 用capacity()方法获取缓冲区长度。 public class MyString public static void main(String args) String s1 = “I like apple.“; StringBuffer sb1 = new StringBuffer(s1); System.out.println(sb1.length(); System.out.println(sb1. capacity(); ,结果: 13 29,例2-13:StringBuffer的length、capacity、charAt方法使用,public class MyString public static void main(String args) String s1 = “beautiful“; StringBuffer sb1=new StringBuffer(s1); System.out.println(“第四个字符为:“+sb1.charAt(4); /取出对象第4个字符 S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1