1.SQL语法

(5) 数据库约束

前面创建的数据表仅仅指定了一些列定义,这仅仅是数据表的基本功能。除此之外,所有的关系数据库都支持对数据表使用约束,通过约束可以更好地保证数据表里数据的完整性。约束是在表上强制执行的数据校验规则,约束主要用于保证数据库里数据的完整性。除此之外,当表中数据存在相互依赖性时,可以保护相关的数据不被删除。
        大部分数据库支持下面5种完整性约束。

  • NOT NULL:非空约束,指定某列不能为空。
  • UNIQUE:唯一约束,指定某列或者几列组合不能重复。
  • PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录。
  • FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
  • CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

虽然大部分数据库都支持上面5种约束,但MySQL不支持CHECK约束,虽然MySQL的SQL语句也可以使用CHECK约束,但这个CHECK约束不会有任何作用。
        虽然约束的作用只是用于保证数据表里数据的完整性,但约束也是数据库对象,并被存储在系统表中,也拥有自己的名字。根据约束对数据列的限制,约束分为如下两类。

  • 单列约束:每个约束只约束一列。
  • 多列约束:每个约束可以约束多个数据列。

为数据表指定约束有如下两个时机。

  • 建表的同时为相应的数据列指定约束。
  • 建表后创建,以修改表的方式来增加约束。

大部分约束都可以采用列级约束语法或者表级约束语法。下面依次介绍5种约束的建立和删除(约束通常无法修改)。

 1. NOT NULL约束
        非空约束用于确保指定列不允许为空,非空约束是比较特殊的约束,它只能作为列级约束使用,只能使用列级约束语法定义。这里要介绍一下SQL中的null值,SQL中的null 不区分大小写。SQL中的null具有如下特征。

  • 所有数据类型的值都可以是 null,包括int、float、boolean等数据类型。
  • 与Java类似的是,空字符串不等于null,0也不等于null。

如果需要在建表时为指定列指定非空约束,只要在列定义后增加not null 即可。建表语句如下:

除此之外,也可以在使用alter table修改表时增加或者删除非空约束,SQL命令如下:

 2. UNIQUE约束
        唯一约束用于保证指定列或指定列组合不允许出现重复值。虽然唯一约束的列不可以出现重复值,但可以出现多个null 值(因为在数据库中null不等于null)。
        同一个表内可建多个唯一约束,唯一约束也可由多列组合而成。当为某列创建唯一约束时,MySQL会为该列相应地创建唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同。
        唯一约束既可以使用列级约束语法建立,也可以使用表级约束语法建立。如果需要为多列建组合约束,或者需要为唯一约束指定约束名,则只能用表级约束语法。
        当建立唯一约束时,MySQL在唯一约束所在列或列组合上建立对应的唯一索引。
        使用列级约束语法建立唯一约束非常简单,只要简单地在列定义后增加 unique关键字即可。SQL语句如下:

如果需要为多列组合建立唯一约束,或者想自行指定约束名,则需要使用表级约束语法。表级约束语法格式如下:

上面的表级约束语法格式既可放在create table语句中与列定义并列,也可放在alter table语句中使用add关键字来添加约束。SQL语句如下:

上面的建表语句为test_name、test pass分别建立了唯一约束,这意味着这两列都不能出现重复值。除此之外,还可以为这两列组合建立唯一约束,SOL语句如下:

对于上面的unique_test2和 unique test3两个表,都是对test_name、test pass建立唯一约束,其中unique_test2要求test_name、test pass 都不能出现重复值,而unique_test3只要求test_name、test pass两列值的组合不能重复。
        也可以在修改表结构时使用add关键字来增加唯一约束,SQL语句如下:

还可以在修改表时使用modify关键字,为单列采用列级约束语法来增加唯一约束,代码如下:

对于大部分数据库而言,删除约束都是在 alter table语句后使用“drop constraint约束名”语法来完成的,但MySQL并不使用这种方式,而是使用“drop index约束名”的方式来删除约束。例如如下SQL语句:

