码迷,mamicode.com
首页 > 编程语言 > 详细

java学习总结

时间:2019-12-13 16:38:02      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:下拉列表   ams   窗口   horizon   ext   水平居中   共同点   加强   resultset   

 java学习总结~

 

 

面向对象程序设计常用的七种术语  

 

对象(object):是系统中 用来描述客观事物的一个实体, 是构成系统的一个基本单位, 由一组属性和施加于这组属性的 一组操作构成。

对象之间的关系有包含,继承和关联   

例:当对象A是对象B的组成部分时,称对象B包含对象A 

       当对象A是对象B的特例时,称对象A继承了对象B  

       当对象A拥有(使用)对象B时,称对象A和对象B之间是关联关系                       

 

 

属性:用来描述对象静态特征 (状态)的一个数据项 (专业术语:成员变量)

 属性一般就是成员变量,属性的定义规则是:set/get方法名,去掉set/get后,将剩余部分首字母小写得到的字符串就是这个类的属性。

 

 

操作:用来描述对象动态特 征(行为)的一个动作系列。 (专业术语:方法)

 太多了不一一列举了。

类:(class):是具有相同属性和操作的一组对象的集合, 它为属于该类的全部对象提供了统一的抽象描述,由一个类名、一组属性和一组操作构成

 

封装:就是把对象的属性和操作结合成一个独立的系统单位,并尽可能隐藏对象的内部细节

什么是封装哪?

封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

 

继承:是指特殊类(子类)可以自动拥有一般类(父类)的全部属性和操作。特殊类可以有自己定义的属性和操作,继承关系是代代传递的。

 

 继承的特点:
1.只支持单继承,即一个子类只允许有一个父类。
2. 子类可以拥有父类的属性和方法
3. 子类可以拥有自己的属性和方法
4. 子类可以重写覆盖父类的方法

 

 

继承的类别

  1. 排序类-实现排序
  2. 反转类-实现数据反向存放

 

注意事项

    1. 可以继承父类的public和protected成员变量;不能够继承父类的private成员变量
    2. 访问权限成员变量的时候只有子类和父类在同一个包下才能继承
    3. 子类不能继承父类的构造器

多态:是指在一般类中定义的属性或操作被特殊类继承之后,可以具有不同的数据类型或表现 出不同的行为。

 

 

 

 

 

 

继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承可以单继承也可以多继承

 

 继承的特点:
1.只支持单继承,即一个子类只允许有一个父类。
2. 子类可以拥有父类的属性和方法
3. 子类可以拥有自己的属性和方法
4. 子类可以重写覆盖父类的方法

 

继承的类别

  1. 排序类-实现排序
  2. 反转类-实现数据反向存放

 

注意事项

  1. 可以继承父类的public和protected成员变量;不能够继承父类的private成员变量
  2. 访问权限成员变量的时候只有子类和父类在同一个包下才能继承
  3. 子类不能继承父类的构造器

 

This关键字与super关键字(重复)

This关键字的作用

(1)如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据可以通过this关键字指定访问成员变量的数据;

(2)在一个构造函数中可以调用另外一个构造函数初始化对象;

 

Super关键字的作用

