一、java的体系结构:
1、Java程序首先由编译器转换为标准字节代码,然后由虚拟机来解释执行
Applet是java的一类特殊应用程序,它潜入HTML中,可以实现多媒体的用户界面或复杂的计算,可以在浏览器上运行;
2、JDK的bin目录下由编译器、解释器等工具;lib目录下是库文件;jre目录是java程序运行环境的代码库;
3、java类库的核心是java包,javax扩展包,Org包
Java包包括:
(1)java.lang包,封装编程要用的基本类,包括Object、Class、System、Interger、Thread,是java程序默认引用的包
(2)java.awt包,封装抽象窗口工具包,提供构建和管理用户图形界面的功能
(3)java.applet包,为Applet提供执行所需要的所有类,主要是访问Applet内容的通信类
(4)java.io包,向程序提供文件输入输出操作的类
(5)java.util包,提供实用程序类和集合类,如日期方法、Arrays等;
Javax扩展包包括:
javax.swing包,提供构建和管理应用程序的图形界面的轻量级构件
4、package语句在java程序中最多有一个,且位于最首位,用于使文件存入指定包;
import语句在java程序中可以有任意个,必须在类定义之前;
源文件中最多只能有一个public类(公共类),且与源文件名相同;
5、JDK中的主要工具:
(1)javac.exe:java编译器,以.class为扩展名讲源代码译为字节码,并存入工作目录中,javac 文件名.java,其中,-d<目录>可以指定保存目录;
(2)java.exe:java解释器,执行字节码,java 类名 [程序参数];
(3)javadoc.exe:java文档生成器,对java源文件和包以MML格式产生AP文档,javadoc 包名或 javadoc 文件名;
(4)javap.exe:java类分解器,对.class文件提供字节代码的反汇编并打印,javap 类名
二、Java简单数据类型概论:
1、java变量、常量、对象和类的命名规则要求只能以字母、下划线、美元符作为首字母,不能用数字或其他字符为首字母;
2、java命名出了第一条的要求,还有一些命名约定:
(1)在声明类时,类名的首字母要求大写,并且类名要显示类的功能;构造函数与类名相同,所以构造函数的首字母要大写
(2)接口名第一个字母要大写,同(1);
(3)组成变量名各个单次的首字母要大写,但第一个单词的首字母要小写;
(4)常量名要完全大写;
(5)关键字均为小写;
3、java中所有数据类型的长度都是固定的,因此没有sizeof的保留字
4、对于浮点型数据,如果数字后没有“f”的符号,则默认为double型数据;
5、各个数据类型的数据范围
(1)byte:8字节,-2^8~2^8-1,-128~127;
(2)short:16字节,-2^16~2^16-1,-32768~32767;
(3)int:32字节,-2^32~2^32-1;
(4)long:64字节,-2^64~2^64-1;
(5)float:32字节,
(6)double:64字节,
(7)char:16字节,0~65535(注意这个)
6、不能将boolean型数据转化为其他基本数据类型
7、自动转换方向:位数少的数据类型向位数多的数据类型转换;
同时需要注意,字符型数据类型能向int数据类型自动转换,而字符串不可以
三、算术运算符
1、对于“+”号运算符,应当掌握:
(1)两个操作数全为整数时,只要有一个数是long型,结果就是long型;
两个数全是byte型或short型,表达式结果就是int型;
两个数是浮点型,只要有一个术士double型,结果就是double型,否则为float型
(2)“+”号在表示字符串连接的时,有两种情况:
“abc”+3输出结果为abc3
1+2+3+“abc”输出结果为6abc
2、移位运算符中:
(1)算术右移>>:低位舍弃,高位补入原来高位的数值
(2)算术左移<<:高位舍弃,低位补0
(3)逻辑右移>>>:低位舍弃,高位补0
3、运算符的优先级:算术运算符,位移运算符,关系运算符,位逻辑运算符,布尔逻辑运算符,条件运算符,赋值运算符
四、流程控制
1、switch(expression)中,expression只能是int、short、byte、char,注意不能是浮点型数据及字符串类型
五、类、数组和字符串操作
1、类是java中的基本结构单元,所有方法均在类中定义
2、包含main方法的主类必须是公共类
3、抽象类中必须至少包含一个抽象方法,有抽象方法的类必须声明为抽象类,如错题集的第6题
4、在方法内部,super代表对父类对象的引用,this代表对当前对象的引用,注意关键字都是小写,不能首字母大写
5、构造方法中只能使用成员变量,当参数与成员变量同名时,用关键字this指定当前对象
6、构造方法没有返回值(但不需要用void声明),不能认为调用,只能用new自动调用
7、接口是一种只含抽象方法或常量的一种特殊的抽象类,它不包含成员变量和方法实现,只包含常量和方法的定义;
注意:接口包含四类,第一类内部定义了抽象方法,第二类内部定义了常量,第三类内部定义了抽象方法和常量,第四类内部什么也没有,就是一个标志作用,例如Serializable接口时实现对象串行化的工具,是一个空接口。
8、类变量又称静态变量,用static修饰;在一个static方法内部,随时可以访问类中的static成员变量,但是要访问非static成员变量则必须寿险创建一个对象,然后通过对象访问实例变量,如错题集第7题;
9、java的内部类可以使用其所在类的静态成员变量和实例成员变量,也可以使用其所在类的方法中的局部变量
10、当基本数据类型的成员没有被初始化时,会获得一个默认初始值,如下表
11、java.util.ArrayList类是动态数组,是Array的复杂版本,在运行时能够动态地自动调整数组的大小,因此定义数组时不必限定数组的大小,在列表初始化时可以用add()方法对数组元素赋值;
12、java.lang.String用于处理长度不变的字符串;java.lang.StringBuffer用来处理长度变化的字符串;
六、异常处理
1、Throwable类是所有异常类的父类,分为Error和Exception两个子类;
2、throws关键字通常被应用在声明方法时,指定方法可能抛出的异常,多个异常用逗号隔开;
throw关键字通常用于方法体中,并明确抛出一个异常对象(见《从入门到精通》P224例12.8)
七、输入输出及文件操作
1、File类提供的方法:
(1)对文件名操作提供的方法:
①public String getName(),得到一个不包含路径的文件名;
②public String getParent(),得到文件的上一层目录;
③public String getPath(),得到文件路径名字符串,即路径文件名;
④public String[] list(),返回一个字符串数组,是此文件所在目录下的所有文件名列表;
⑤public String renameTo(File newName),返回重命名后的文件名;
⑥public String getAbsolutePath(),返回一个文件的绝对路径名;
⑦public File getParentFile(),得到文件对象的父路径名;
(2)测试文件属性操作所提供的方法:
①public Boolean isAbsolute(),测定是否是绝对路径,返回布尔值;
②public Boolean isDirectory(),测定是否是目录;
③public Boolean exists(),测定文件是否存在;
④public Boolean canRead(),测定是否是可读文件;
⑤public Boolean canWrite(),测定是否是可写文件;
(3)为文件信息操作和工具所提供的方法:
①public long length(),返回文件的字节长度;
②public long lastModified(),返回文件最后修改时间;
(4)为目录操作所提供的方法:
①public Boolean mkdir(),创建目录;
②public Boolean mkdirs(),创建包含父目录的目录;
③public String[] list(),返回当前目录下的文件
2、随机文件流RandomAccessFile类,直接继承Object类,兼有输入和输出功能,即同时实现了DataInput和DataOutput接口。
由于它是随机访问,因此文件读写一个记录的位置是任意的;
3、二进制文件可以作为FileOutputStream的构造方法的参数,而FileOutputStream对象作为DataOutputStream的构造方法的参数实现DataOutputStream类,如下例:
同理对input;
4、ByteArrayInputStream、ByteArrayOutputStream、StringBufferInputStream类是可以直接访问内存的;
5、Reader类和Writer类是抽象类,不能用来产生实例对象;
6、FilterInputStream和FilterOutputStream抽象类保证某时刻只有一个线程访问一个I/O流;
Java对I/O访问所提供的同步处理机制是过滤流,字节流、字符流、文件流均不能提供同步;
7、关于对java的I/O部分的理解,见博客:
http://blog.csdn.net/htq__/article/details/50993262?ticket=ST-26715-qyQeAEye3eKez9R5kPp5-passport.csdn.net
八、线程与对象串行化
1、线程和进程的区别:
(1)多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响;
(2)进程是内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据;
线程是用户级的实体,县城结构驻留在用户空间中,能够被普通用户级方法直接访问;
(3)程序、进程和线程的关系:
程序是一段静态代码,它是应用软件执行的蓝本。进程对应与代码从加载到执行完毕的一个完整过程。作为执行蓝本的一段程序,可以被多次加载导系统的不同内存区域执行,形成不同的线程,而线程是比进程更小的单位。线程是程序运行中的一个子进程。
2、线程模型包括:
(1)一个虚拟的CPU;
(2)此CPU所执行的代码;
(3)代码所操纵的数据;
3、java中的线程体是由线程类的run()方法定义的,此方法定义线程的具体行为;
实现run()方法有两种方式,实现Runnable接口和继承Thread类
4、在java.lang中,Runnable接口被定为:
public interface Runnable{
void run();
}
通过Runnable接口建立线程的演示:
public class X extends Thread implements Runnable{
public void run(){
System.out.println("this is run()");
}
public static void main(String args[]){
Thread t= new Thread(new X()); //将Runnable的一个实例作为参数传递给Thread类
t.start();
}
}
5、新建的线程不会自动运行,必须调用线程的start()方法,start()方法会自动调用run()方法;
6、以同一个类的某一个对象为参数只能构造一个线程(见错题13)
7、注意,run()方法必须是不带参数的,且必须声明为void,即没有返回值;
8、线程的优先级划分为:MIN-PRIORITY(常数1)、NORM_PRIORITY(常数5)、MAX-PRIORITY(常数10);
getPriority()方法用来获取线程的优先级,setPriority用来设置线程的优先级;
创建线程后的任何时候都可以设置优先级
9、yield()方法只能使同优先级的线程有执行的机会;
10、一个程序中单独的、并发的线程对同一个对象进行访问的代码段称为临界区,在java中用关键字synchronized标识。
由synchronized语句指定的每个对象设置一个锁,称为对象锁;当一个线程获得了对象锁之后,便拥有此对象的操作权,其他线程不能对此对象进行任何操作;
11、语句:synchronized(对象名);
或public synchronized void 函数名(){ …… }
12、java中没有检测和避免死锁的专门机制,为了避免死锁,java程序中可以先定义获得锁的顺序,解锁按加锁的反序释放;
13、wait()和notify()都是java.lang.object类的方法,是实现线程通信的方法;
wait()方法用于使线程等待并释放共享数据对象的锁,使其他线程能够获得此线程的锁;
notify()方法用于通知正在等待的线程重新占有锁并运行;
14、阻塞状态分为对象锁阻塞状态,等待阻塞状态和其他阻塞状态;
15、可运行状态下:
start()方法:线程状态从新建状态转为可运行状态,但此时线程仅仅可以运行,不一定正在运行;
运行状态下:
正常运行结束,则进入终止状态;
yield()方法:当前线程进入可运行状态;
sleep()方法:当前线程进入其他阻塞状态,睡眠时间到了将进入可运行状态
join()方法:当前线程进入其他阻塞状态;t.join()方法下当t线程结束或时间到后,线程进入可运行状态
wait()方法:当前线程进入等待阻塞状态;用notify()方法或时间到了之后,进入对象锁阻塞状态
线程请求对象的锁未获得,进入对象锁阻塞状态;此状态下,获得锁后进入可运行状态;
线程中有输入输出操作,进入阻塞状态;当输入输出操作结束后,进入可运行状态;
九、图形用户界面
swing部分:
1、Swing是java实现的轻量级结构,不依赖操作系统所提供的支持,这是它与AWT的最大区别;
2、Swing构件都是AWT的Container类的直接子类或间接子类;
大多数Swing构件又是JComponent的子类,它是一个抽象类;
javax.swing包中定义了两种类型的构件:顶层容器(JFrame,Japplet,Jdialog,JWindow)和轻量级构件;
3、Swing采用一种成为MVC的设计范式,即“模型-视图-控制器”,模型用来保存内容,视图用来显示内容,控制器用来控制用户的输入;
4、Swing虽然有顶层容器(JFrame,Japplet,Jdialog,JWindow),但是不能把构件直接添加到顶层容器中,必须先获取容器中的内容面板,在把构件加入内容面板中,例如:
JFrame jf=new Jframe(title);
Container container=jf.getContenPane();
container.add(……);