黑马程序员——java编程各章语法基础总结

----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------
视频总结java语言基础

第一章 JAVA语言基础

 

1.JAVA语言的特点:强类型、编译和解释、自动无用内存回收功能、面向对象、与平台无关、安全性、分布式计算、多线程。

2.小应用程序与应用程序的区别

(1)小应用程序只能在与JAVA兼容的容器中运行,可以嵌入在HTML网页内,在网络上发布,当网页被浏览时,在浏览器中运行。小应用程序的运行还受到严格的安全限制。而JAVA应用程序没有这些限制,也不支持网页嵌入和下载运行。

(2)两者在代码编写上也有很大差异。一个小应用程序必须定义成一个Applet类的子类,应用程序可以是Applet类的子类,也可以不是。

(3)应用程序必须在一个类中定义一个main()方法,该方法代表应用程序的入口。而小应用程序不必定义main()方法。它的执行由Applet类中定义的多个方法控制。

3.JAVA应用程序的开过过程

(1)JAVA应用程序,先编写JAVA源程序,源程序经JAVA编译器编译后产生字节码文件,最后由JAVA解释器解释执行字节码文件。

(2)小应用程序,先编写源程序,然后经JAVA编译器编译后产生字节码文件,最后由WEB浏览器解释执行字节码文件。

4.标识符:由字母和数字符组成,限定标识符第一个字符不能是数字符。

5.关键字:均由小写字母组成,关键字不可以用做变量、方法、类或标号的标识符。

6.基本数据类型:整数类型、浮点数类型、字符类型、逻辑类型。非基本数据类型:数组、字符串、类、接口

7.整数类型依次分为:byte8位)、short(16)int(32)long(64)

8.浮点数类型分为:float(单精度型32)double(双精度型64位)。

 

 

第二章运算和语句

 

1.在进行连续的逻辑运算时,不分逻辑与和或的优先级,而是顺序进行逻辑与和或的计算,一旦逻辑表子达式或逻辑表达式能确定结果,就不再继续计算(即条件1&&条件2,若条件1不成立,则条件2也无须再计算。)。

2.break语句:必须出现在多路按值选择结构或循环结构中,其执行强制结束它所在的控制结构,让程序从这个控制结构的后继语句继续执行。(

3.continue语句:只能出现在循环结构中,其执行将忽略它所在的循环体中在它之后的语句,使控制转入对循环条件表达式的计算和测试。若出现在for循环体中,则转入表达式3的求值。

4.return语句:只能出现在方法体中,其执行将结束方法的执行,将控制返回到方法调用处。

5.JAVA语言中,用try...catch语句指定可能会发生异常的代码块和错误处理代码块。

6.循环体中的continue语句的作用是结束当前循环,直接进入下一次循环。break语句的作用是从循环体内跳出至循环的后继语句,即强行中断当前循环。

 

1.if语句

 

if(条件表达式)

    {语句1}

 else

    {语句2}

 

2.switch语句

 

switch(表达式)//该表达式的类型只限于char,int,short,byte类型

    {

         case常量表达式1:语句序列1break//也可以没有break

         case常量表达式2:语句序列2break//也可以没有break

         ......

         case常量表达式n:语句序列nbreak//也可以没有break

         default         :语句序列n+1break//也可以没有break

 

3.try...catch语句

 

try

    {

         语句块//执行该语句块,可能会发生异常

    }

catch(异常类型 e)

    {

         异常发生时要执行的语句块

    }

finally

    {

         无论异常发生与否,都要执行的语句块

    }

 

4.while语句//先计算条件表达式,再执行循环体

 

while(条件表达式)

    {

         循环体

    }

 

5.do...while语句//先执行循环体,再计算条件表达式

 

do

    {

         循环体

    }

while(条件表达式)

 

6.for语句)

 

for(表达式1;表达式2;表达式3)//表达式1为循环变量置初值,表达式2为执行循环条件判断,表达式3为更新循环变量值

    {

         语句块

    }

 

7.package语句

 

package 包名;//package语句必须出现在源程序文件的起始行,表示出现在该文件中的所有类都属于这个程序包。

 

8.import语句

 

import 包名.类名;//该语名用来引来所需要的类。若要从一个包中引入多个类,可用“*

 

9.java应用程序的基本结构

 

[package 包名;]

 

import 包名.类名;

......

 

[public] class 类名

    {

         intval=...//变量定义语句

        

         publicstatic void main(String args[])//方法定义

             {

                   ...//变量定义和控制语句构成的方法体

              }

    }

 

 

第三章面向对象编程基础

 

1.面向对象程序设计引入了许多概念和机制,包括

         抽象:是有效控制程序复杂性的重要手段,类是目前支持抽象的最好工具。

         对象:对象的名称用于程序引用对象,对象的成员变量用于存储对象的状态信息,对象的方法用于描述对象的行为。

         消息:在程序系统中,对象之间的交互通过相互发送消息实现。

           类:声明对象共有属性和行为的机制称为类。

         继承:就是在已有类的基础上,扩充属性或扩充与改写其某些方法,生成新的类。(即通过扩展原有的类,声明新类来实现的。

     多态性:是指类型适应性多态性,这来自继承,不同继承层次的对象对同样的方法有不同的实现。

2.类:是一种类型,类封装对象的属性和方法,是同一类对象的模板。

3.方法重载:是指在一个类中定义多个有相同名字的方法,但这些方法或者参数个数不同或按顺序参数的类型不同。在编译时就能确定被调用的方法,这种多态性不需要动态联编技术的支持。)

4.构造方法:是一种特殊的方法,这种方法的名与它的类名相同,并且不返回结果,也不写上void关键字。构造方法的作用是创建类的对象,并给对象初始化。构造方法是公共方法,但程序不能显式调用,而是当程序运行时,当有对象要创建时,由系统自动调用构造方法。

5.实例变量和类变量的区别

1)用关键字static修饰的是类变量,未用关键字static修饰的是实例变量。

