一 基础知识
几个值得注意的地方:
1 数据的转型:分为自动转型和强制转型
其中自动转型,要 (1)转换前的数据类型与转换后的类型兼容(2)转换后的数据类型的表示范围比转换前的类型大 两个条件同时成立时,才会自动转型
而强制转型则要:(要转换的数据类型)变量名称,如果将一个超出该变量可表示范围的值赋值给这个变量时,可能会丢失数据的精确度。
2 “&&”为短路与,而“&”为与。同理“||”为短路或,而“|”为或。
3 Java新特性:
(1)可变参数:返回值类型 方法名称(类型...参数名称){
}
(2)foreach输出:for(数据类型 变量名称:数组名称){
}
二 面向对象
1 Java与C语言最大的区别是,Java是面向对象的语言,而C是面向过程的语言。面向对象最主要是:3个特性,为封装性,继承性,多态性。
封装性:(1)把对象的属性与行为封装在对象中。(2)通过不同声明方法的作用域来进行控制属性和行为的是否可见性。
继承性:(1)继承父类,但这种方法只能单继承。(2)实现接口,这种方法可以实现多继承。
多态性:(1)方法的重载,即允许方法同名,但方法的参数数量或者类型不同,其完成的功能也不一样
(2)方法的覆写:覆写发生在继承类黎,要求方法,参数,返回值类型都一样,被覆写的方法不能拥有更严格的权限。
(3)对象多态,分为向上转型 :子类对象->父类对象 格式为:父类 父类对象=子类实例
向下转型:父类对象->子类对象 格式为:子类 子类对象=(子类)父类实例
2 构造方法:(1)构造方法名称必须与类名称一样。(2)不允许有返回值
一个类里允许有多个构造方法,调用时会根据参数的多少或类型来匹配。
一个类里也允许没有构造方法,这时系统会自动该类创造一个空的构造方法。
注意:当人为创造了构造方法时,系统则不会创造一个空的构造方法了。
3 this() 作用:(1)调用本类中的方法 (2)用来表示类中的属性 (3)使用this()调用的构造方法 (4)表示当前对象
super()作用:(1)调用父类中的方法 (2)用来表示父类中的属性 (3)使用super()调用父类的构造方法
使用this调用属性或方法时先从本类中查找,如果没有查找到,再从父类中查找,而直接使用super则直接从父类中查找。
4 访问权限:private声明的属性或方法,只能在本类中使用
default声明的属性和方法,除了在本类中使用,还可以在同一包中的类使用。
protected声明的属性和方法,除了在本类,同一包中的类使用,还可以在不同包的子类使用
public声明的属性和方法,在本类,同一包中的类,不同包的子类,其他包中的类都能使用。
5 包装类:这个类是为了将基本类型包装成类的形式。其中名称变化较大的是:int->Integer char->Character 其余都是将首字母改为大写即可。
其中基本数据类型转换为包装类的过程称作装箱操作,而包装类变为基本数据类型的过程称为拆箱操作。
6 抽象类与接口:抽象类作为一个模板,而接口作为一个标准或表现一种能力。两者最大的区别为抽象类不能实现多继承,而接口可以。所以在都可以使用的情况下优先使用接口。
7 异常:分为RuntimeException 与Exception,其中RuntimeException 可以不使用try...catch进行处理。而Exception必须使用try...catch 进行处理。
throws用在方法声明处,而throw用于在方法中手工抛出异常。
三 应用程序设计
1 多线程:有两种实现方法,一是继承Thread类,二是实现Runnable接口。
但是当一个类继承Thread类时,不适合多个线程共享资源,而实现了Runnable则可以方便实现资源的共享。
在资源共享时,要注意同步问题,解决这个问题,可以使用同步代码块与同步方法。
同步代码块:synchronized(同步对象){
需要同步的代码
}
synchronized 方法返回值 方法名称(参数列表){
}
但在同步时,又有另一个问题,那就是死锁问题:
产生死锁的原因:(1)互斥条件 :所谓互斥就是进程在某一时间内独占资源。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不变
(3)不剥夺条件:进程已获得资源,在未使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2 常用类:
(1)String类:
直接赋值实例化:这种实例化好处:如果一个字符串被一个名称所引用,则以后再有相同的字符串声明时,再不会再重新开辟空间,而继续使用已经开辟好的堆内存。
new String(""):则是开辟了两个空间,一个是“”字符串空间。一个是new出来的空间。
使用String类有一个重要的特性是,字符串内容不可改变。
(2)StringBuffer类
这个类支持的方法大致与String类相同,但有一点它的字符串内容可以进行修改。
所以在对于频繁修改字符串内容的地方最好使用StringBuffer类完成
(3)日期操作类
Date类:可以通过Date类得到系统当前日期,但格式不符合我们日常生活中看到的
Calender类:可以通过Calender类得到日期的某一字段的值
DateFormat类:可以通过DateFormat类来格式化日期时间,但不能得到用户自己需要的日期显示格式。
SimpleDateFormat类:可以通过SimpleDateFormat类得到用户自己需要的日期显示格式。
(4)Random类
生成随机数
(5)Arrays类
用于数组元素的查找,数组内容的填充,排序
(6)Comparable接口
通过实现这个接口,可以自己实现排序规则。
(7)正则表示式
Pattern类是用来编写正则规范。实例化需要使用compile()。如Pattern p=Pattern.conpile(正则规范)
Matches类则是用来执行规范。Matcher m=p.matcher(需要验证的字符串)。再通过m.matches执行规范。返回BOOLEAN值。
特殊:String对正则表达式有支持.
3 JavaIO
字节流:OutputStream,输出流;InputStream,输入流
字符流:Reader :输出流;Writer:输入流
Java中IO操作:
(1)使用File类打开一个文件
(2)通过字节流或字符流的子类指定输出的位置
(3)进行读/写操作
(4)关闭输入/输出
使用字节流时,输入输出都需要以字节为基础
而使用字符流时,输入输出以字符为基础。而且输出是可以直接输出字符串。
这只是代码上的区别,其实内部操作也有所不同:那就是字符流在操作时使用了缓冲区,通过缓冲区操作文件。而字节流没有使用到缓冲区。
两者之间的转换:可以通过转换流 OutputStreamWriter 将OutputStream转换为Writer InputStreamReader 将InputStream转换为Reader
内存操作流:(当生成一些临时信息时才会使用)
ByteArrayInputStream
ByteArrayOutputStream
管道流:(用于两个线程间的通信。)
打印流:字节打印流:PrintStream 字符打印流:PrintWriter
System类对IO的支持:System.out System.err:向屏幕上输出。System.err是打印错误信息的。
System.in 键盘的输入流:记得输入流有两种输入方式,一种是一次性写进字节数组,一种则是一个一个输入。这时应该注意中文字符,因为中文字符 是两个字节的。
BufferedReader类,用于从缓冲区中读取内容,构造方法里的参数为Reader。通常就用这个来接受键盘输入数据。
标准格式为:
BufferedReader buf=null;
buf=new BufferedReader(new InputStreamReader(System.in));
String str=null;
System.out.print("请输入内容:");
try{
str=buf.readLine();
}catch(Exception){
}
Scanner类:利用scanner.next()来接受内容。
注意使用该类,要注意分隔符的影响,可以用Scanner.useDelimiter(String pattern)来设置读取的分隔符
压缩流:
压缩:分为压缩文件,还是压缩文件夹,如果是压缩文件夹则要使用ListFile()方法将文件夹里面的File列出,再用压缩文件的方法压缩
现在讲述一下压缩文件的方法:
(1)先定义要压缩的文件,通过它创建一个输入文件流。
(2)在定义压缩文件的名称,通过它创建一个压缩输出流。
(3)由于每一个被压缩文件都用ZipEntry表示,所以需要为每一个压缩后的文件设置名称
(4)再采取边读边写的方式来压缩文件。即
while((temp=input.read())!=-1){
zipOut.write(temp);
}
(5)关闭输入输出流。
对象序列化:将一个对象变为二进制的数据流。
ObjectOutputStream,ObjectInputStream
Serializable接口,实现了这个接口的类,表示该类具备了被序列化的能力。
注意:只有属性可以被序列化
如果要选择性选择属性被序列化,可以有两种方式。
(1):实现Externnalizable接口;并覆写writeExternal(),readExternal()方法
(2):利用transient关键字进行声明不被序列化的属性。
4 Java类集
(1)List接口:可以保存各个重复的内容。
常用子类:Arraylist
(2)Set接口:不可以保存重复的内容。
常用子类:HashSet(无序) TreeSet(有序)
Set接口是通过hashcode(),以及equals()方法来判断是不是重复的内容。
而TreeSet是通过覆写compareto()方法来设置排序规则。
(3)集合的输出
通常是用迭代输出:Itertor
如:假设all为一集合
Iterator<String> iter=all.iterator();
while(iter.hasNexr()){
System.out.print(iter.next()+"、")
}
(4 )Map接口(存放键值对)
常用子类:HashMap,Hashtable,TreeMap(可以排序,根据Key值),WeakHashMap,IdentityHashMap(特殊:key可以重复)
TreeMap存放的Key值如果是自定义对象时,该对象所在的类必须实现Comparable接口。
Map接口的输出:不能直接输出
要:(1)将Map接口的实例通过entrySet()方法变为Set接口对象
(2)通过Set接口实例为Iteror实例化
(3)通过Itertor迭代输出,每个内容都是Map.Entry对象。
(4) 通过Map.entry进行KEY->value的分离
当直接使用非系统类 作为KEY
如果要通过匿名对象查找对应的value值,则要自定义对象所在类覆写equals(),hashcode()方法
5 Java网络编程
TCP: 需要专门的虚拟连接,可以进行可靠地数据传输
UDP:不需要专门的虚拟连接,传输不是很可靠
TCP客户端:1.建立网络连接(指定连接的主机和端口) 2.交换数据(利用输入输出流) 3.关闭网络连接
TCP服务器:1.监听端口 2,获得连接 3交换数据 4.关闭连接。
UDP:有两种建立客户端连接的办法:DategramSocker ds=new DatagramSocket();该客户端连接使用系统随机分配的一个本地计算机的未用端口号
DategramSocker ds=new DatagramSocket(9000);指定端口号
在UDP中,IO技术不是必须的,在发送数据时,需要将需要发送时数据内容首先转换为byte数组,然后将数组内容,服务器IP,以及端口号一起构造成一个DategramPacket类的对象,在调用send方法即可。
而接受数据的实现,当数据发送出去以后,就可以接受服务器的反馈信息,首先构造一个数据缓冲数组,该数组用于存储接受的服务器段反馈数据,该数组长度必须大于或等于服务器反馈的实际长度,然后以缓冲数组为基础构造一个DategramPacket包,最后调用连接对象的receive方法。