一、Java编程入门
Java常识
- Java主设计者James Gosling
- 1995.5.23 Sun发布了Java1.0
- Java EE JSP/Servlet
- Java ME 游戏/通讯
- Java SE 核心技术:面向对象/JVM/底层支持
- Java源程序
*.Java
由编译器编译成*.class
文件后,可以运行在任意系统的JVM
上 -
main
程序是Java程序执行的入口点 -
JRE
系统目录库:存放程序运行必须的系统库文件 - 单行注释
//
多行注释以/*
开始 以*/
结束 -
public
修饰的类名必须和Java
文件名一致 -
Java
关键字严格区分大小写
二、Java 数据类型和运算符
Java 中的包、类方法、参数和变量的名字,可以由任意顺序的大小写字母、数字、下划线和美元符号开头。不能以数字开头,不能以Java的保留关键字开头变量名对应的是内存
类型 | 关键字 |
---|---|
整数类型 | byte、short、int、long |
浮点类型 | float、double |
字符型 | char |
布尔型 | boolea |
类型 | 大小 | 范围 |
---|---|---|
boolean | 1字节8位有符号整数 | true、false |
byte | 1字节8位有符号整数 | -128 + 127 |
char | 2字节16位Unicode字符 | Unicode 0 ~ Unicode 216-1 |
short | 2字节16位有符号整数 | -32768(-215) ~ + 32767 (+215-1) |
int | 4字节32位有符号整数 | -2147483648(-231) ~ + 2147483647(231-1) |
long | 8字节64位有符号整数 | -263 ~ + 263-1 |
float | 4字节32位浮点数 | 1.4E-45 ~ 3.4E+38、-1.4E-45 ~ -3.4E+38 |
double | 8字节64位浮点数 | 4.9E-324 ~ 1.7E+308、-4.9E-324 ~ -1.7E+308 |
系统自动转换类型的时机
- 两种类型兼容
- 目标类型大于源类型
类型转换
- 对于表达式,如果有一个类型为
Double
整个表达式自动提升为Double
类型 - 高进制转换为低进制需要强制转换
int num = (int)10.2;
运算符
- 算术运算符
+ - * / % += -= /= *= %=
- 关系运算符
> < == != >= <=
- 逻辑运算符
&& & || ! ^
三、流程控制
分支结构
-
if else / if else if else
,当if
或者else
中有多条语句时,必须使用{}
-
switch
表达式必须为byte、short、int、long
或char
类型(因为前者可以转换为char
类型,case
后面常量必须各不相同
switch (表达式) {
case '常量值 1':
语句(组);
break;
case '常量值 2':
语句(组);
break;
case '常量值 N';
语句(组);
break;
default;
语句(组);
}
循环结构
-
for
(变量初始化;循环条件表达式;递增或递减的变量的值) -
while
先判断条件再执行(当型) -
do while
先执行再判断条件,至少可以执行一次(直到型循环)
循环中断
-
break
强迫程序中断循环,离开循环体 -
continue
语句之后的语句不再执行,跳出本次循环,进行下一次的循环
三目运算
- 表达式 关系运算符 表达式 ? 值 : 值
num1 > num2 ? true:false
接受键盘输出
- Scanner input = new Scanner(System.in);
四、面向对象编程(一)
基本概念
- 类是一组具有相同特征和相同行为的对象的集合
- 对象是实际存在该类事物的每个个体,也叫实例
- 类名不可以使用 Java关键字,首字母可以为字母,也可以为
"_"、"$"
但是不推荐,不可以包含空格和小圆点 - 类变量如果不赋值,都有各自的初始化值
-
boolean false,cahr null('/u0000')
,数值型为0 - 对象通过
new
关键字来实例化一个对象,对象名在栈内存中,对象在堆内存
通过构造方法可以初始化成员属性
private Integer eid;
private String ename;
public Emp (Integer eid,String ename) {
this.eid = eid;
this.ename = ename;
}
一些概念
this
关键字表示类中的成员属性名,this
关键字也可以调用本类中的其他构造方法,this
表示的是当前的对象
构造方法名与类名相同,没有返回值
构造方法不是必须的,如果没有定义构造方法,在编译时JVM会默认创建一个无参的构造方法,如果自己定义了带参数的构造方法,JVM则不再定义不带参数的构造方法了
对象的比较,==
比较的是内存地址是否一致,equals
比较的是对象的值是否相等
五、面向对象编程(二)
面向对象的三大特性:封装,继承,多态
- 封装:将成员变量声明为私有的(
private
),再提供一个或多个公有(public
)setXX()
和getXX()
方法实现对该成员变量的访问和修改。类中的私有成员变量成员方法只能在该类内部调用,不能通过该类的对象调用 - 继承:一个类从另一个类派生出来的过程叫继承,被继承的类称为父类,执行继承的类称为子类,不允许多重继承。一个类如果没有
extends
任何类,则默认继承Object
类,但是不继承父类的构造函数。extends
实现继承,supper
关键字实现调用父类方法 - 多态:方法重写。方法名、参数、返回值类型都相同,方法中实现的具体操作不同。重写方法时,不能使用比父类中被重写的方法更底的访问权限。
public->protected->default->private
。继承只能为非private
的变量与方法如果父类为private
的,子类中同名、同参、同返回值类型的方法只相当于定义了一个新方法,与父类没有任何关系
方法重载
- 在同一个类中方法名相同
- 方法的参数类型或个数或顺序不同
五、面向对象编程(三)
静态与不可变
-
final
的意思是最终不变的意思,final
修饰过得变量变为常量,常量一般用大写。final
声明的变量为常量,常量不可以修改,final
声明的类不可以有子类,final
声明的方法不可以重写 -
static
声明的属性,变量,方法为全局属性,多个对象共用一个内存空间。调用方法为 类名.方法名
main方法的理解
public static void main (String[] args) {}
-
public
表示此方法可以被外部调用 -
static
表示该方法可以由类名直接调用 -
void
主方法是程序的起点,所以不需要任何返回值 -
String[] args
表示运行时的参数
包的命名规范和导入包
-
package
命名一般是反顺序的类的创建者的域名 -
com
.公司名.类名 -
import
中使用*
的警告。星号形式导包可能会增加编译时间,但对运行时间,性能和类的大小没有影响。如果引入的两个包中有同名类,编译器会保持沉默,除非你试图运行其中一个,否则给出一个编译时的错误
Java的四种访问权限
-
public
公共的,可以被所有的类访问 -
protected
受保护的,可以被本类,子类,同包下的类访问 -
default
默认的/友好的可以被本类,同包下的类访问 -
private
私有的,只能被本类访问,如果这个类的构造方法声明为private
,则其他类不可以实例化该对象
七、抽象类及异常
抽象类定义
- 抽象类:包含一个抽象方法的类称为抽象类
- 抽象方法:只声明而为实现(没有方法体)的方法称为抽象方法,使用
abstract
关键字声明该方法
抽象类的使用规则:
- 包含一个抽象方法的类必须是抽象类
- 抽象类和抽象方法必须使用
abstract
关键字声明 - 抽象方法只需要声明而不需要实现(没有方法体)
- 抽象类必须被子类继承,子类必须重写抽象类中的抽象方法,如果不重写,该子类也必须声明为抽象类
- 抽象类不能使用
final
修饰,因为final
修饰的类不能被继承,而抽象类的作用就是用来被继承的 - 抽象类中可以定义构造方法,也可以在子类中通过
supper
调用,但构造方法只用于子类的调用,因为抽象类不能被实例化 - 抽象类也遵循单继承关系
接口:
- 如果一个类全部是抽象方法和全局常量(
static final
),该类可以定义成一个接口 - 子类可以通过
implement
关键字同时实现多个接口,用逗号隔开 - 子类同时共享多个接口中的常量,且必须实现多个接口中的方法
- 实现接口的子类也可以定义自己的属性或者方法
- 一个接口不能继承另一个抽象类,因为继承抽象类后必须实现抽象类中的方法,但是接口中只能定义抽象方法,两者有冲突
- 一个接口可以实现多个接口
异常:
- 异常是导致程序中断运行的一种指令流
- 软件和硬件错误都可能导致异常
- 程序中的异常通常是指软件开发中的异常,而非硬件问题
- Java中使用
try catch
来捕获,处理这些异常 - 产生异常后,会立即产生一个异常类的实例化对象
- 在
try
语句中对此异常对象进行捕捉 - 产生的异常对象与
catch
语句中的各个异常类型进行匹配,如果匹配成功,则执行catch
语句中的代码 - 如果有
finally
语句,则最后执行finally
语句中的内容 -
Throwable
是所有例外类型的父类,不能直接被调用 -
Error
表示编译时的系统错误,一般是和VM有关的严重问题,比如说内存溢出 -
Exception
是程序中可以直接抛出的常见异常,又可以分为两类 -
RuntimeException
是运行异常:它表示程序运行正常的话就不会发生这种问题,这种异常不用再程序中把他们列出来,运行时有问题,会自动被JVM抛出,比如:空指针异常,数组超出异常 - 非运行时的异常:例如
FileNotFoundExcepiton
(文件未找到例外)Java编译器要求在程序中必须处理这种例外,捕获例外或声明抛弃例外
如果在一个方法中生成了一个异常,但是并不知道该如何对着一异常进行处理,可以在方法声明时抛弃异常,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止 - 方法名(参数)
throws
异常类型{//方法体} - 一个异常可以有多个
catch
八、数组及常用类
- 数组:是有相同类型的,用一个标识符名称封装到一起的一个对象序列或基本数据类型数据序列
- 数组是一种最简单的复合数据类型,数组是一维的也可以是多维的
声明数组:
Integer[] number;
Integer number[];
- 声明的时候不可以指定数组长度,只声明的数组是不能访问它的任何元素
- 用
new
关键字为对象分配内存空间Integer number = new Integer[100];
通过引用来获取数组元素
-
number[0],number[1],...
数组的取值范围是0 - number.length -1
- 当
x = null
即数组对象不再被任何引用变量使用的时候,"垃圾回收器"将自动释放该内存资源
数组的静态初始化
Integer number[] = {1,2,3,4,.....};
Integer number[] = new Integer[] {1,2,3,4,....};
动态初始化
Integer number[];``number = new Integer[5];
使用时要注意的问题
- 只声明没有初始化的时候直接使用该变量会导致空指针异常
- 数组越界异常,取值范围大于等于数组长度时,
length
属性表示数组的长度
多维数组
- Java没有真正的多维数组,只有数组的数组
- Java语言中把二维数组看做是数组中的数组,数组的空间不是连续分配的,所以不要求二维数组的每一维的大小相同
Integer number[][] = {{1,2,3},{4,5},{6,7,8,9,0}};
二维数组的定义
Integer number [][];
Integer[][] number;
Integer number[][] = new Integer[2][3];
Integer[][] number = {{1,2,3},{4,5,6}};
动态初始化
-
Integer[][] number = new Integer[3][];
//指定一个3行n列的数组 -
number[0] = new Integer[100];
//指定第一行为100列 -
number[1] = new Integer[200];
//指定第二行为200列 -
number[2] = new Integer[300];
//指定第三行为300列 - 在Java语言中,必须首先为最高维的分配引用空间,然后再顺次为低维分配空间
- 声明数组:是在栈内存中声明的
- 为数组开辟空间:是使用关键字
new
在堆内存中完成的 - Java中数组是对象,不是基本数据类型
Java.util.Arrays类:
- 提供了用来操作数组的一些方法(排序,搜索)
- 类中的方法都是静态的,可以直接调用
String类:
- String类时final的,一旦创建了就不能修改,因此对于String对象的各种操作都是生成了一个新的String对象
StringBuffer类:
- 当频繁修改字符串内容时建议使用该类,提供了与String类似的方法
九、常用集合类
ArraayList类
-
ArrayList
类是List
接口的实现类 -
ArrayList
是JDK1.2
才出现的,属于线程不安全的类,速度快,异步处理方式
Vector类
-
Vector
类与ArrayList
类提供的功能是一样的 -
Vector
类是JDK1.0
开始就存在的,属于线程安全的类,速度慢,同步处理方式
HashMap类
- 是以键值对的方式存放数据的
-
key
不允许重复,key value
允许为空,key
如果重复,新的value
会替换旧的value
- 集合中存放的数据是无序的,存放数据是非线程安全的
十、JDBC 编程(上)
- JDBC是Java链接数据库并且进行数据操作的技术
- JDBC工具包可以让编程人员在Java程序中直接使用结构化查询语言,即
sql
,连接到一个数据库,对数据库进行查询,更新 - JDBC是标准化地将关系型数据库操作和Java程序集成到一起,可以直接对数据库进行访问和修改的API。
- JDBC现在可以连接的数据库包括:
Oracle,Sql Server,MySQL,DB2,Informix
以及Sybase
等
JDBC 的流程
创建数据库链接==>向数据库发送SQL语句==>操作处理返回的结果
用于JDBC编程的类
- Java.sql.*:提供用于访问和处理存储在数据源中数据的API,包含不同驱动进行数据库访问方法的框架设计
- Javax.sql.*:提供在程序中访问和处理数据源的API该包中类实现了
Java.sql
包
链接数据库实现步骤
- 将数据库驱动
jar
包导入到项目中 - 导入必须的类
Java.sql.DriverManager;Java.sql.Connection
- 加载驱动
- 创建链接
在程序中加载驱动
- 使用
Class.forName();
方法加载
创建数据库的链接
static Connection getConnection(String url,String user,String password);
- 连接到指定
URL
的数据库,user
用户名,password
密码
JDBC URL的标准语法
jdbc:sqlserver://127.0.0.1:1433;DatabaseName=demodb
<protocol>:<subprotocol>:<data sourceinfo>
- 主要通讯协议:次要通讯协议,即驱动程序的名字:数据来源
执行SQL操作
- 可以通过调用
Connection
对象的createStatement()
方法来建立一个新的陈述对象 Statement stat = conn.createStatement();
stat.execute("create table Emp(ename varchar(20))");
在数据库中建立一张表
stat.execute("insert into emp values('张三')");
在数据库中插入一条记录
ResultSet result = stat.executeQuery("select * from emp");
查询记录
- 查询出来的记录都在
ResultSet
结果集中 - 结果集中包含一个游标(指针),默认指向第一条记录上(下标从1开始,而不是0),游标可以向下移动来获取数据
String ename = getString(1);
十一、JDBC编程(下)
-
PreparedStatement
接口 -
PreparedStatement
对象可以执行已经预编译的sql
语句,其sql
执行效率比Statement
的执行效率更高 - 可以在执行过程中向该对象中的
sql
语句传递参数 - 对于
sql
中每个输入参数都保留一个问号"?"
作为占位符 - 每个占位符的值必须在该语句执行前赋值
-
PreparedStatement
是通过继承Statement
实现的
创建PreparedStatement
对象
String slq = "update emp set ename = ? where eid = ?";
PreparedStatement ps = con.PreparedStatement(sql);
传递参数
- 执行
PreparedStatement
对象之前要为每个?
赋值 - 调用
PreparedStatement
对象的Set...()
方法来完成 - 参数的下标从
1
开始,而不是0,和sql
语句中的?
一一对应 ps.setString(1,"张三");
ps.setInt(2,1);
执行语句
ps.executeUpdate();
ps.executeQuery
- 在
ps
中设置的sql
语句没有被其他sql
语句覆盖的话,可以反复执行 - 传递另一个
sql
语句给同一个陈述对象,则新的sql
语句覆盖已经存在的sql
语句ps.con.prepareStatement(sql2);
- 清除
PreparedStatement
对象中的sql
语句con.clearParameters();