2)不同对象的实例变量将被分配不同的内存空间,改变类的某一个对象的实例变量值不会影响其他对象的实例变量。

3)类变量的内存只有一处,让类的所有对象共享。从类的任一对象改变类变量,类的其他对象都能发现这个改变。

5.5实例方法和类方法的区别

1)冠以修饰字static的方法称为类方法,没有冠以修饰字static的方法称为实例方法。

2)实例方法可以互相调用,并可调用类方法。类方法可以互相调用,但不能直接调用实例方法。

3)实例方法可引用实例变量及类变量,类方法能直接引用类变量,但不能引用实例变量。

6.访问权限

       private:设置最强的访问,其他类的方法都不能访问。

     protected:只限子类或者同一个包中的类的方法能访问。

          public:设置没有限制的访问权限,其他类的方法都能访问。

友好的<default>:只允许同一个包中的类的方法访问。

7.final类:是不能被再继承的类,即它不能再有子类;final方法:声明该方法不能被子类的方法覆盖;final变量:声明该变量的值不能被改变。

8.关键字super:利用super,子类方法可以引用超类的成员变量和被覆盖的方法。使用super3种情况:(1)调用超类的构造方法;(2)调用超类被子类覆盖的方法;(3)访问超类被子类隐藏的成员变量。

9.关键this:用来指对象自己。

10.is-a关系:类A是继承扩展类B,则子类A和超类B之间是is-a关系。

11.has-a关系:类A的某个成员变量的类型是B,则类A和类B之间是has-a关系。

12.接口有常量定义和方法定义,但没有方法的实现代码,可以将接口想象为一个“纯”抽象类。

13.基本类:即将基本类型的关键字的第一字母改为大写,其中只有int的基本类为Integer

14.如果小应用程序已用importjava.applet.Applet导入系统的Applet类,小应用程序的主类必须按以下形式声明:public class 主类名 extends Applet。如果用形式导入系统Applet类,则主类的声明应写成:public class 类名 extends java.applet.Applet

15.Applet类的基本方法(63)

1init()方法:创建所需要的对象、设置初始状态、装载图像、设置参数等。

2start()方法:初始化方法后,紧接着调用start()方法,启动小应用程序主线程。

3stop()方法:当浏览器离开小应用程序所在页面转到其他页面时,调用stop()方法,挂起小应用程序的执行。

4destroy()方法:关闭浏览器时,系统调用destroy()方法,结束小应用程序的生命,关闭线程释放对象资源。

