新手学java大纲
复习大纲
第一部分: java面向对象编程
1. Java面向对象的基本概念及运行机制
1). JAVA语言是一种纯的面向对象的语言.
2). 面向对象的程序
思想是: 尽量使计算机语言中对事物的描述与实标相符 3). Java语言的最大特点就是可以在任何平台上运行, 主要原因是由于java虚拟机(JVM)的运行机制,
, 将class文件(字节码文件)解释成不同的操作系统所能够识别的语言.
2. Java的运行环境搭建
1). 要运行Java程序,必须安装JDK。JDK是整个Java的核心,其中包括了Java编译器、JVM、大量的Java
工具以及Java基础API。
2). 可以从下载JDK,
3). 需要配置两个环境变量:
, path: 搜索外部命令所用到的路径
, classpath: 类路径
新建classpath :
变量值:
.;C:\Program Files\Java\jdk1.5.0_08\lib;
4). JDK的几个重要的命令
, Java执行工具: 是启动JVM(虚拟机)并执行class(BYTE CODE)文件的命令
, Javac 编译器: 由.java文件生成.class文件
, Javadoc 文档生成器: 生成帮助文档所用到的命令.
3. java的注释,
符, 关键字, 数据类型
1). JAVA中的注释:
// 单行注释
/*多行注释*/
/**文档注释*/ [说明: 利用javadoc命令生成帮助文档的注释] 2). 标识符:
组成: 字母, 数字, 下划线, 美元符号, 而且数字不能开头. 3). 关键字:
, 定义: 在java中被用作特殊用途的一些单词.
, 但是null, true, false在JAVA中也被用作特殊用途, 但不属于JAVA中的关键字
, goto 和const是JAVA中的保留关键字
, 关键字的特点: 都是小写的.
1). JAVA的数据类型分成两大类:
, 基本数据类型:
整数类型:
77 byte: 占据1个字节, 数据取值范围 (-2 ~ 2-1)
1515 short: 占据2个字节, 数据取值范围 (-2 ~ 2-1)
3131 int: 占据4个字节, 数据取值范围 (-2 ~ 2-1)
6363 long: 占据8个字节, 数据取值范围 (-2 ~ 2-1)
注意: 整数类型的默认类型是int类型, 在定义long类型数据的时候在数据的后面加上l/L
浮点类型:
float (单精度类型): 占据4个字节
double(双精度类型): 占据8个字节
1 / 42
复习大纲
注意: 浮点类型的默认类型是double类型, 在定义float类型数据的时候在数据的后面加上f/F
字符类型:
16 char: 占据2个字节, 数据取值范围 (0 ~ 65535) 或者是 (0 ~ 2-1)
注意: Java使用的是Unicode字符, 每个字符在Unicode表中都有所对应的位置, 所以char类型可以
和
数值类型进行互转.
布尔类型:
boolean: 值只有true和false
, 引用数据类型:
数组, 类, 接口
4. java 的流程控制语句
分支语句:
if 语句:
语法格式: 程序举例: 判断一个数是不是偶数.
if(boolean类型表达式){ public class Test
语句或语句块; {
}else{ public static void main(String[] args)
语句或语句块; {
} int n = 10;
if(n % 2 == 0){
System.out.println("是偶数");
}else{
System.out.println("不是偶数");
}
}
}
switch 语句:
语法格式: 程序举例: 判断给定的成绩属于哪一个层次. switch (表达式){ public class Test
case 常量值1: {
若干个语句 public static void main(String[] args)
break; {
case 常量值2: int n = 85;
若干个语句 switch(n>100 || n<0 ? -1 : n/10){
case 10: System.out.println("满分"); break; break……
case 常量值n: case 9: System.out.println("优秀"); break;
若干个语句 case 8: System.out.println("良好"); break;
case 7: System.out.println("中等"); break; break;
case 6: System.out.println("及格"); break; default:
若干个语句 case -1: System.out.println("输入不合法"); break;
default: System.out.println("不及格"); break; }
}
}
}
2 / 42
复习大纲
循环语句:
for语句:
语法格式: 程序举例: 求100以内数的和.for(初始化部分; 条件部分; 迭加部分){ public class ForLoop{
处理语句; public static void main(String args[]){ } int result = 0;
for (int i = 1; i <= 100; i ++){
result += i;
} System. out. println(“result =“ + result);
}
}
while循环语句:
语法格式: 程序举例: 求100以内数的和. [初始化部分] public class WhileLoop{ while (条件部分){ public static void main(String args[]){
处理语句; int result = 0;
[迭加部分; ] int i = 1;
} while(i <= 100){
result += i;
i ++;
}
System.out.println(“result = ”+ result);
}
}
do_while 循环语句:
语法格式: 程序举例: 求100以内数的和. [初始化部分] public class WhileLoop{ do{ public static void main(String args[]){
处理语句; int result = 0;
[迭加部分;] int i = 1; }while(条件部分); do {
result += i;
i ++;
} while(i <= 100);
System.out.println(“result = ”+ result);
}
}
3 / 42
复习大纲
跳转语句:
break: 跳出当前所在的循环体
程序举例: 程序的运行结果是:
public class Test
{
public static void main(String[] args)
{
for(int i = 0; i<=3; i++){
for(int j = 0; j<=3; j++){
if(i == j){
break;
}
System.out.print("i=" + i + "\t" +
"j=" + j + "\t");
}
System.out.println();
}
}
}
continue: 结束本次循环, 进行下一次的循环 程序举例: 程序的运行结果:
public class Test
{
public static void main(String[] args)
{
for(int i = 0; i<=3; i++){
for(int j = 0; j<=3; j++){
if(i == j){
continue;
}
System.out.print("i=" + i + "\t" + "j=" + j + "\t");
}
System.out.println();
}
}
}
4 / 42
复习大纲
return: 跳出方法体
程序举例: 程序的运行结果是:
public class Test
{
public static void main(String[] args)
{
for(int i = 0; i<=3; i++){
for(int j = 0; j<=3; j++){
if(i == j){
return;
}
System.out.print("i=" + i + "\t" + "j=" + j + "\t");
}
System.out.println();
}
}
}
5. java中的数组定义及使用
1). 数组的定义: 数组是相同类型的数据按顺序组成的一种复合数据类型。
2). 一维数组:
, 声明数组:
语法格式:
类型[] 数组名称;
类型 数组名称[];
举例: int[] arr;
说明: 数组只是声明出来了, 在内存中呈现的方式只是一个引用, 并不能被使用.
参看内存图: 该引用的默认初始值是null [即引用数据类型的默认初始值是null]
我们需要产生数组的真正实例,在内存中分配一个内存空间存放数组中的元素. 即通过new关键来创建数组
, 创建数组
语法格式:
数组名称 = new 类型[元素个数];
举例:
arr = new int[5];
5 / 42
复习大纲
参看内存图:
除了用new 关键字来产生数组外, 我们还可以直接以指定初始值的方式来产生数组.
, 数组的直接声明初始化:
举例:
int arr[] = {1, 4, 3, 6};
3). 关于一维数组的程序示例:
示例1: 查看数组中的元素
程序的运行结果: public class Test
{
public static void main(String[] args)
{
int arr[] = {2, 5, 3, 1};
for(int i =0; i
]class<类名>{
[<属性声明>]
[<构造器声明>]
[<方法声明>]
}
, 说明:
a) 修饰访问控制符有public, default(默认不写)
b) 类名必须满足标识符的命名规则, 而且按照编码, 类名的首字母大写.
, 举例:
public class Animal {
…
}
3). 属性定义的格式:
, 语法格式:
[<修饰符>] 类型 <属性名> [=初值]
, 说明:
a) 修饰访问控制符有public, default(默认不写), protected, private
b) 属性名必须满足标识符的命名规则, 而且按照编码规范, 属性名称字母小写, 如果含有多个单词, 第
二个单词以后的单词首字母大小. 如 int tempNum = 1; , 举例:
public class Animal{
public int legs;
…
}
4). 声明方法的格式:
, 语法格式:
<修饰符><返回类型><方法名>([<参数表>]){
[<语句>]
}
, 说明:
a) 修饰访问控制符有public, default(默认不写), protected, private
b) 方法名必须满足标识符的命名规则, 而且按照编码规范, 方法名称字母小写, 如果含有多个单词, 第
二个单词以后的单词首字母大小.
c) 方法的返回类型:
9 / 42
复习大纲
void: 没有返回值
非void: 有返回值
, 举例:
public class Animal {
public int legs;
public String eat(){
return “banana”;
}
public void move(){
System.out.println(“Moving.”);
}
}
5). 构造方法:
, 语法格式:
<修饰符><类名>([<参数表>]){
[<语句>]
}
, 举例:
public class Person{
int age;
public Person(){
}
public Person(int i){
age = i;
}
}
, 构造方法是一种特殊的方法,与一般的方法不同是:
1. 构造方法的名字必须与定义他的类名完全相同,没有返回类型。
2. 构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进
行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。
3. 构造方法在创建对象时自动执行, 一般不能显式地直接调用.
6). 实例化
, 第一步:对象的声明:
a). 一般格式为:
类的名字 对象的名字;
b). 举例说:
People ZhangSan;
参看内存图: 对象的声明只是在内存中产生了一个对象的引用, 它所存放的并不是一个真正的对象实例.
10 / 42
复习大纲
, 第二步:为声明的对象分配内存
使用new 关键字和类的构造方法为声明的对象分配内存,如果类中没有构造方法,系统会调用默认的构造
方法(默认的构造方法是无参数的,你一定还记得构造方法的名字必须和类名相同的这一)
a). 一般格式是:
对象的名字=new 类的构造方法;
b). 举例说:
ZhangSan = new People ();
参看内存图: 从图上可以看到, 对象的引用所存放的是, 对象实例真正在内存中的地址, 每个对象引用占用4个字节的内存空间, 所以能看到如图中16进制的表示形式.
, 我们通常习惯上把对象的的声明和产生对象的实例写在同一个语句之中:
People p1 = new People();
People p2 = new People();
People p3 = p1;
参看内存图:
11 / 42
复习大纲
, JAVA 中变量的分类:
1). 按所属的数据类型划分
, 基本数据类型变量
, 引用数据类型变量
2). 按被声明的位置划分
, 局部变量:方法或者语句块内部定义的变量
, 成员变量:方法外部类的内部定义的变量
3). 按是否由static关键字来修饰分为:
, 类变量(静态变量): 由static修饰的变量
, 实例变量: 不是由static修饰的变量
, 同理static还可以修饰方法:
1). 由static修饰的方法叫做类方法(静态方法)
2). 不是由static修饰的方法叫做实例方法.
3). 类变量和类方法的使用:
, 可以用对象去调用,也可以直接由类名调用。
4). 类变量和类方法是与类相关联的,是类共享的一块区域。
程序举例:
public class A{
int x ;
int y;
static int z;
void f(){}
public static void main(String args[]){
A a1 = new A();
A a2 = new A();
}
}
5). 方法之间的访问规则
, 实例方法:可以直接访问实例方法,类方法,实例类量和类变量。
12 / 42
复习大纲
, 类方法:可以直接访问类方法和类变量;不能直接访问实例变量和实例方法,只能通过实例对象访问实
例变量和实例方法。
7. java的面向对象的三大基本特征: 封装, 继承, 多态(super)
1). 封装:
引例:
class People{
String name;
int age;
}
public class Test{
public static void main(String args[]){
People zhangsan = new People();
zhangsan.age = -20;
System.out.println(zhangsan.age);
}
}
说明:对于年龄不可能为负数。
对于其它的类来直接操作类的属性,而导致数据的错误,不安全性等原因,而引入的封装。
封装的作用:
Java中通过将数据声明为私有的(private), 再提供公开的(public)方法: getXXX和setXXX实现对该属性的操
作,以实现下述目的:
隐藏一个类的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作。
便于修改,增强代码的可维护性;
程序举例:
class People{
String name;
private int age;
public void setAge(int n){
if(n < 0 || n>150){
System.out.println("输入的是非法的年龄");
}else{
age = n;
}
}
public int getAge(){
return age;
}
}
public class Test{
public static void main(String args[]){
13 / 42
复习大纲
People zhangsan = new People();
zhangsan.setAge(-20);
System.out.println(zhangsan.getAge());
}
}
2). 继承
, 什么是继承,
是一种由已有的类创建新类的机制。 , 作用:实现代码重用
, 实现继承的语法格式:
class Father{}
class Son extends Father{}
子类:Son
父类(超类):Father
特别说明:Object是所有类的根父类(超类)。
举例:
class A {}
等价于:class A extends Object{}
, 子类可以继承父类什么样的属性和方法,
a). 子类无法继承到父类由 private修饰的属性或方法
b). 四种修饰符的作用域范围:
private: 一个类
default(默认不写): 一个包中的不同类
protected: 同一包中的类可以访问,在不同包中可以被子类访问
public: 所有类
c)包: package
a. 包名称是小写的,满足标识符的命名规则
b. 第一条语句
import :引入
程序举例:
package t3;
import t2.T1;
public class T2 {
public static void main(String[] args) {
T1 t = new T1();
System.out.println(t.num);
}
}
d). 在不同包中,子类无法继承父类由default修饰的属性或方法
程序举例:
父类:
public class People {
14 / 42
复习大纲
String name;
int age;
char sex;
public void work(){
System.out.println("working");
}
}
子类:
public class Student extends People{
String stuid;
public void study(){
System.out.println("studying");
}
}
测试类:
public class T1 {
public static void main(String[] args) {
Student s = new Student();
s.work();
s.study();
}
}
e). 方法的重写(覆盖):
子类重写父类中的方法
规则:方法名称相同,方法的返回类型相同,方法的参数列表相同
注意:子类的修饰符的访问权限要大于等于父类的修饰符的访问权限
修饰符的访问权限从小到大依次是:
private --, default ---, protected ---- > public
举例:
父类
public class People {
String name;
int age;
char sex;
void work(){
System.out.println("working");
}
}
子类
public class Student extends People{
String stuid;
public void work(){
System.out.println("studying");
15 / 42
复习大纲
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.work();
}
}
f). 验证父类的方法是否被子类给覆盖了:
虚拟调用:
举例:
父类
public class People {
String name;
int age;
char sex;
void work(){
System.out.println("working");
}
}
子类
public class Student extends People{
String stuid = "0001";
public void work(){
System.out.println("studying");
}
}
测试类:
public class Test {
public static void main(String[] args) {
People p = new Student();
p.work();
}
}
f). super: 可以通过此关键字,调用父类的属性或方法
举例:
父类:
public class People {
String name = "zhangsan";
int age;
char sex;
16 / 42
复习大纲
void work(){
System.out.println("working");
}
}
子类:
public class Student extends People{
String stuid = "0001";
String name = "zhangsi";
public void work(){
System.out.println(super.name);
}
}
super的第二个用途:
在子类的构造方法中,含有一条默认的调用父类不带参数的构造方法的super()语句。
super()语句是构造方法中的第一条语句。 举例:
父类:
public class People {
String name = "zhangsan";
int age;
char sex;
public People(){
System.out.println("people");
}
public People(int n){
System.out.println(n);
}
void work(){
System.out.println("working");
}
}
子类:
public class Student extends People{
String stuid = "0001";
String name = "zhangsi";
public Student(){
super(9);
}
public Student(int n){
System.out.println(n);
}
public void work(){
System.out.println(super.name);
}
17 / 42
复习大纲
}
测试类:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
g). this关键字:
1. 指代对象本身.
2. 访问本类的成员变量或方法
, this.<变量名>
, this.<方法名>
程序举例:
public class Test{
public void method(){
this.method1();
}
public void method1(){
}
}
注意:这种情况下的this可省略不写。
3. 当成员变量和局部变量同名时,用this.方式来代表成员变量
例如:
class A{
int a = 0;
public A(int a){
this.a = a;
}
}
4. 调用本类的构造方法。
程序举例:
public class Test{
public Test(){
}
public Test(int a){
this();
}
}
注意:this();语句作为构造方法中的第一条语句。
注意:this关键字不能用在静态方法中。
3). 多态:
在JAVA中主要体现在两个方面: 方法的重写和重载
重写: 子类重写父类的方法.
重载:
18 / 42
复习大纲
a). 定义:
一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同(参数的个数,类型,顺序不同)。
b). 目的:根据参数不同,实现不同的功能。
程序举例:
构造方法重载: 方法的重载:
public class Test public class Test
{ {
int n; public int method(int n1, int n2){
public Test(){ return n1 + n2;
n = 10; }
} public double method(double n1, double n2){
public Test(int n){ return n1 + n2;
this.n = n; }
} }
}
8. 抽象类和接口
1). 抽象类:
, 如果类中有一个没有实现细节的方法,此方法被称为抽象方法。语法为:
, [访问控制符] abstract 返回类型 方法名 (参数列表)
, 例如: abstract void g();
, 同样,如果类前有关键字abstract修饰,则此类称为抽象类。 , 抽象类的语法为:
public abstract class 类名
{
……
}
, 有关抽象类的规则
一个抽象类不能被实例化,必须由子类去实例化;
抽象类中可以有带方法体的方法。
当子类继承抽象类时,必须实现抽象方法。
程序举例:
abstract class A{
void f(){
System.out.println();
}
abstract int g();
}
class B extends A{
int g(){
return 1;
}
}
2). 接口:
19 / 42
复习大纲
, 定义:
如果抽象类中没有包含任何抽象方法,则此抽象类中的所有方法都是缺省实现。如果一个抽象类完全没有
实现细节,则称为接口。接口的所有方法都是抽象方法。
所以抽象类是类的一种特殊形式,接口是抽象类的一种特殊形式。
, 接口的语法为:
[public] interface 类名
{
抽象方法声明和常量声明
}
, 有关接口的使用规则
接口中的变量是常量。不管有没有显示的修饰符,变量都由public static final来修饰。
例如:interface A{
int i=3; //public static final int i=3;
}
, 说一下: final关键字
1) final可以修饰类,此类不能被继承。
例如:
final class A{}
class B extends A{}// error
2) final可以修饰方法,此方法不能被重写。
例如:
class A{
final void f(){}
}
class B extends A{
void f(){} //error
}
3) final修饰的变量是常量
例如:final int i=50; final double PI=3.1415926;
, 接口中的方法都是抽象方法(只能有方法的声明,不能有方法体)。
例如:interface A{
void f();
}
, 如果一个类实现了某个接口,那么这个类必须实现该接口的所有抽象方法,即为这些方法提供方法体。(注:
接口中的方法被默认是public的,所以类在实现接口方法时,一定要用public 来修饰。)
例如:interface A{
void f();
}
class B implements A{
public void f(){
方法体
}
}
9. java的访问控制符(public, protected, default, private) 以及package, import语句
20 / 42
复习大纲
1). 可以对Java类中定义的属性和方法进行访问控制—规定不同的保护等级:
, public , protected, default, private
2).package语句:
在使用同名的类时,我们必须将它们放在不同的包内,在类名前面加上包名。包中的类可不是随便组合的,我
们一般将相关的类放在同一个包内,以方便我们的使用和管理。
, 包的声明语法为:
package 包名 ;
, 作用:指明该源文件定义的类所在的包。
, 位置:Java源文件的第一条语句。
3). import语句:
, 在一个包中使用另外一个包中的类时,应该用import声明:
import 包名[.包名.…包名].类名
如果要使用该包的全部类,这样的写法未免太费力了。幸亏Java允许使用通配符*,即:
import 包名[.包名.…].*
, 备注:包名一般用小写。
, 作用:可以使用import语句来引入所需要的类。
, 位置:必须写在package语句和源文件中类的定义之间。
注意:
1). Java中提供了大约60个包。Java API的类被组织成8个包:java.applet, java.awt, java.awt.image,
java.lang, java.io, java.net, java.util
2). 系统自动引入java.lang包,因此不需要再使用import语句引入该包。
10. 系统常用类String, StringBuffer/StringBuilder
String和动态字符串(StringBuffer/StringBuilder)的区别:
String定义的字符串内容是固定不变的,一但对它改变,就变成了另外的一个字符串了,
如果在程序中对一个字符串频繁的改变的话,建议把它定义成StringBuffer/StringBuilder类型
String类中的常用方法:
1). charAt() : 返回指定索引处的字符
举例:
String s = “helloworld”;
char c = s.charAt(2);
System.out.println(c);
//输出: l
21 / 42
复习大纲
2). indexOf(): 查找指定字符首次出现的位置
举例:
String s = “helloworld”;
int n = s.indexOf(“w”);
System.out.println(n);
//输出: 5
3).
substring(int beginIndex) : substring(int beginIndex, int endIndex):
从指定索引的位置开始一直截取到字符串的尾部 从指定索引的位置开始到结束索引之间的字符
举例: 举例:
String s = “helloworld”; String s = “helloworld”;
String str = s.substring(5); String str = s.substring(5, 7);
System.out.println(str); System.out.println(str);
//输出: world //输出: wo
4). toUpperCase(): 将字符串中所有字母都变成大写的
举例:
String s = “helloworld”;
String str = s.toUpperCase();
System.out.println(str);
//输出: HELLOWORLD
5). toLowerCase(): 将字符串中所有字母都变成小写的
举例:
String s = “HELLOWORLD”;
String str = s. toLowerCase();
System.out.println(str);
//输出: helloworld
6). length(): 求字符串长度的方法
举例:
String s = “HELLOWORLD”;
int n = s. length();
System.out.println(n);
//输出: 10
7). valueOf(): 将其它数据类型转化成字符串类型的方法
举例:
int s =123;
String str = String.valueOf(s);
System.out.println(str);
//输出: 123
8). equals(): 比较两个字符串的内容是否相同
StringBuilder/StringBuffer类的常用方法
append(): 追加
举例:
22 / 42
复习大纲
StringBuilder sb = new StringBuilder(“abc”);
sb.append(“de”);
System.out.println(sb);
//输出: abcde
11. Java中异常处理及自定义异常
, 异常概念:
JAVA 程序运行过程中所产生的非预期的情况.
例如:
文件没找到 , 内存溢出
, 异常类型:
分为: Error类和 Exception类, 它们均为 Throwable类的子类. Throwable类是异常类的始祖.
a) Error类:
一般不需要用户处理,如:内存溢出,虚拟机错误等.
b) Exception类:
因编程错误或偶然的外在因素导致的一般性错误,如:文件找不到,空指针访问等.
因编程错误:
1. NullPointerException
2. ArithmeticException
3. IndexOutOfBoundsException
偶然的外在因素导致
IOException
异常的处理
, 异常处理语句结构:
, try-catch-finally
, 基本格式为:
try
{
语句体
}
catch( 异常错误类型 变量名 )
{
语句体
}
finally
{
语句体
}
程序举例:
程序的运行情况: public class Test{
如果命令行输入0 public static void main(String args[]){
try{
int i = Integer.parseInt(args[0]);
int ans = 10/i;
}catch(ArithmeticException ae){
23 / 42
复习大纲
System.err.println(“除数不能为零”); 如果命令行输入的不是数字
} catch(NumberFormatException ne){
System.err.println(“必须输入数字”);
}
} }
, 打印异常信息的方法
, toString()方法:
就会自动帮我们我们打印异常信息的时候,最常用的就是把e对象用System.out.println()方法去处理,它
调用toString()方法. 它会显示异常的类名称和产生异常的原因.
, getMessage(): 获得详细信息
, 会显示异常发生的原因,但不像toString()方法, 这个方法并不会把异常名称显示出来.
, printStackTrace方法
, 这个方法会把产生这个异常的相关类名称以及是第几行程序代码产生这个异常的通通显示出来.
, 异常处理关键字: (throws, throw)
1). throws
在有些情况下,程序并不需要使用try-catch-finally处理它所生成的异常,而是由调用它的方法来处
理
这些异常,这时就要用到throws 子句,它包含在方法的声明中。
, 其格式如下:
返回类型 方法名( 参数 ) throws 异常类名
{
语句体
}
其中,异常类名可以是多个,但需要用逗号隔开。
2). throw
必须放在方法内使用.
, 其格式如下:
throw <异常类对象>
如: throw e;
throw new Exception();
, 自定义异常类:
用户自定义的异常类必须继承现有的异常类.在JAVA程序开发中,自定义异常类是必不可少的.方便开发者体
现出程序中出现的异常信息.
程序举例:
自定义的异常类: throw与throws关键字的使用: class MyException extends class Test
Exception {
{ public void method(String args[])throws MyException{
public MyException(String s){ char c[] = args[0].toCharArray();
super(s); for(char ch : c){
} if(ch >='0' && ch <= '9'){
24 / 42
复习大纲
throw new MyException("不能传入数字!!"); }
}else{
System.out.print(ch);
}
}
}
public static void main(String[] args)
{
Test t = new Test();
try{
t.method(args);
}catch(MyException ex){
//System.out.println(ex);
ex.getMessage();
}
}
}
12. Java中垃圾回收概念
什么是无用对象
程序流程已经超出了对象的作用范围。
当发现某对象变成无用对象时,就将该对象列入待回收列表中。但是,并不是马上予以销毁 System.gc()运行的时机
系统需要回收时运行
程序中显式的调用System.gc(),但是该调用也并不能保证立刻就回收内存。 每个对象都有finalize()方法。在垃圾回收之前该方法被调用。
第二部分: java程序设计与开发
1. JavaSwing基础(容器、组件、布局、事件)
, 常用类:
容器: JFrame, JPanel, JDialog
组件: JButton, JLabel, JTextField, JTable, JPasswordField
布局: FlowLayout, BorderLayout, GridLayout
事件: ActionListener
, 程序示例说明:
窗体类:javax.swing.JFrame
窗体默认的布局是:边界布局
常用方法:
1. 设置窗体大小的方法 setSize(int width, int height)
2. 设置窗体可见性的方法 setVisible(boolean b);
3. 设置窗体布局的方法:setLayout(LayoutManager manager)
4. 常用的布局管理器有:
流式布局:FlowLayout
25 / 42
复习大纲
程序举例:
import java.awt.*;
import javax.swing.*;
public class TestFrame extends JFrame{
public TestFrame(){
setLayout(new FlowLayout());
JLabel lab = new JLabel("用户名:");
JTextField txt = new JTextField(10);
JButton btn = new JButton("登陆");
add(lab);
add(txt);
add(btn);
setSize(200,200);
setVisible(true);
}
public static void main(String args[]){
new TestFrame();
}
}
边界布局:BorderLayout
程序举例:
import javax.swing.*;
import java.awt.*;
public class TestBorderLayout extends JFrame{
public TestBorderLayout(){
setLayout(new BorderLayout());
JButton b1 = new JButton("1");
26 / 42
复习大纲
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
add(b1,BorderLayout.SOUTH);
add(b2,BorderLayout.NORTH);
add(b3,BorderLayout.CENTER);
add(b4,BorderLayout.WEST);
add(b5,BorderLayout.EAST);
setSize(400,400);
setVisible(true);
}
public static void main(String[] args) {
new TestBorderLayout();
}
}
网格布局:GridLayout
程序举例:
import javax.swing.*;
import java.awt.*;
public class TestLayout extends JFrame{
public TestLayout(){
setLayout(new GridLayout(2, 3));
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
setSize(400,400);
setVisible(true);
27 / 42
复习大纲
}
public static void main(String[] args) {
new TestLayout();
}
}
4. 向窗体中添加组件的方法:add();
5. 调整布局的面板: JPanel
JPanel默认的布局:流式布局
程序举例:
import javax.swing.*;
import java.awt.*;
public class TextLayout extends JFrame{
public TextLayout(){
setLayout(new GridLayout(4,1));
JLabel lab=new JLabel("用户名:");
JTextField t=new JTextField("请输入您的姓名");
JLabel lab2=new JLabel("密码:");
JTextField t2=new JTextField("请输入您的密码");
JButton btn=new JButton("登陆");
JButton btn2=new JButton("取消");
JPanel p1 = new JPanel();
p1.add(lab);
p1.add(t);
JPanel p2 = new JPanel();
p2.add(lab2);
p2.add(t2);
JPanel p3 = new JPanel();
p3.add(btn);
p3.add(btn2);
add(p1);
add(p2);
add(p3);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new TextLayout();
}
}
2. Java 中数据库连接及数据库访问(JDBC、Jtable、数据库小应用)
28 / 42
复习大纲
3. Java中的IO(控制台输入输出、字符及字节流、缓冲流、File类)
, 关于这些流的类都在java.io包下
, 输入输出流分为两种类型:
字节流:
InputStream:
FileInputStream
OutputStream:
FileOutputStream: 字符流:
Reader
FileReader [文件输入流]
BufferedReader [缓冲流]
Writer:
FileWriter [文件输出流]
BufferedWriter [缓冲流]
, 字节流:
File类: 文件处理的类
FileInputStream(文件输入流):
读取本地文件信息的程序举例:
FileOutputStream: (文件输出流)
向本地文件中写入信息的程序举例:
package t;
import java.io.*;
public class CopyFile {
public void method(){
File f = new File("E:\\1.jpg");
File f1 = new File("F:\\1.jpg");
FileInputStream in = null;
FileOutputStream out = null;
try{
//用文件字节流读取文件
in = new FileInputStream(f);
//定义存储读取信息的字节数组
byte b[] = new byte[in.available()];
//将读取的信息内容放到字节数组中
in.read(b);
29 / 42
复习大纲
//用文件输出流将刚读取到的信息内容写到指定的目的地
out = new FileOutputStream(f1);
//将字节数组中的信息内容写到指定的目的地
out.write(b);
}catch(IOException ex){
System.err.println(ex.getMessage());
}finally{
try{
if(in!=null){
in.close();
}
if(out!=null){
out.close();
}
}catch(IOException ex){
}
}
}
public static void main(String[] args) {
CopyFile cf = new CopyFile();
cf.method();
}
}
, 字符流:
Reader:
FileReader
Writer:
FileWriter
缓冲流: BufferedReader/BufferedWriter
程序举例: [读取和写入的处理]
import java.io.*;
public class Test4 {
File f = new File("resource\\NewUser.java");
/**
* 读取信息
*/
public void readerMethod(){
FileReader reader = null;
BufferedReader buff = null;
30 / 42
复习大纲
try{
reader = new FileReader(f);
buff = new BufferedReader(reader);
String str = null;
while((str = buff.readLine())!= null){
System.out.println(str);
}
}catch(IOException ex){
System.out.println(ex);
}finally{
try{
if (buff!=null) buff.close();
if(reader!=null) reader.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}
/**
* 写入的方法
*/
public void writeMethod(){
FileWriter fw = null;
BufferedWriter bw = null;
try{
fw = new FileWriter(f);
bw = new BufferedWriter(fw);
bw.write("hello");
bw.flush();
}catch(Exception ex){
}finally{
try{
if (bw!=null) bw.close();
if (fw!=null) fw.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}
public static void main(String[] args) {
//new Test4().readerMethod();
new Test4().writeMethod();
}
}
31 / 42
复习大纲
4. Java中网络编程(计算机网络连接、Socket/ServerSocket、数据传送) 1) Internet上最基本的通信方式都是用套接字socket实现的. 2) 通过编程需要对服务器端和客户端分别编写相应的程序,故java有两种类型的socket:
, 一种是客户端套接字,用socket 类表示;
, 一种是服务器端套接字,用ServerSocket. 类表示。 , 服务器端的ServerSocket.都有一个端口号,以便标识一个服务器进程。客户端通过”呼叫” 服务器,进
而彼此握手通信。当呼叫成功后,任何一方都可以随时可以讲话。 , InetAddress : 此类表示互联网 (IP) 地址。
public static InetAddress getLocalHost()
throws UnknownHostException
返回本地主机。
数据输入流:
DataInputStream (InputStream in) 使用指定的基础 InputStream 创建一个 。
DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。
3) 示例程序
客户端程序:
import java.io.*;
import java.net.*;
public class TestClient {
Socket s = null;
/**
* 获取ip地址的方法
*/
public String getIp(){
String ip = null;
try{
InetAddress id = InetAddress.getLocalHost();
ip = id.getHostAddress();
}catch(Exception ex){
ex.printStackTrace();
}
32 / 42
复习大纲
return ip;
}
/**
* 网络通信的方法
*/
public void method(){
DataInputStream in = null;
DataOutputStream out = null;
try{
s = new Socket(getIp(),6535);
System.out.println("客户端准备发出信息....");
in = new DataInputStream(s.getInputStream());
out = new DataOutputStream(s.getOutputStream());
out.writeUTF("hello 服务器!!");
while(true){
String str = in.readUTF();
System.out.println("服务器端回复的信息是:" + str);
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
if (in != null) in.close();
if (out!= null) out.close();
if (s != null) s.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
new TestClient().method();
}
}
服务器端程序:
import java.io.*;
import java.net.*;
public class TestServer {
ServerSocket ss = null;
Socket socket = null;
public void method(){
DataInputStream in = null;
DataOutputStream out = null;
try{
ss = new ServerSocket(6535);
33 / 42
复习大纲
System.out.println("服务器端正在监听....");
socket = ss.accept();
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
out.writeUTF("你好, 客户端");
while(true){
String str = in.readUTF();
System.out.println("客户端发送的请求:" + str);
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
if (in!=null)in.close();
if(out!=null)out.close();
if(socket!=null) socket.close();
if(ss!=null) ss.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
new TestServer().method();
}
}
5. Java中的线程(Thread类 及Runnable接口、线程同步及多线程)
, 线程的定义:
程序: 一段静态的代码
进程: 执行程序的过程, 从程序的加载, 程序的运行, 程序的结束,这样的一个过程
线程: 执行一段代码的过程. 也有开始和结束 一个进程中可以有多个线程
, 程序示例:
示例1: 单线程与多线程的比较
单线程程序举例: 程序的运行结果:
public class TestSingle {
public static void main(String[] args) {
TestRun tr = new TestRun();
tr.run();
while(true){
System.out.println("TestSingle");
}
}
34 / 42
复习大纲
}
class TestRun{
public void run(){
while(true){
System.out.println("TestRun..");
}
}
}
多线程程序举例: 程序的运行结果:
public class TestSingle {
public static void main(String[] args) {
TestRun tr = new TestRun();
tr.start();
while(true){
System.out.println("TestSingle");
}
}
}
class TestRun extends Thread{
public void run(){
while(true){
System.out.println("TestRun..");
}
}
}
, 怎么样实现多线程:
线程类常用方法:
public void start() : 启动线程
public void run() : 运行线程的主体
public static Thread currentThread()
返回对当前正在执行的线程对象的引用。
public final String getName()
返回该线程的名称。
public final void setPriority(int newPriority)
更改线程的优先级
static int MAX_PRIORITY
35 / 42
复习大纲
线程可以具有的最高优先级。 static int MIN_PRIORITY
线程可以具有的最低优先级。 static int NORM_PRIORITY
分配给线程的默认优先级。
public static void sleep(long millis) throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
实现多线程有两种方法:
第一种方式: 继承Thread
public class Thread1 {
public static void main(String[] args) {
MyThread t = new MyThread();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread implements Runnable{
int ticket = 100;
public void run(){
while(ticket>0){
System.out.println(Thread.currentThread().getName() + "正
在卖" + ticket--);
}
}
}
第二种方法: 实现Runnable
Thread(Runnable target)
public class Thread2 {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
MyThread t4 = new MyThread();
t1.start();
t2.start();
36 / 42
复习大纲
t3.start();
t4.start();
}
}
class MyThread extends Thread{
int ticket = 100;
public void run(){
while(ticket>0){
System.out.println(Thread.currentThread().getName() + "正
在卖" + ticket--);
}
}
}
两种方式:
第一种:继承Thread, 重写Thread类中的run()方法
第二种:实现Runnable接口, 实现了run()方法.
, 实现Runnable接口与继承Thread类的区别:
1. JAVA是支持单继承的, 如果一个类继承了Thread类, 就不可以再继承其它的类了, 所以更建议大
家采用实现Runnable接口的方式去实现多线程.
2. 实现共享资源时, 建议使用Runnable接口
, 对共享资源实现线程同步.
关键字: synchronized
实现线程同步有两种方式:
可以保护一段代码, 也可以保护一个方法
第一种方式:
synchronized (对象){}
对象: 任意一个对象
第二种方式:
修饰符 synchoronized 方法的返回类型 方法名称(参数列表){}
第一种方式举例:
public class ExtendThread {
public static void main(String[] args) {
MyThread t = new MyThread();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
37 / 42
复习大纲
t3.start();
t4.start();
}
}
class MyThread implements Runnable{
int ticket = 100;
public void run(){
while(ticket>0){
synchronized(this){
if(ticket>0)
System.out.println(Thread.currentThread().getName() + "正在卖" +
ticket--);
}
}
}
}
}
第二种方式举例:
public class Test {
public static void main(String[] args) {
MyThread t = new MyThread();
Thread t1 = new Thread(t, "第一个窗口");
Thread t2 = new Thread(t, "第二个窗口");
Thread t3 = new Thread(t, "第三个窗口");
Thread t4 = new Thread(t, "第四个窗口");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread implements Runnable{
int ticket = 100;
public void run(){
while(true){
method();
}
}
public synchronized void method(){
if(ticket>0){
System.out.println(Thread.currentThread().getName() + "正在卖" + ticket--);
}
38 / 42
复习大纲
}
}
, 解决线程死锁问题的处理:
1). 常用方法:
wait(): 让当前的线程等待
public final void wait()
throws InterruptedException
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
notify(): 唤醒等待池中等待的一个线程. (先进先出, 先到先服务的原则)
notifyAll();唤醒等待池中所有等待的线程.
注意: wait(), notify(), notifyAll()只能用在实现线程同步的方法当中.
2).程序举例: [了解]
public class Test7 {
public static void main(String[] args) {
MessageOption mq = new MessageOption();
ClientTest ct = new ClientTest(mq);
ServerTest st = new ServerTest(mq);
Thread t1 = new Thread(ct);
Thread t2 = new Thread(st);
t1.start();
t2.start();
}
}
class MessageOption{
String sex = "";
boolean isFull = false;
public synchronized void get(){
if(isFull==false){
try{
wait();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
System.out.println(sex);
isFull = false;
notify();
}
public synchronized void put(String sex){
if(isFull==true){
try{
wait();
}catch(InterruptedException ex){
39 / 42
复习大纲
ex.printStackTrace();
}
}
this.sex = sex;
isFull = true;
notify();
}
}
class ClientTest implements Runnable{
MessageOption mq;
int i = 0;
public ClientTest(MessageOption mq){
this.mq = mq;
}
public void run(){
while(true){
if(i == 0){
mq.put("男");
}else{
mq.put("女");
}
i = (i+1)%2;
}
}
}
class ServerTest implements Runnable{
MessageOption mq;
public ServerTest(MessageOption mq){
this.mq = mq;
}
public void run(){
while(true){
mq.get();
}
}
}
40 / 42