(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;

(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。

 

区别

1.代表的事物不一致。

super关键字不能代表对象,只是代表一个对象中的一块内存。

this关键字代表的是所属函数的调用者对象。

2.使用前提不一致。

super关键字必须要有继承关系才能使用。

this关键字不需要存在继承关系也可使用

3. 调用构造函数的区别:

 super关键字是调用父类的构造函数。

this关键字是调用本类的构造函数。

 

注意事项 

super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。(例子 main方法不能同时使用this,super)

 

 

Final关键字

使用final声明类不能有子类,声明的方法不能被子类所覆写,声明的变量是常量不能修改。

 

 

抽象类

1.Java中所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类中类的其它功能依然存在,但是不能实例化对象。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。

2.Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

 

 

 

StringBuffer对象的初始化的两种方法

reverse方法(StringBuffer对象中的内容反转,然后形成新的字符串)

setCharAt方法(修改对象中索引值为index位置的字符为新的字符ch)

 

 

抽象类

 

抽象类和接口的区别

1. 抽象类中的方法可以有能实现方法的具体功能方法体,但是接口中不能有方法体。

2. 抽象类中的成员变量不限制类型,而接口中的成员变量只能是 public static final 类型的。

 

3. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

 

object类

 Object类是所有类的父类,声明一个Object类的作用就是可以传递任何类型的类来使用。

Object是所有类的父类,它有很多类对象会用到的方法,例如比较常用的toString 、equals。

写封装方法的时候不确定传进来的值的类型,就可以使用Object作为类

 

接口

 

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

 

实现接口:

class 子类 implements 接口A,接口B,...{}

继承抽象类实现接口

class 子类 extends 抽象类 implements 接口A,接口B,...{}

接口的继承:

interface 子接口 extends 父接口A,父接口B,...{}

 

throw与throws的区别与共同点
1.throws出现在方法函数头,throw出现在函数体。
2.throws表示出现异常的一种可能(不一定会发生这些异常),throwthrow则一定抛出了某种异常对象。
3.throw不会单独使用
两者都是消极处理异常的方式,不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
 
 
 
Thread类与Runnable接口
Thread类:Thread对象代表Java程序中单个的运行线程。一个类通过继承Thread类,同时重写其run()方法,就可以实现多线程的方式运行,并继承Thread类的所有方法。Run()方法是运行线程的主体,且由Java直接调用run()方法。
Runnable接口:Runnable接口中只定义了一个方法,即为run方法void run()使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。 
 
Thread类runnable接口的区别(不太好解释举个栗子把)

继承Thread类的,就是将任务分给每一个对象来分别完成,因为MyThread继承Thread类,所以在new MyThread的时候在创建对象的同时创建线程;

实现Runnable的, 就是将任务分给多个对象共同完成,new MyThread相当于创建一个任务,然后实例化多个对象,创建线程即安排窗口执行。

 

 

 
try 和 catch 关键字
try 和 catch 关键字是用来捕获异常的关键字
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果try里没有代码,或者没有try,出现异常会导致程序崩溃。

 

 

Throwable的子类Exception类与RuntimeException类的区别

1、Exception在程序中是必须使用try…catch进行处理。

2、RuntimeException可以不使用try…catch进行处理,但是出现异常要给JVM进行处理

 

 

通过Runnable接口创建线程的步骤如下:
1、定义实现Runnable接口的类,并实现该类中的run()方法。
2、建立一个Thread对象,并将实现的Runnable接口的类的对象作为参数传入Thread类的构造方法。
3、通过Thread类中的start()方法启动线程。
 
 
实现Runnable接口相对于继承Thread类的优势
1.避免了继承Thread类的单继承的局限性。
2.Runable接口出现更符合面向对象,将线程单独进行对象的封装。
3.Runnable接口出现,降低了线程对象和线程任务的耦合性。所以创建线程的方式都使用Runnable接口。

 

 

java io

 

字节流

字节流以操作byte类型数据为主,主要操作类为OutputStream类和InputSream类。
1.字节输出流OutputStream是整个IO包中字节输出流最大父类,
2.字节输入流InputSream为抽象类,需依靠子类

 

 

字符流

相同点

 字符输出流Writer,字符输入流Reader都是是抽象类,详细见书p390

不同点

1.字节流在操作的时候是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。
2. 字符流要使用close方法的话,则不会输出任何内容。字符流的缓冲区,可以使用flush方法强制进行刷新缓冲区,这时可以在不close的情况下输出内容。

字节流-字符流的转换类
OutputStreamWriter:是Writer的子类,将输出的字符流转换为字节流。即:将一个字节流的输出对象变为字节流的输出对象 
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。

 

FileInputStream 常用的构造方法重载形式
FileInputStream:通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream:通过打开一个到实际文件的链接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

 

 

转换流
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。


内存流
字节数组

ByteArrayInputStream是字节数组输入流,在内存中创建了一个字节数组,将输入流中读取的数据保存到字节数组的缓存区中.也就是说字节数组输入流将读取数据放到字节数组缓冲区中.

ByteArrayOutputStream是创建缓冲区用的类

例  OutputStream bOut = new ByteArrayOutputStream(int a)  创造一个大小为n字节的缓冲区
字符数组
CharArrayReader类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长,可使用 toCharArray() 和 toString() 获取数据。
CharArrayWriter类用于将子u写入到内置字符缓存数组中

成功创建字节数组输出流对象后的操作

技术图片

 

 

 

 

字符串

 

StringReader:只有一个版本的构造方法,接受一个String作为参数

StringWriter:StringWriter内部有两个版本的构造方法


管道流
PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。这个两个流必须同时使用。


打印流

打印流为输出信息最方便的类,其包括PrintStream类和PrintWriter类。

PrintStream 类

提供了打印方法可以对多种数据类型进行打印,并保持数据的表现形式。 

它接收三种类型的值:字符串路径,File对象,字节输出流。

PrintWriter类

就非常实用的一种,很多地方都可以用到(不知道怎么说)

 

 

JAVA使用AWT和Swing 类完成图形用户界面编程

 

Swing

Swing 是一个为Java设计的GUI工具包,是JAVA基础类的一部分。

Swing包括了图形用户界面(GUI)器件:文本框,按钮,分隔窗格和表。

 

AWT

AWT全称是抽象窗口工具集(Abstract Window Toolkit),它是最早的sun提供的GUI库(Graphics User Interface)图形用户界面。AWT提供了JavaApplet和Java Application中可用的用户图形界面GUI中的基本组件(components)。由于Java是一种独立于平台的程序设计语言,但GUI却往往是依赖于特定平台的.它的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器。

 

AWT与Swing的区别

1.Swing 不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充。

2.Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。

3.Swing的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。

 

常用的概念解析

JFrame – java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。

JPanel – Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到JFrame窗体中。。

JLabel – JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。

JTextField –一个轻量级组件,它允许编辑单行文本。

JPasswordField – 允许我们输入了一行字像输入框,但隐藏星号(*) 或点创建密码(密码)

JButton – JButton 类的实例。用于创建按钮类似实例中的 "Login"。

 

Java GUI API

GUI API包含的类可以分为三个组:组件类(component class),容器类(container class),辅助类(helper class)

组件类是创建用户界面的。容器类是用来包含其他组件的。辅助类是用来支持GUI组件的。

 

布局管理器

布局管理器概念:各组件在容器中的大小以及摆放位置。实现跨平台特性并获得动态布局的效果。
 
 
 绝对布局:就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。

 

 

常用的布局管理器类型(详细操作方法见书)

1.FlowLayout( 流式布局管理器):是最简单的布局管理器。按照组件添加的顺序,从左到右地将组件排列在容器中。
2.BorderLayout (边界布局管理器):是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中,且每个区域最多只能包含一个组件。
3.GrideLayout (网格布局管理器):是以网格的形式管理组件,使用前需要设置显示行数和列数(先满足行,再调列),如果有多出的组件则要固定增加一列。
4.CardLayout(卡片布局管理器): 是由一组组件彼此重叠进行布局的,缺点是每次只显示一个界面

技术图片

 

 

 

JPanel

Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到JFrame窗体中。

 

JScrollPane

JScrollPane类可提供轻量级组件的 scrollable 视图。JScrollPane 管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口。

 

JTabbedPane

JTabbedPane选项卡面板实现了一个多卡片的用户界面,通过它可以将一个复杂的对话框分割成若干个选项卡,实现对信息的分类显示和管理,使界面更简洁大方,还可以有效地减少窗体的个数。

 

JSplitPane (水平或垂直分割面板)

ifsplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,组件一,组件二)

ifsplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,组件一,组件二)

 

 