5paint(Graphics g)方法:用于在屏幕窗口上显示某些信息。

6repaint()方法:先清除paint()方法以前所画的内容,然后再调用paint()方法。

7update()方法:调用repaint()方法时,系统会自动调用update()方法。也是清除paint()方法以前所画的内容,然后再调用paint()方法。

16.小应用程序的生命周期

1)下载并实例化小应用程序,系统调用init()方法;

2)启动,系统调用start()方法;

3)小应用程序调用stop()方法暂停或执行paint()方法完成;

4)重新启动;

5)终止,或退出浏览器,或执行destroy()方法消亡方法。

 

二、语法点:

1.类的声明

 

class 类名

    {

         类体//给出类的成员变量和方法定义,类体中不能有独立的执行代码,所有执行代码只能出现在方法中。

    }

 

2.成员变量

 

[修饰字] 类型变量名;//修饰字可为:privateprotectedpublic、友好的;成员变量对类内定义的方法都有效。类的方法也可以定义变量,称为局部变量。局部变量只在定义它的方法中有效。

 

3.方法

 

返回值类型方法名(类型参数名,....,类型参数名)

    {

         方法体

    }

//返回值类型声明方法返回值的数据类型。如方法无返回值,就用void关键定。

 

4.对象

 

声明对象:

类名对象名;//Point p1,p2;

 

创建对象:

new 构造方法([参数表]//p1=newPoint();p2=new Point(30,40)

 

5.继承

 

class 子类名 extends 超类名

    {

         类体

    }

//如果缺省extends语句,未指定超类,则该类的超类是系统声明的类java.lang.Object

 

6.接口

 

[public] interface 接口名 [extends 超接口表]

    {

         接口体

    }

 

7.小应用程序主类的程序结构:

 

public class AppletName extendsjava.applet.Applet

    {

         publicvoid init(){......}

         publicvoid start(){......}

         publicvoid stop(){......}

         publicvoid destroy(){......}

         publicvoid paint(Graphics g){......}

    }

 

 

第四章数据和字符串

 

一、出题点

1.String类用于处理不可改变的字符串,StringBuffer类用于处理可改变的字符串。(P73)

2.Object类有方法String toString(),一个对象通过调用该方法可以获得对象的字符串表示。(P79

  如:Date d1=newDate()//声明并创建一个Date对象

     String s=d1.toString()//Date对象d1处理转变为String类型,存放在s中。

 

二、语法点

1.数组(以二维数组为例)

 

1)数组先声明

 

类型数组名 [][](其它形式的声明:类型 [][] 数组名、类型 [] 数组名[])

 

2)数组创建

 

类型数组名[][]=new 类型[长度1][长度2]

 

 

2.字符串声明和创建

1)字符串先声明

 

String s

 

2)字符串创建

 

s=new String()//创建一个空字符串对象

 

s=new String(String str)//创建一个str字符串对象,s=newString("i am")

 

s=new String(char a[])//charc[4]={'g','o','o','d'}String s=new String(c)

 

s=new String(char a[]intstartIndex,int charNum)//char c[4]={'g','o','o','d'}String s=newString(c,2,4),即从下标为2的字母开始,后面共4个字母赋值给s对象;

 

3.字体串基本操作

 

1)字符串连接,concat(s)方法:s1=s1.concat(s2)//s2连接在s1之后,得到一个新的字符串。

 

2)获取字符串的长度:s.length()

 

3)字符串前缀比较:boolean startsWith(s)判断一个字符串的前缀是否为s

     字符串后缀比较:booleanendsWith(s)判断一个字符串的后缀是否为s

 

4)比较两个字符串是否相同:boolean equals(s)方法。//s1.equals(s2)比较s1s2字符串相同否,同为true

 

5)字符串检索:int indexOf(s),即从字符串头开始检索s,返回s首次出现的位置;或int indexOf(String sint startpoint),即从指定的startpoint位置开始检索s,返回s首次出现的位置。

 

6)取字符串的子串:String substring(int startpoint)String substring(intstartpointint end),其中startpoint是字符串的开始下标,end是截止下标。

 

4.StringTokenizer类操作

 

 

1)使用StringTokenizer类构造对象作为字符串分析器