3. PRIMARY KEY约束
        主键约束相当于非空约束和唯一约束,即主键约束的列既不允许出现重复值,也不允许出现 null值;如果对多列组合建立主键约束,则多列里包含的每一列都不能为空,但只要求这些列组合不能重复。主键列的值可用于唯一地标识表中的一条记录。
        每一个表中最多允许有一个主键,但这个主键约束可由多个数据列组合而成,主键是表中能唯一确定一行记录的字段或字段组合。
        建立主键约束时既可使用列级约束语法,也可使用表级约束语法。如果需要对多个字段建立组合主键约束,则只能使用表级约束语法。使用表级约束语法来建立约束时,可以为该约束指定约束名。但不管用户是否为该主键约束指定约束名,MySQL总是将所有的主键约束命名为PRIMARY。

当创建主键约束时,MySQL在主键约束所在列或列组合上建立对应的唯一索引。
        创建主键约束的语法和创建唯一约束的语法非常像,一样允许使用列级约束语法为单独的数据列创建主键,如果需要为多列组合建立主键约束或者需要为主键约束命名,则应该使用表级约束语法来建立主键约束。与建立唯一约束不同的是,建立主键约束使用primary key。
        建表时创建主键约束,使用列级约束语法:

建表时创建主键约束,使用表级约束语法:

建表时创建主键约束,以多列建立组合主键,只能使用表级约束语法:

如果需要删除指定表的主键约束,则在 alter table语句后使用drop primary key子句即可。SQL语句如下:

如果需要为指定表增加主键约束,既可通过modify修改列定义来增加主键约束,这将采用列级约束语法来增加主键约束;也可通过add来增加主键约束,这将采用表级约束语法来增加主键约束。SQL语句如下:

如果只是为单独的数据列增加主键约束,则可使用modify修改列定义来实现,如下SQL语句所示:

很多数据库对主键列都支持一种自增长的特性—一如果某个数据列的类型是整型,而且该列作为主键列,则可指定该列具有自增长功能。指定自增长功能通常用于设置逻辑主键列——该列的值没有任何物理意义,仅仅用于标识每行记录。MySQL使用auto_increment来设置自增长,SQL 语句如下:

一旦指定了某列具有自增长特性,则向该表插入记录时可不为该列指定值,该列的值由数据库系统自动生成。

4. FOREIGN KEY 约束
        外键约束主要用于保证一个或两个数据表之间的参照完整性,外键是构建于一个表的两个字段或者两个表的两个字段之间的参照关系。外键确保了相关的两个字段的参照关系:子(从)表外键列的值必须在主表被参照列的值范围之内,或者为空(也可以通过非空约束来约束外键列不允许为空)。
        当主表的记录被从表记录参照时,主表记录不允许被删除,必须先把从表里参照该记录的所有记录全部删除后,才可以删除主表的该记录。还有一种方式,删除主表记录时级联删除从表中所有参照该记录的从表记录。
        从表外键参照的只能是主表主键列或者唯一键列,这样才可保证从表记录可以准确定位到被参照的主表记录。同一个表内可以拥有多个外键。
        建立外键约束时,MySQL也会为该列建立索引。
        外键约束通常用于定义两个实体之间的一对多、一对一的关联关系。对于一对多的关联关系,通常在多的一端增加外键列,例如老师一学生(假设一个老师对应多个学生,但每个学生只有一个老师,这是典型的一对多的关联关系)。为了建立他们之间的关联关系,可以在学生表中增加一个外键列,该列中保存此条学生记录对应老师的主键。对于一对一的关联关系,则可选择任意一方来增加外键列,增加外键列的表被称为从表,只要为外键列增加唯一约束就可表示一对一的关联关系了。对于多对多的关联关系,则需要额外增加一个连接表来记录它们的关联关系。
        建立外键约束同样可以采用列级约束语法和表级约束语法。如果仅对单独的数据列建立外键约束,则使用列级约束语法即可;如果需要对多列组合创建外键约束,或者需要为外键约束指定名字,则必须使用表级约束语法。
        采用列级约束语法建立外键约束直接使用references关键字,references 指定该列参照哪个主表,以及参照主表的哪一列。如下SQL语句所示:

值得指出的是,虽然MySQL支持使用列级约束语法来建立外键约束,但这种列级约束语法建立的外键约束不会生效,MySQL提供这种列级约束语法仅仅是为了和标准SQL保持良好的兼容性。因此,如果要使MySQL中的外键约束生效,则应使用表级约束语法。

如果使用表级约束语法,则需要使用foreign key来指定本表的外键列,并使用references来指定参照哪个主表,以及参照到主表的哪个数据列。使用表级约束语法可以为外键约束指定约束名,如果创建外键约束时没有指定约束名,则 MySQL会为该外键约束命名为table_name_ibfk_n,其中 table_name是从表的表名,而n是从1开始的整数。
        如果需要显式指定外键约束的名字,则可使用constraint 来指定名字。如下SQL语句所示:

如果需要建立多列组合的外键约束,则必须使用表级约束语法,如下SQL语句所示:

删除外键约束的语法很简单,在 alter table后增加“drop foreign key约束名”子句即可。如下代码所示:

增加外键约束通常使用add foreign key命令。如下SQL语句所示:

值得指出的是,外键约束不仅可以参照其他表,而且可以参照自身,这种参照自身的情况通常被称为自关联。例如,使用一个表保存某个公司的所有员工记录,员工之间有部门经理和普通员工之分,部门经理和普通员工之间存在一对多的关联关系,但他们都是保存在同一个数据表里的记录,这就是典型的自关联。下面的SQL语句用于建立自关联的外键约束。

如果想定义当删除主表记录时,从表记录也会随之删除,则需要在建立外键约束后添加on deletecascade或添加 on delete set null,第一种是删除主表记录时,把参照该主表记录的从表记录全部级联删除;第二种是指定当删除主表记录时,把参照该主表记录的从表记录的外键设为 null。如下 SQL语句所示:

 5. CHECK约束
        当前版本的MySQL支持建表时指定CHECK约束,但这个CHECK约束不会有任何作用。建立CHECK约束的语法很简单,只要在建表的列定义后增加 check(逻辑表达式)即可。如下SQL语句所示:

虽然上面的SQL语句建立的check_test表中有CHECK约束,CHECK约束要求emp_salary大于0,但这个要求实际上并不会起作用。

(6) 索引

索引是存放在模式( schema)中的一个数据库对象,虽然索引总是从属于数据表,但它也和数据表一样属于数据库对象。创建索引的唯一作用就是加速对表的查询,索引通过使用快速路径访问方法来快速定位数据,从而减少了磁盘的I/O。
        索引作为数据库对象,在数据字典中独立存放,但不能独立存在,必须属于某个表。

创建索引有两种方式。

  • 自动:当在表上定义主键约束、唯一约束和外键约束时,系统会为该数据列自动创建对应的索引。
  • 手动:用户可以通过create index....语句来创建索引。

删除索引也有两种方式。

  • 自动:数据表被删除时,该表上的索引自动被删除。
  • 手动:用户可以通过drop index...语句来删除指定数据表上的指定索引。

索引的作用类似于书的目录,几乎没有一本书没有目录,因此几乎没有一个表没有索引。一个表中可以有多个索引列,每个索引都可用于加速该列的查询速度。
        正如书的目录总是根据书的知识点来建立一样——因为读者经常要根据知识点来查阅一本书。类似的,通常为经常需要查询的数据列建立索引,可以在一列或者多列上创建索引。创建索引的语法格式如下:

有些数据库删除索引时无须指定表名,因为它们要求建立索引时每个索引都有唯一的名字,所以无须指定表名,例如Oracle就采用这种策略。但MySQL 只要求同一个表内的索引不能同名,所以删除索引时必须指定表名。
        索引的好处是可以加速查询。但索引也有如下两个坏处。

  • 与书的目录类似,当数据表中的记录被添加、删除、修改时,数据库系统需要维护索引,因此有一定的系统开销。
  • 存储索引信息需要一定的磁盘空间。

(7) 视图

视图看上去非常像一个数据表,但它不是数据表,因为它并不能存储数据。视图只是一个或多个数据表中数据的逻辑显示。使用视图有如下几个好处。

  • 可以限制对数据的访问。
  • 可以使复杂的查询变得简单。
  • 提供了数据的独立性。
  • 提供了对相同数据的不同显示。