JScrollPane(设置滚动条)
static final HORIZONTAL_SCROLLBAR_ALWAYS    始终显示水平滚动条

static final VERTICAL_SCROLLBAR_ALWAYS        始终显示垂直滚动条

static final HORIZONTAL_SCROLLBAR_NEVER     任何情况下都不显示水平滚动条

static final VERTICAL_SCROLLBAR_NEVER  任何情况下都不显示垂直滚动条

static final HORIZONTAL_SCROLLBAR_AS_NEEDED    根据自生需要来显示水平滚动

static final VERTICAL_SCROLLBAR_AS_NEEDED   根据自生需要来显示垂直滚动条

 

其他类

GridLayout类:网格布局类,将容器划分为网格,所以组件可以按行和列进行排列,在网格布局中,每一个组件的大小都相同。

Dimension类:封装组件宽度高度类,可以通过组件对象.setPreferredSize(new Dimension(width,hight))来控制组件的大小。

ImageIcon类:图片类,可以用来加载磁盘上的图片。使用方法为ImageIcon image=new ImageIcon("图片地址")。

FlowLayout类:流式布局类(JPanel组件默认的布局类:流式居中布局),即从左至右,从上至下的布局类。

JTextPanel类 : 是一个可以编辑和显示html,rtf和普通文本的富文本组件,能实现的功能较多。