如:StringTokenizer st=new StringTokenizer("I am tomI amman.")

  StringTokenizer st=newStringTokenizer("I am tom"",")//以“,”为分隔符

 

2)利用取一个单词的方法nextToken()

如:st.nextToken()

 

3)利用hasMoreTokens()方法控制循环,只要字符串中还有语言符号,返回 true

 

4)调用countTokens()方法能得到字符串分析器中一共有多少个单词。

如:st.countTokens()

 

 

第五章图形界面设计(一)

 

1.AWTSwing在区别

1AWT依赖于主平台绘制用户界面组件,而Swing有自己的机制,在主平台提供的窗口中绘制和管理界面组件。

2AWT在不同平台上运行相同的程序,界面的外观和风格可能会有一些差异,而一个基于Swing的应用程序可能在任何平台上都会有相同的外观和风格。

2.使用Swing设计图形界面,主要引入两个包:javax.swing包含Swing的基本类;java.awt.event包含与处理事件相关的接口和类。

3.组件(Component)是图形界面的基本元素,容器(Container)是图形界面的复合元素,容器可以包含组件。为了统一管理组件和容器,为所有组件类定义超类Component类,把组件的共有操作都定义在Component类中;为所有容器类定义超类Container类,把容器共有的操作都定义在Container类中。

4.Swing类的层次结构

顶层容器:JFrame,JApplet,JDialog,JWindow

中间容器:JPanel,JScrollPane,JSplitPane,JToolBar等。

基本组件:JButton,JComboBox,JList,JMenu,JTextField

可编辑组件:JColorChooser,JFileChooser,JTextArea

5.图形界面设计的大致步骤:(1)创建容器(2)创建组件(3)往容器里添加组件(4)根据操作注册监视器,并用响应事件的方法完成处理。(自行整理)

6.事件:是指在某个组件上发生用户操作;对事件作监视的对象称为监视器;为了让监视器与事件对象关联起来,需要对事件对象作监视器注册,告诉系统事件对象的监视器。

7.以程序响应按钮事件为例:(1)程序要创建按钮对象,把它添加到界面中;(2)要为按钮作监视器注册,程序要有响应按钮事件的方法;(3)当“单击按钮”事件发生时,系统就调用已为这个按钮注册的事件处理方法,完成处理按钮事件的工作。

8.JAVA编写事件处理程序的两种方案:(1)程序重设方法handleEvent(Eventevt);(2)程序实现一些系统设定的接口。

9.java.awt.event包中用来检测并对事件做出反应的模型包包括以下三个组成元素:

1)源对象:事件“发生”在这个组件上,它与一组“侦听”该事件的对象保持联系。

2)监视器对象:是一个实现预定义的接口的类的一个对象,该对象的类要提供对发生的事件作处理的方法。

3)事件对象:包含描述当事件发生时从源传递给监视器的特定事件的信息。

10.窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中。在GUI中,有三种窗口:

1Applet窗口;(2)框架窗口(JFrame);(3)一种无边框窗口(JWindow)。

11.Swing里的容器都可以添加组件,除了JPanel及其子类之外,其他的Swing窗口不允许把组件直接加入。而要采用以下两种方法添加:(P89

1)用getContentPane()方法获得该容器的内容面板,再将组件加入。如,mw.getContentPane().add(button)。或Container cP=getContentPane()

 cP.add(button)

2)建立一个JPanel对象的中间容器,把组件添加到这个容器中,再用setContentPane()把容器置为内容面板。如,JPanel cP= new JPanel()

 cP.add(button)

 ......

 mw.setContentPane(cP)