因为视图只是数据表中数据的逻辑显示——也就是一个查询结果,所以创建视图就是建立视图名和查询语句的关联。创建视图的语法如下:

从上面的语法可以看出,创建、修改视图都可使用上面语法。上面语法的含义是,如果该视图不存在,则创建视图;如果指定视图名的视图已经存在,则使用新视图替换原有视图。后面的subquery 就是一个查询语句,这个查询可以非常复杂。

一旦建立了视图以后,使用该视图与使用数据表就没有什么区别了,但通常只是查询视图数据,不会修改视图里的数据,因为视图本身没有存储数据。
        如下SQL语句就创建了一个简单的视图:

通常不推荐直接改变视图的数据,因为视图并不存储数据,它只是相当于一条命名的查询语句而已。为了强制不允许改变视图的数据,MySQL允许在创建视图时使用with check option子句,使用该子句创建的视图不允许修改,如下所示:

(8) DML语句语法

与DDL操作数据库对象不同,DML主要操作数据表里的数据,使用DML可以完成如下三个任务。

  • 插入新数据。
  • 修改已有数据。
  • 删除不需要的数据。

DML语句由insert into、update和 delete from三个命令组成。

1. insert into语句
        insert into用于向指定数据表中插入记录。对于标准的SQL语句而言,每次只能插入一条记录。 insertinto语句的语法格式如下:

执行插入操作时,表名后可以用括号列出所有需要插入值的列名,而 values后用括号列出对应需要插入的值。
        如果省略了表名后面的括号及括号里的列名列表,默认将为所有列都插入值,则需要为每一列都指定一个值。如果既不想在表名后列出列名,又不想为所有列都指定值,则可以为那些无法确定值的列分配null。下面的SQL语句示范了如何向数据表中插入记录。

在表名后使用括号列出所有需要插入值的列:

如果不想在表后用括号列出所有列,则需要为所有列指定值;如果某列的值不能确定,则为该列分配一个null 值。

经过两条插入语句后,可以看到teacher_table2表中的数据如图13.9所示。
        从图13.9中看到abc记录的主键列的值是2,而不是SQL语句插入的null,因为该主键列是自增长的,系统会自动为该列分配值。
        根据前面介绍的外键约束规则:外键列里的值必须是被参照列里已有的值,所以向从表中插入记录之前,通常应该先向主表中插入记录,否则从表记录的外键列只能为null。现在主表teacher_table2中已有了⒉条记录,现在可以向从表student_table2中插入记录了,如下SQL语句所示:

在一些特别的情况下,可以使用带子查询的插入语句,带子查询的插入语句可以一次插入多条记录,如下SQL语句所示:

正如上面的SQL语句所示,带子查询的插入语句甚至不要求查询数据的源表和插入数据的目的表是同一个表,它只要求选择出来的数据列和插入目的表的数据列个数相等、数据类型匹配即可。
        MySQL甚至提供了一种扩展的语法,通过这种扩展的语法也可以一次插入多条记录。MySQL 允许在 values后使用多个括号包含多条记录,表示多条记录的多个括号之间以英文逗号(,)隔开。如下SQL语句所示:

2. update语句
        update语句用于修改数据表的记录,每次可以修改多条记录,通过使用where子句限定修改哪些记录。where子句是一个条件表达式,该条件表达式类似于Java语言的if,只有符合该条件的记录才会被修改。没有where子句则意味着where表达式的值总是true,即该表的所有记录都会被修改。update 语句的语法格式如下:

使用update语句不仅可以一次修改多条记录,也可以一次修改多列。修改多列都是通过在set关键字后使用column1=value1,column2=value2…来实现的,修改多列的值之间以英文逗号(,)隔开。
        下面的SQL语句将会把teacher_table2表中所有记录的teacher_name列的值都改为'孙悟空'。

 3. delete from语句
        delete from语句用于删除指定数据表的记录。使用delete from语句删除时不需要指定列名,因为总是整行地删除。
        使用delete from语句可以一次删除多行,删除哪些行采用where子句限定,只删除满足where条件的记录。没有where子句限定将会把表里的全部记录删除。