BorderLayout类:边框布局类(JFrame组件的默认布局类),即分为东南西北。

JComboBox类:是一个组件,它结合了一个按钮或可编辑字段与下拉列表。

 

 

事件处理

事件就是表示一个对象发生状态变化;事件接收对象被称为事件监听器,所有的事件监听器都是以监听接口的形式出现的。当然单单只有一个监听器是不够的,还需要在组件使用时注册监听,这样才可以处理。在实现类和接口之间增加一个过渡的抽象类,子类继承抽象类就可以根据自己的需要进行方法的覆写,了解了动作事件之后,就可以使用此事件完成一个简单的用户登录操作。

 

处理事件的接口

监视器负责处理事件源发生的事件,监视器是一个对象,为了处理事件源发生的事件,监视器这个对象会自动调用一个方法来处理事件。被调用的这个方法就是所说的处理事件的接口中的方法。

 WindowListener接口中定义的方法

void windowOpened(WindowEvent e)         打开窗口

void windowActivated(WindowEvent e)        激活窗口

void windowClosed(WindowEvent e)           关闭窗口

void windowDeiconified(WindowEvent e)    还原窗口 

void windowClosing(WindowEvent e)          正在关闭窗口

void windowDeactivated(WindowEvent e)   变为非活动窗口 

void windowIconified(WindowEvent e)        最小化窗口 

 

 

 

 

 补充

JLabel – JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。

JTextField 一个轻量级组件,它允许编辑单行文本。

JPasswordField 允许我们输入了一行字像输入框,但隐藏星号(*) 或点创建密码(密码)

JButton – JButton 用于创建按钮类似实例中的 "Login"。

 

1,addTab(String title, Component component):添加一个标签为title的选项卡

2,setTabPlacement(int tabPlacement):设置选项卡标签的显示位置

3,setTabLayoutPolicy(int tabLayoutPolicy):设置选项卡标签的布局方式

4,setSelectedIndex(int index):设置指定索引位置的选项卡被选中

5, getSelectedComponent():获取当前选中的选项卡对应的内容组件

6, removeTabAt(int index)或remove(int index):移除指定位置的选项

7, remove(Component component):移除指定内容控件的选项卡

8, removeAll():移除所有选项卡

 

 

 

 

 

事件处理及监听处理

 键盘事件

 接口方法

 

技术图片

 

 

JMenuItem 常用方法

 

技术图片

 

 

 

鼠标事件

 MouseListener 接口方法

 

技术图片

 

 

 MouseEvent 事件的常用方法

 

技术图片

 

 

鼠标拖拽事件及监听处理

 

在Swing中可以使用MouseMotionListener接口完成鼠标的拖拽操作

 

技术图片

 

 

 

 

 

JRadioButton 事件处理(ItemListener)

JRadioButton常用方法

 

技术图片

 

 


 ItemListener接口方法

 

技术图片

 

 

 ItemEvent 类的常用方法及常量

 

技术图片

 

 

复选框 JCheckBox

 JCheckBox 类常用方法

 

技术图片

 

 

菜单组件(JMenu 与 JMenuBar)

 JMenubar 的常用方法

 

技术图片

 

 

 JMenu 的常用方法

 

技术图片

 

 

JMenuItem 类的常用方法

 

技术图片

 

 

ActionEvent事件

 

JMenuLtem继承AbstractButton时选择菜单项的时候会触发ActionEvent事件

技术图片

 

 

 

 

文件选择框 JFileChooser


 JFileChooser 类的常用方法

 

技术图片

 

 

文件选择框的三种返回状态

 