12.Swing编写GUI程序时,通常不直接用JFrame创建窗口对象,而用JFrame派生的子类创建窗口对象,在子类中可以加入窗口的特定要求和特别的内容等。(P90 5.2

13.标签(JLabel)是最简单的Swing组件。标签对象的作用是对位于其后的界面组件作说明。

14.按钮(JButton)在界面设计中用于激发动作事件。

15.面板(JPanel)是一种通用容器,其作用是实现界面的层次结构。默认布局为FlowLayout

16.JScrollPane是带有滚动条的面板,是Container类的子类,也是一种容器,但是只能添加一个组件。其用法是先将一些组件添加到一个JPanel中,然后再把这个JPanel添加到JScrollPane中。

17.FlowLayout布局:是将其中的组件按照加入的先后顺序从左到右排列,一行排满之后就另起一行继续从左到右,每行中的组件都居中排列。FlowLayout是小应用程序的默认布局。可用超类Container的方法setLayout()加容器设定布局。如,setLayout(new FlowLayout())

18.BorderLayout布局:是把容器内的空间简单的划分为东“East”、西“West”、南“South”、北“North”、中“Center”五个区域。BorderLayoutJWindowJFrameJDialog的默认布局

19.GridLayout布局:是把容器划分成若干行和列的网格状,行数和列数由程序控制,组件放在网格的小格子中。其布局特点是组件定位比较精确。

20.CardLayout布局:其容器可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。

21.null空布局是把一个容器的布局设置为null布局。空布局采用setBounds()方法设置组件本身的大小和在容器中的位置。(P101

 

 

二、语法点

1.创建JFrame窗口

 

2.按钮处理程序的基本内容为      处理按钮事件实例

 

3.面板处理程序的基本内容为

 

4.BorderLayout布局

 

5.GridLayout布局

 

6.文本框(JTextField

 

7.文本区(JTextArea

 

 

第六章图形界面设计(二)

 

1.Java为处理鼠标事件提供两个接口:MouseListenerMouseMotionListener接口。

2.MouseListener接口能处理5种鼠标事件:按下、释放、点击鼠标、鼠标进入、退出。

3.MouseMotionListener接口能处理2种鼠标事件:拖动鼠标、鼠标移动

4.键盘事件的接口是KeyListener,注册键盘事件监视器的方法是addKeyListener。实现KeyListener接口的方法有3:keyPressed(KeyEvent e),键盘上某个键被按下;keyReleased(KeyEvente),键盘上某个键被按下,又释放;keyTyped(KeyEvent e),keyPressedkeyReleased两种方法的组合;

 

1.选择框(JCheckbox)及单选框

 

2.单选按钮(JRadioButton

 

3.列表(JList

 

4.组合框(JComboBox

 

5.菜单条(JMenuBar)、菜单(JMenu)、菜单项(JMenuItem

 

6.对话框(JDialog

 

7.滚动条(JScrollBar

 

8.鼠标事件

 

9.键盘事件

 

 

第七章图形、图像与多媒体

 

1.java.awt包中,类Graphics提供的功能有:建立字体、设定显示颜色、显示图像和文本,绘制和填充几何图形。

2.在某个组件中绘图,一般应该为这个组件所属的子类重写paint()方法,在该重写的方法中进行绘图。

3.绘图模式分为:正常模式,其方法为setPaintMode()和异或模式,其方法为setXORMode(Colore)

4.Graphics类的绘图方法

1)画线段:drawLine(int x1,int y1,int x2,int y2) //x1,y1的坐标点至x2,y2的坐标点之间画一条线。

2)画矩形:drawRect(int x,int y,int width,int height)//x,y该点上画一个宽width,高height的矩形。

3)画三维矩形:draw3DRect(int x,int y,int width,int heightbooleanraised)//x,y该点上画一个宽width,高height的矩形。参数raised是突出与否。

4)画椭圆形:drawOval(int x,int y,int width,int height)//x,y该点上画一个横轴width,纵轴height的椭圆。或用fillOval(intx,int y,int width,int height)进行颜色填充。

5)画圆弧(6)画多边形(7)擦除矩形块(8)限定图显示区域(9)复制图形

5.java程序中,图像也是对象,所以载入图像时,先要声明Image对象,然后利用getImage()方法把Image对象与图像文件联系起来。方法有两个:(1Image getImage(URL url);(2ImagegetImage(URL url,String name)

6.程序要创建缓冲区图像,需要引入java.awt.image包中的BufferedImage类。要创建一个缓冲区图像,可以调用creatImage()方法,该方法返回一个Image对象,然后再将它转换成一个BufferedImage对象。

 

 

第八章多线程

 

1.进程与线程的异同(P159

1)进行是程序的一次执行过程,从代码加载、执行,直至完成的一个完整过程。线程是一个控制流,也是一个执行过程,但执行单位比进程小。

2)两者的不同点是进程是一个实体,有自己的状态、专用数据段;而创建线程时不必建立新的数据段。其不是能够独立运行的程序,而只是某个进程内的一个执行流。

2.线程的生命周期:新建、就绪、运行、阻塞和死亡五种状态。(P159

3.Java提供一个线程调度器来监视和控制就绪状态的线程,线程的调度策略采用抢占式,优先级高比低的先执行。在优先级相同的情况下按“先到先服务”的原则。线程优先级为110,数值越大优先级越高。(P160

4.Java程序实现多线程应用有两种途径:(1)继承Thread类声明Thread子类,用Thread子类创建线程对象(2)在类中实现Runnable接口,在类中提供Runnable接口的run()方法。(P161

5.Java语言中,使用关键字synchronized定义临界段,能对共享对象的操作上锁。(P167

6.为了实现同步,Java语言提供wait()notify()notifyAll()三个方法供线程在临界段中使用。用wait()方法使执行该方法的线程等待,并允许其他线程使用这个临界段。用notify()方法通知由于想使用这个临界段而处于等待的线程结束等待。若要使用其他早先等待的线程都可结束等待,重新竞争CPU,则使用notifyAll()方法。(P168

 

 

第九章输入和输出流

 

1.Java语言采用流(stream)的机制实现输入和输出。实现输入/输出操作的类库在java.io包中(P175

2.建立输入/输出流对象之前可以先建立一个File对象,File对象对应一个目录或文件,对象的属性包括文件路径、名字、文件长度、可否读写等。File对象只用来命名文件、查询文件属性和处理目录,不提供读写文件操作。(P175

3.文件读写的主要操作包括:建立流对象、读数据、写数据和关闭流。

4.根据输入输出的类型是字节还是字符,java.io提供两种基本抽象类:一种用于读写字节,一种用于读写字符。

5.字节流用于读写二进制数据,比如图像和声音文件等。由InputStream类和OutputStream类为字节流提供API和部分实现。字节流读和写操作由FileInputStream类和FileOutputStream类提供支持。

6.字符流处理Unicode字符集中的任何字符,由Reader类和Writer类为字符流提供API和部分实现。读和写操作由FileReader类和FileWriter类提供支持。(P175

7.程序要采用缓冲式输入,只要先创建FileReader对象,再利用FileReader对象创建BufferedReader对象。(P178)如:

 file=new FileReader("abc.txt")

 in=new BufferedReader(file)

8.BufferedWriter类是提供缓冲式输出的类,只要先创建FileWriter对象,再利用FileWriter对象创建BufferedWriter对象。(P179

9.文件随机访问可利用RandomAccessFile类实现,该类创建的流既可以随机输出,也可以随机输入。(P180

10.JFileChooser实现打开和保存文件对话框。(P182

 

 

第十章网络与数据库编程基础

 

1.InetAddress类的对象用于存储IP地址和域名。(P190

2.要接收和发送信息还需用URLConnection类,程序获得一个URLConnection对象,相当于完成对指定URL的一个HTTP连接。

3.JAVA语言在实现C/S模式中,套接字分为两类:在Server端,ServerSocket类支持底层的网络通信;在Client端,Socket类支持网络的底层通信。(P193

4.双方实现通信有流式socket和数据报式socket两种可选方式。

5.流式socket是有连接的通信,即TCP;数据报式socket是无连接的通信,即UDP

6.JAVA程序与数据库连接方法有两种:(1)使用JDBC-ODBC桥接器与数据库连接(2)用纯JAVAJDBC驱动程序实现与数据库连接。(P198

7.编写访问数据库的JAVA程序还需要几个重要的类和接口(P201):

1DriverManager类:处理驱动程序的加载和建立新数据库连接。

2Connection类:处理与特定数据库连接的类。

3Statement类:用于在指定的连接中处理SQL语句的类。数据库编程的要点是在程序中嵌入SQL命令。

4ResultSet类:执行SQL语句查询,并将查询结果存放在一个用ResultSet类声明的对象中。

8.数据库更新,利用Statement对象的executeUpdate()方法,执行SQLupdate语句,实现数据表的修改;执行insert语句,实现记录的添加。

----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------

 

发布了14 篇原创文章 · 获赞 1 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览