(9) 单表查询

select语句的功能就是查询数据。select语句也是SQL语句中功能最丰富的语句,select语句不仅可以执行单表查询,而且可以执行多表连接查询,还可以进行子查询,select语句用于从一个或多个数据表中选出特定行、特定列的交集。select语句最简单的功能如图13.10所示。

单表查询的select语句的语法格式如下:

上面语法格式中的数据源可以是表、视图等。从上面的语法格式中可以看出,select后的列表用于确定选择哪些列,where条件用于确定选择哪些行,只有满足 where条件的记录才会被选择出来;如果没有 where条件,则默认选出所有行。如果想选择出所有列,则可使用星号(*)代表所有列。
        下面的SQL语句将会选择出teacher_table表中的所有行、所有列的数据。

如果增加where条件,则只选择出符合where条件的记录。如下 SQL 语句将选择出 student_table表中 java_teacher值大于3的记录的student_name列的值。

当使用select 语句进行查询时,还可以在select 语句中使用算术运算符(+、一、*、/),从而形成算术表达式。使用算术表达式的规则如下。

  • 对数值型数据列、变量、常量可以使用算术运算符(+、一、*、/)创建表达式;
  • 对日期型数据列、变量、常量可以使用部分算术运算符(+、一)创建表达式,两个日期之间可以进行减法运算,日期和数值之间可以进行加、减运算;
  • 运算符不仅可以在列和常量、变量之间进行运算,也可以在两列之间进行运算。

不论从哪个角度来看,数据列都很像一个变量,只是这个变量的值具有指定的范围—―逐行计算表中的每条记录时,数据列的值依次变化。因此能使用变量的地方,基本上都可以使用数据列。
        下面的select 语句中使用了算术运算符。

需要指出的是,select后的不仅可以是数据列,也可以是表达式,还可以是变量、常量等。例如,如下语句也是正确的。

SQL语句中算术运算符的优先级与Java语言中的运算符优先级完全相同,乘法和除法的优先级高于加法和减法,同级运算的顺序是从左到右,表达式中使用括号可强行改变优先级的运算顺序。
        MySQL中没有提供字符串连接运算符,即无法使用加号(+)将字符串常量、字符串变量或字符串列连接起来。MySQL使用concat 函数来进行字符串连接运算。
        如下SQL语句所示:

对于MySQL而言,如果在算术表达式中使用null,将会导致整个算术表达式的返回值为null;如果在字符串连接运算中出现null,将会导致连接后的结果也是null。如下SQL语句将会返回null。

对某些数据库而言,如果让字符串和null进行连接运算,它会把null当成空字符串处理。
        如果不希望直接使用列名作为列标题,则可以为数据列或表达式起一个别名,为数据列或表达式起别名时,别名紧跟数据列,中间以空格隔开,或者使用as关键字隔开。如下SQL语句所示:

执行此条SQL语句的效果如图13.11所示。
        从图13.11中可以看出,为列起别名,可以改变列的标题头,用于表示计算结果的具体含义。如果列别名中使用特殊字符(例如空格),或者需要强制大小写敏感,都可以通过为别名添加双引号来实现。如下SQL语句所示:

如果需要选择多列,并为多列起别名,则列与列之间以逗号隔开,但列和列别名之间以空格隔开。如下SQL语句所示:

不仅可以为列或表达式起别名,也可以为表起别名,为表起别名的语法和为列或表达式起别名的语法完全一样,如下SQL语句所示:

前面已经提到,列名可以当成变量处理,所以运算符也可以在多列之间进行运算,如下SQL 语句所示:

甚至可以在select、where子句中都不出现列名,如下SQL语句所示:

这种情况比较特殊: where语句后的条件表达式总是true,所以会把 teacher_table表中的每条记录都选择出来——但 SQL语句没有选择任何列,仅仅选择了一个常量,所以SQL会把该常量当成一列,teacher_table表中有多少条记录,该常量就出现多少次。运行上面的SQL语句,结果如图13.12所示。