技术图片

 

 

 

 

 

JDBC

 

JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。

 

执行流程

1 连接数据源,如:数据库。

2 为数据库传递查询和更新指令。

3 处理数据库响应并返回的结果。

 

常见的类与接口

 

DriverManager类:用于注册驱动(创建连接对象)。 java.sql.DriverManager;

Connection接口:表示与数据库创建的连接 。java.sql.Connection;

Statement接口:操作数据库sql语句的对象,并返回相应结果的对象。 java.sql.Statement;

ResultSet接口:结果集或一张虚拟表(客户端存表数据的对象)。 java.sql.ResultSet;

 

一般开发步骤

 

1 . 加载驱动(搭建环境):
    I.  将Oracle驱动Jar包复制到项目中的自建lib文件夹下。
    II. ojdbc6.jar 右键 –> build path –> add to build path。
 
2 . 连接数据库(OracleXE):
    I.  通过DriverManager.getConnection(url,user,password)获取数据库连接对象(Connection),提供三个实参:
    1). URL:jdbc:oracle:thin:@localhost:1521:xe  //Uniform Resource Locator 统一资源定位符 协议、IP、端口号、实例名(SID)
    2). UserName:hr
    3). Password
 
3 . 获得发送SQL的工具:
    I.  通过Connection对象获取Statement工具。
    II. 通过Connection对象获取PreparedStatement工具,并且传入预编译SQL
 
4 . 发送SQL语句到数据库执行:
I.  DML语句:statement.executeUpdate(sql); //受影响行数 int
II. DQL语句:statement.executeQuery(sql); //结果集 ResultSet
III  PreparedStatement发送SQL,无需传入SQL
 
5 . 处理结果:
I.  DML语句:逻辑判断
II. DQL语句:展示、封装。
 
6 . 释放资源:
I.  遵循先开后关。
II. 关闭顺序ResultSet、Statement、Connection。
 
 

加载驱动程序:

1
2
3
4
5
Class.forName(driverClass)
//加载MySql驱动
Class.forName("com.mysql.jdbc.Driver")
//加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver")

  

获得数据库连接:

DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc", "root", "root");

 


创建Statement\PreparedStatement对象:

conn.createStatement();
conn.prepareStatement(sql);

 

 

 

 这学期学的东西基本都总结在上了 ,接下来写一下个人总结~

学完java基础,对java面向对象的思想有更加深刻的认识了,从学习java语言概述到最后网络编程IDE的使用,不知不觉一个学期过去了,回首感觉快又感觉漫长,学的东西确实挺多的,很多知识也感觉比较抽象,需要多加的练习和总结,我个人并不喜欢记这些具体的方法啊之类的,只喜欢通过读写写来理解这些程序。
程序答辩结束后老师和我说了我的问题,说我考得还可以,就是很多细节并没有理解清楚。
       学习的过程中确实遇到了很多的困难,学习的过程中,听完一天课,很多代码自己是没办法写出来的,只能挑重点先抄它一遍,然后自己摸索写一遍,写不下去了,又看看老师怎么写的,第三遍自己写,能写出来就基本掌握了,对所有学习的知识点都用这个方法,这个自己摸索的方法,感觉真的很实用。也是检验学习效果的好方法。
       java语言中分为逻辑性代码和功能性代码,逻辑性代码就是一个方法里面套一个方法,再套一个方法,这个方法调用另外一个方法,套来套去,很多人说城市套路深,我感觉java语言的套路才深呢,入了套路,总要解套吧,心中慢慢摸索出了些心得,从哪里来到哪里去,就是这个方法是那里来的,一个个方法跟踪,找到它的源头,这个方法是干什么用的,不停地问为什么,它实现了什么功能,一路问下来,思路自然就清晰了,有时候有些搞不懂的还是要经常百度的。学习的过程也非常感谢同学老师对我的帮助,让自己不断地进步,我感觉这段时间的学习是痛苦并快乐着的,每天的日子都感觉很充实,我相信未来的我一定会感谢现在拼搏的自己。

java学习总结

标签:下拉列表   ams   窗口   horizon   ext   水平居中   共同点   加强   resultset   

原文地址:https://www.cnblogs.com/lpf666/p/12035946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!