Java总结
--开始于2013-9-709:27:48
▉Java概述
Java分类:
java SE:主要是桌面程序、控制台程序开发,是java基础
java EE:企业级开发(网站开发和基于b/s模式的编程)
java ME:嵌入式开发(手机软件、小家电)
第一个Java程序:
public class JavaTest{
private String str=new String("hello java.");
public void showMessage(){
System.out.println(str);
}
public static void main(String[]args){
JavaTest test=new JavaTest();
test.showMessage();
}
}
Java可以有多个main函数。每个类中都可以有main函数,也就是说你的代码可以有多个入口,你只需要明白什么时候用哪个类的main函数作为入口即可。但是要注意的是用不同入口启动的两个进程是毫不相关的。
学习Java前的心理准备:
java他妈的把c/c++剔除的够干净的,在c/c++中易如反掌的事,在java中却要大动干戈。所以在学习java
之前,请做好心理准备,java其实是一个残疾人。
▉Java关键字、运算符
Java保留字一览表:
java中goto是保留字,但不是关键字,请记住java中没有goto,但可以实现类似的功能,参考百度。
java中没有sizeof,因为java认为c语言中的sizeof主要用于跨平台,而java本身就是跨平台的。
java中没有unsigned,也就是说java中的基本数据类型都是有符号的。这点要注意一下。请注意下面的代码:
int a=…;
int b=…;
int c=a–b;
以上代码只有在a和b都是无符号的int时才能正确工作。对于java这种没有unsigned类型的语言来说,上述代码就是一个编程错误!因为int不足以容纳两个有符号int的差,当a 是很大的正整数,b是很大的负整数时,a-b就会溢出并返回负值。
Java运算符:
java运算符和c、c++的运算符类似,功能也类似。但也有不同,比如java中有无符号右移运算(逻辑右移):>>>。同时注意:用于String的“+”和“+=”是java中仅有的两个重载过的运算符,java不允许程序猿重载任何的运算符。
▉Java数据类型
Java是强数据类型的语言,java基本数据类型:
boolean:true or false
char:16bits,Unicode编码字符
byte:8bits
short:16bits
int:32bits
long:64bits
float:32bits,float var=32.5f,注意加上“f”,否则带小数点的值都会被java当作double 处理。
double:64bits
在Java中,主数据(primitive)类型都有对应的被包装过了的类,以第一个字母大写开头,例如:Boolean、Integer、Character、Byte、Short、Long、Float、Double。
主数据类型可以与其对应的对象相互转化,在运算时,Java5.0以后会自动进行转换,所以很方便。在使用ArrayList时,你只能声明对象,例如:ArrayList<Integer>(其实这是泛型),而不能使用ArrayList<int>,但是在使用ArrayList时,可以直接使用int类型。
Java字节序:
java在任何系统上的字节序都是大端(Big-endian),因为java是跨平台的嘛。网络传输的字节序也是大
端。因此java程序和java程序之间进行数据传输,并不会出现什么问题。但是当java遇到字节序是小端(Little-endian)的数据时,就会出现问题。这时我们就需要转换数据的大小端。方法有很多,你可以自己写方法实现大小端的检测和转换,但是作为java 程序猿来说,我们应该尽量使用已有的类库或者方法来解决问题,以提高生产率。下面介绍几种java类库中已有的解决办法:
1使用java.nio.ByteBuffer类中的order方法将字节序改为小端。如:der(ByteOrder.LITTLE_ENDIAN);
2使用Integer等基本数据类型对应的类类型中的静态方法将int等数据类型的数据转换为小端字节序的数据。如:verseBytes(num);
另外,在网络传输时,还需要注意其他问题:java没有unsigned;java数据类型的长度和其他语言的可能不同。同时,IEEE754标准只是规范了float、double的逻辑规范,其存储时还是会有字节序问题,因此在不同系统或者编程语言之间进行传输数据时,也要考虑字节序问题。
byte、int的转换:
由于java中所有的基本数据类型都是有符号的,所以当你要把byte类型的数据当作无符号数据看待时,你就得使用特殊的方法将其存放在更大容量的数据类型里边,比如将byte 转换之后存放在int中。下面说下byte和int的相互转化:
byte转换为int有两种方法:
1不改变原值,也即转换前后都将其看作有符号数,可使用强制类型转换:int i=(int)b;
2保留最低字节的个个位不变,则需采用位操作:int i=b&0xff;
int转换为byte可以直接使用强制类型转换:byte b=(byte)i;,注意这个操作是直接截取int中最低一个字节,如果int数值大于127且小于256,则转换得到的byte为负值(因为是有符号的,但其二进制位和int的最低字节完全相同),如果int数值大于255,则转换得到的byte就会面目全非,因为截断了。
▉字符串
String:
String是不可变字符串对象,任何修改String的操作,实际上返回的都是一个全新的String对象。String中保存的是Unicode格式的16位字符组成的字符串,String永远是Unicode 编码。
“+”、“+=”可以用来连接字符串。由于String是不可变的,因此在连续的字符串连接时,会不断的生成中间的String对象,以得到最终的String对象。这样的话,效率是很低的,java 编译器为了提高效率,会暗地里为我们做一些优化,它用StringBuilder来处理中间过程的字符串连接,并最终使用toString()方法(
从Object继承来的,当你要打印该对象时,你就要覆盖toString()方法)将最终结果转换为String对象。在程序中,比如在循环连接字符串时,为了效率,最好使用StringBuilder来处理中间结果。StringBuilder是可变的,类似的还有StringBuffer,不过StringBuffer是线程安全的,因此开销相对也会大点。
byte、char、String的转化:
new String(byte[]bytes,“UTF-8”),将bytes字节数组以“UTF-8”编码格式转换为Unicode,“UTF-8”指出字节数组是以什么格式编码的,并不是最终要转换成的编码。new String(chars)将char类型的数组chars转换为String类型。
▉数字的格式化
Java中数字的格式化与C语言的很相似。
将数字以带逗号的形式格式化:String.format(“%,d”,1000000);注意:%和d之间有一个逗号。
Java中日期的格式化:String.format(“%tc”,new Date());其中,%tc表示完整日期,%tr 只显示时间,%tA%tB%td周月日
也可以这样写:String time=new SimpleDateFormat("yyyy-MM-dd").format(new Date());
取得当前日期可以使用Date对象,Date中getTime()、setTime()都是针对GMT时间,toString()则会根据时区将时间转换为相应字符串,但其他关于日期的操作最好使用Calendar 对象,具体参见Java手册。
▉Java控制语句
java中控制语句与c、c++类似,但与C/C++不同的是,java中的while、if等的条件判断,不能直接使用类似于int型的变量(看其是否等于0)来判断,应该用一个判断语句或者直接使用boolean类型的变量。
特殊循环语句:
循环for(int cell:cells){}中,冒号(:)代表in,cells为数组,每循环一次cells数组的下一个元素都会赋值给cell变量。这是java5.0(Tiger)开始使用的for循环加强版,当然你也可以使用for原版:for(int i=0;i<n;i++){}
foreach循环可以用于数组和任何实现了Iterable接口的类(这并不意味着数组肯定也是一个Iterable)。
▉类和对象
java中的所有东西都包含在类中,在java源文件中可以包括多个类,但是只能有一个public类,而且如果有public类的话,这个文件的名字要和这个类的名字一样。一个类中可以有多个方法,一个方法中可以有多个语句。
Java存取权限和存取修饰符:
Java有4种存取权限和3种存取修饰符,因为有一个缺省的权限等级(无修饰符)。
4种存取权限:
java arraylist用法public:...
private:...
default:只有在同一个包中的默认事物能够存取
protected:受保护的部分,运行起来像是default,但也允许不在同一个包中子类继
承受保护的部分
3种存取修饰符:public、private、protected
对象与引用:
java中没有所谓的对象变量,有的只是对象的引用,对象只存在于堆上,并且只能通过其引用进行引用。
java创建对象不能通过类似于“A a;”的形式直接定义,这只是定义了一个对象引用变量,而需要通过类似于“A a=new A();”的形式在堆上定义一个对象,并将在栈上的对象的
引用指向这个对象。
c++中对象作为参数,是按照值传递。其实java也是值传递,只不过java中只有对象的引用,而没有所谓的“对象变量”,故而传递的都是对象的引用的值,因此在函数中可以改变引用参数指向的对象。注:java中String类型的对象作为函数参数传递时,也是传递引用的值,而不是所谓的“值传递”,因为String类是不可变的,它没有提供自身修改的函数,每次修改操作都是新生成一个String对象,所以要特殊对待,可以认为是传值。关于这一点,网上实在是有太多的流言蜚语,有很多流言是错误的,请务必注意。
那么有没有办法使函数不能够修改引用参数指向的对象呢?答案是传递对象副本的引用。为了使用对象
的副本作为函数参数,可以使用对象的clone()方法对其进行浅层复制(具体细节请百度之),所谓的浅层复制即是只复制对象本身,而不对其引用的或者其成员变量引用的对象进行复制,也即不对整个对象网进行复制。对对象网进行复制(深层复制),另有它法,请百度之。
对象相等性的判断:
“==”或者“!=”只能用来判断对象的引用是否相等,若需判断对象是否相等,则需equals(),但一般你需要覆盖equals(),因为Object中的equals()默认使用对象的地址判断对象是否相等。但基本类型直接使用“==”或者“!=”即可。
实例变量与局部变量:
实例变量是声明在类内,而不是方法中,实例变量有默认值。局部变量是声明在方法中的,局部变量没有默认值,在使用之前,必须初始化,否则编译器报错。
关于初始化的更多细节:java中成员变量可以在定义的后边直接进行初始化,也可以在构造函数中进行初始化。而c++中成员变量不能在定义类时直接初始化,需通过构造函数初始化。
final:
声明一个类或方法到达继承树的末尾,可以用final,也即禁止该类被继承或方法被覆盖。同时请注意final方法是前期绑定的,将方法声明为final可以有效关闭该方法的动态绑定机制,但多数情况下并不会提升多少效率,因此不要为了提升效率而随意使用final来声明方法。
静态的方法:
用static声明的方法是静态的方法,静态方法不需要实例化的对象,就可以通过类名来引用(当然也可以通过对象来引用),但静态的方法不可以使用非静态的变量,也不能调用非静态的方法。
静态的变量:
用static声明的变量是静态变量,静态变量为该类的所有对象共享,注意static不能作用于局部变量,只能作用于成员变量,因此只有成员变量才能是静态变量。
静态变量也会有默认值,就像实例变量一样会被自动初始化一样。静态变量会在该类任何的静态方法被调用之前被初始化,也会在该类任何的对象被创建之前被初始化。你可以像初始化其他成员变量一样,直接在定义处初始化,也可以使用特殊的语法结构进行初始化——静态块,如下:
public class Spoon{

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。