对于选择常量的情形,指定数据表可能没有太大的意义,所以MySQL提供了一种扩展语法,允许 select语句后没有from子句,即可写成如下形式:

上面这种语句并不是标准SQL语句。例如,Oracle就提供了一个名为dual 的虚表(最新的MySQL数据库也支持 dual虚表),它没有任何意义,仅仅相当于from后的占位符。如果选择常量,则可使用如下语句:

select默认会把所有符合条件的记录全部选出来,即使两行记录完全一样。如果想去除重复行,则可以使用distinct关键字从查询结果中清除重复行。比较下面两条SQL语句的执行结果:

前面已经看到了where子句的作用——可以控制只选择指定的行。因为 where子句里包含的是一个条件表达式,所以可以使用>、>=、<、<=、=和◇等基本的比较运算符。SQL 中的比较运算符不仅可以比较数值之间的大小,也可以比较字符串、日期之间的大小。

除此之外,SQL还支持如表13.3所示的特殊的比较运算符。

下面的SQL语句选出student_id大于等于2,且小于等于4的所有记录。

使用between vall and val2必须保证vall小于val2,否则将选不出任何记录。除此之外, between valland val2中的两个值不仅可以是常量,也可以是变量,或者是列名也行。如下SQL语句选出java_teacher小于等于2,student_id大于等于2的所有记录。

使用in 比较运算符时,必须在 in后的括号里列出一个或多个值,它要求指定列必须与in括号里任意一个值相等。如下SQL语句所示:

与之类似的是,in括号里的值既可以是常量,也可以是变量或者列名,如下SQL语句所示:

like运算符主要用于进行模糊查询,例如,若要查询名字以“孙”开头的所有记录,这就需要用到模糊查询,在模糊查询中需要使用like关键字。SQL语句中可以使用两个通配符:下画线(_)和百分号(%),其中下画线可以代表一个任意的字符,百分号可以代表任意多个字符。如下SQL语句将查询出所有学生中名字以“孙”开头的学生。

下面的SQL语句将查询出名字为两个字符的所有学生。

在某些特殊的情况下,查询的条件里需要使用下画线或百分号,不希望SQL把下画线和百分号当成通配符使用,这就需要使用转义字符,MySQL 使用反斜线(\)作为转义字符,如下SQL语句所示:

标准SQL语句并没有提供反斜线(\)的转义字符,而是使用escape关键字显式进行转义。例如,为了实现上面功能需要使用如下SQL语句:

is null用于判断某些值是否为空,判断是否为空不要用=null来判断,因为SQL中null=null 返回null。如下SQL语句将选择出student_table表中 student_name为 null的所有记录。

如果where子句后有多个条件需要组合,SQL提供了and和 or逻辑运算符来组合两个条件,并提供了not来对逻辑表达式求否。如下SQL语句将选出学生名字为2个字符,且student_id大于3的所有记录。

当使用比较运算符、逻辑运算符来连接表达式时,必须注意这些运算符的优先级。SQL 中比较运算符、逻辑运算符的优先级如表13.4所示。

如果SQL代码需要改变优先级的默认顺序,则可以使用括号,括号的优先级比所有的运算符高。如下SQL语句使用括号来改变逻辑运算符的优先级。

执行查询后的查询结果默认按插入顺序排列;如果需要查询结果按某列值的大小进行排序,则可以使用order by子句。order by子句的语法格式如下:

进行排序时默认按升序排列,如果强制按降序排列,则需要在列后使用desc关键字(与之对应的是asc关键字,用不用该关键字的效果完全一样,因为默认是按升序排列)。
        上面语法中设定排序列时可采用列名、列序号和列别名。如下 SQL 语句选出 student _table 表中的所有记录,选出后按java_teacher列的升序排列。

如果需要按多列排序,则每列的asc、desc必须单独设定。如果指定了多个排序列,则第一个排序列是首要排序列,只有当第一列中存在多个相同的值时,第二个排序列才会起作用。如下 SQL语句先按java_teacher列的降序排列,当java_teacher列的值相同时按student _name列的升序排列。

