JAVA学习体会
1.一个文件最好只放一个类,一个文件里面只能有一个类是public,类名与文件名一定保持一致;
2.同样不支持多继承;
3.继承使用的是extends关键字
4.布尔类型是boolean,long类型末尾加L,字符串是大写的String;
5.Java的位运算符比C#多一个,>>>无符号右移
6.Java的装箱很特殊,例如-128~127是同一个实例(缓存到某一数组),但之外会则会重新创建
7.break可以终止所在的循环,还可以直接结束外层循环,作法是在外层加个标签:,break 标签;
continue也类似,也可以加个标签,用于结束标签所标识的循环的当次循环;
8.遍历集合,使用for (int i : a) ,C#是foreach(int i in a)
9.数组基类是Arrays提供一系列的方法;
10.可变参数,例如(String...books)
11.方法修饰符还多了个default,类中和同一个包中
12.类无属性提供(get、set访问),只能自己写相应的方法访问,命名方式为getAbc和setAbc(A为相应字段首字母大写)
13.包相当于C#的命名空间,引入采用import 包名.*,而namespace 在Java中改成package,包名应该全由小写字母写成,
静态导入 import static 包名.*---导入包中类下的所有静态属性(使用static标识的字段)
14.继承类使用extends关键字,引用父类使用的是super关键字(C#用base)
15.Java中用instanceof来判断一个对象是否是某个类型(要么是同类,要么是父类),例如 myobject instance of BaseClass
要么是true,要么是false
16.父类中的方法使用final关键字限制其不被子类重写,同样某类不希望被继承也可用final修饰,C#中使用关键字sealed,对于变量赋值,
final修饰的变量值不能修改,局部变量使用它来修饰,可以赋值1次,实例化时用final来修饰,该对象地址不能改;
类中的私有字段如果final修饰,则只能在构造器中给值
17.Java在类中可以使用{}作为初始化块,在创建对象时隐式执行,而且在执行构造器之前执行;
18.Java的char类,使用包装类Character,int包装类Integer,包装类都提供parseXXX的静态方法,将字符串进行转换,String类提供
valueOf静态方法将其它类型转换成字符串
19.Java实现接口使用implements关键字,而接口继承使用extends,C#只使用:
20.@Override,想重写基类方法,编译时系统会帮助检查方法是否写正确了(例如toString和tostring的区别)。
21.Java中有个内部类的用法,这个倒是C#没有提倡的,内部类可以访问外部类的私有字段,编译完成会生成两个.class文件,如果要访问外部
类的属性,有时需要加全限定,类名.this.变量名,反过来,外部类想访问内部类的私有字段,必须new 类名().变量名;
Java还允许在接口中定义内部类,默认使用的是public static修饰(即静态内部类)
22.局部内部类--放在方法内定义,类的全部使用仅限于方法内;
匿名内部类--在方法内直接new实例化,不能定义构造器
23.闭包概念:类要实现继承和实现接口,出现同名方法,使用内部类来实现;
24.Java的枚举与C#有很大不同,内部可以有public属性,生成实例用Enum.valueof方法,还可以实现接口,内部用switch(this)可以实现不同
的分支,感觉设计和C#比太乱了
另外枚举值可以{}单独对应方法
Add
{
}
25.finalize类似于Dispose方法
26.Java的强制垃圾回收Runtime.getRuntime().gc(),但只是建议,并不立即回收; java -verbose:gc可查看每次垃圾回收后的信息
27.Java的集合分3大类:Set(无顺序)、List(有顺序)、Map(键值对)
迭代接口:Iterator接口
Iterator myIt=集合对象.iterator();
while(myIt.hasNext()) myIt.next()
28.HashSet按Hash算法,按hashCode索引查找,无顺序放,线程不同步,可加null;
有个TreeSet按红黑树排序算法存储元素对象(必须实现Comparable接口)
Queue队列
HashTable表
29.输入输出,感觉Java这里设计还比较简单
输入流 InputStream/Reader (字节流与字符流)
输出流 OutputStream/Writer
随机文件访问类:RandomAccessFile,提供文件任意位置读写。
多线程?
31.网络编程
(1)抛出异常可以在方法定义后面直接
(2) InetAddress 代表IP地址对象,注意它的isReachable会试图建立TCP连接,会返回false(防火墙限制)
(3)UrlEncoder类与UrlDecoder类
(4)Url类,openConnection方法返回URLConnection对象处理Http请求
//发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//发送请求参数
out.print(param);
//flush输出流的缓冲
out.flush();
//定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine())!= null)
{
result += "\n" + line;
}
(5)Socket设置超时
socket.connect( new InetSocketAddress( "127.0.0.1", 30000), 30000 );
32.序列化与反序列化
(1)序列化:类要实现Serializable接口,采用ObjectOutputStream对象的Write方法序列化对象(二进制),如果不想序列化某个字段
使用关键字transient
(2)反序列化:采用采用ObjectInputStream对象的Read方法读出已序列化的二进制;
(3)自定义序列化:实现Externalizeable
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。
但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
另外由于StringBuffer是线程安全的,StringBuilder非安全