疯狂Java讲义(十三)----第二部分相关推荐

  1. 【疯狂Java讲义】第二章 理解面向对象

  2. [疯狂Java讲义精粹] 第十三章|类加载机制与反射

    java.lang.reflect包下的接口和类, 包括Class, Method, Filed,Constructor和Array等, 这些类分别代表类, 方法, Field, 构造器和数组, Ja ...

  3. 《疯狂Java讲义》读书笔记5

    目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...

  4. 疯狂Java讲义(六)----第四部分

    1.枚举类 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 在早期代码中,可能会直接使用简 ...

  5. 学习《疯狂Java讲义第4版》PDF+代码+课件+面试题分析

    学习java选择了<疯狂java讲义>最新的第四版,用了两个多月时间看完,一边阅读,一边敲代码.对Java有了不少新的认识.书中实例清晰明了,讲解也是娓娓道来.Java可以编写图形桌面系统 ...

  6. 《疯狂Java讲义》学习笔记 第六章 面向对象(下续)

    这里## 6.6 Java 9改进的接口 6.6.1 接口的概念 6.6.2 Java 9中接口的定义 6.6.3接口的继承 ==以下代码中纯在自己的很多错误== 6.6.4使用接口 6.6.5接口和 ...

  7. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  8. java下载pdf6_疯狂java讲义第6版 电子版(pdf格式)

    疯狂java讲义第6版pdf是李刚打造的经典java编程图书的最新版,为了帮助更多的读者能真正掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,作者根据多年来的Java授课经验,精 ...

  9. 《疯狂Java讲义精粹》读书笔记2 ------ 多态

    -----------------<疯狂Java讲义精粹>2读书笔记--------------- Java引用变量有两个类型: · 编译时类型(由声明该变量时使用的类型决定) · 运行时 ...

  10. java画图颜色_手绘板,多种颜色选择。我抄的《疯狂java讲义》的,包我乱导的,但代码能用。...

    [java]代码库import javax.swing.*; import java.awt.image.*; import java.awt.datatransfer.*; import javax ...

最新文章

  1. 【问题收录】Ubuntu14.04无法进入到tty1-6的解决办法
  2. 2015年6月9日_诗词学习
  3. 角度编码器 ST-3806-15-RS
  4. j2se学习中的一些零碎知识点2之基础知识
  5. qt char*转int_Qt在Linux下绘制文字原理-使用FreeType来绘制字形
  6. Web开发工具包收藏
  7. Python中的文件操作和异常
  8. Android 4.4(KitKat)中的设计模式-Graphics子系统
  9. Eclipse Rcp系列 http://www.blogjava.net/dreamstone/archive/2007/02/08/98706.html
  10. python一个类有几个实例对象_Python为单个对象/类创建多个实例
  11. k2pbreed刷高恪教程_斐讯K2刷高恪固件教程,通过breed刷入,详细图文教程
  12. plecs matlab 联合仿真,利用MATLAB/Simulink图形环境和PLECS模块库仿真太阳光电(PV)换流器...
  13. 【MapGIS】常见问题处理
  14. hack_lu_2018_heap_heaven
  15. 安卓Intent 详解
  16. 常用网络测试命令——ping命令
  17. 没钱租云服务器,家庭局域网映射公网IP,中国联通家庭智能网关排坑指南
  18. GoLang - Go中Mocking(3)
  19. 解决图像目标检测两框重叠问题
  20. 苹果状态栏HTML,webview内嵌的html页面,在ios系统上12以上版本和12以下版本状态栏效果不一样...

热门文章

  1. 0. 一字一句的搞懂vue-cli之vue webpack template配置
  2. Windows保护眼睛的颜色设置
  3. echarts环形柱状图
  4. [串口屏定义2022最新版]什么是串口屏?串口屏组成及串口屏方案
  5. 计算机病毒不可能侵入rom吗,计算机试题选择题重点1
  6. 机场客流量的时空分布预第一名方案
  7. CSS实现三角形原理及过程
  8. 速写总是画不好发型?绘画手法很重要
  9. 「镁客·请讲」Bello李松毅:用AI赋能招聘,实现前期工作的自动化、智能化
  10. 文本分析——分配单词权重