java程序设计基础
java核心技术之基本程序设计
1文件名
文件名与类名必须相同,且命名采用驼峰命名法。如FirstSample类,文件名则为FirstSample.java
2数据类型
java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在java中,一共有8种基本类型,其中包括4种整型,2种浮点型,1种表示Unicode编码的字符类型char和1种表示真值的boolen类型。
一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。
if(Double.isNaN(x)) //check whether x is "not a number"
转义字符表、特殊字符的转义序列符
3位运算符
“>>”和“<<”运算符将二进制位进行右移或左移操作。当需要建立位模式屏蔽某
些位时,使用这两个运算符十分方便:
int fourthBitFromRight = (n & (1 << 3)) >> 3;
最后,>>>运算符将用0填充高位;>>运算符用符号位填充高位。没有<<<运算符。
3.1math
在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。
如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类。它使用“自由发布的Math库” (fdlibm)实现算法,以确保在所有平台上得到相同的结果。有关这些算法的源代码请参看http://www.netlib.org/fdlibm/ index.html(当fdlibm为一个函数提供了多个定义时,StrictMath类就会遵循IEEE 754版本,它的名字将以“e”开头) 。
math.round(x) //表示x四舍五入
3.2运算符优先级
静态方法与非静态方法
首先,两者本质上的区别是:静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。而非静态方法是不加static关键字的方法,在类定义时没有占用内存,只有在类被实例化成对象时,对象调用该方法才被分配内存。其次,静态方法中只能调用静态成员或者方法,不能调用非静态方法或者非静态成员,而非静态方法既可以调用静态成员或者方法又可以调用其他的非静态成员或者方法。
-
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。
-
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
-
静态方法在程序初始化后会一直贮存在内存中,不会被垃圾回收器回收, 非静态方法只在该类初始化后贮存在内存中,当该类调用完毕后会被垃圾回收器收集释放。
-
静态方法在初始化类时初始化,并分配内存;动态方法只有先创建类的实例对象后,才能调用动态方法
字符串
一定不能使用 = = 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是
否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全
有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只
有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。
因此,千万不要用用== 运算符测试字符串的相等性,以免在程序中出现糟糕的bug。从表面上看,这种bug很像
随机产生的间歇性错误。
空指针报错
java.lang.NullPointerException报错
1、字符串变量未初始化
2、接口类型的对象没有用具体的类初始化,比如:
Map map // 会报错
Map map = new Map(); //则不会报错了
3、当一个对象的值为空时,你没有判断为空的情况。
4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常
String str = null;
if(str.equals(“Test”)){
//这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。
}
5、优先使用String.valueOf()方法代替toString()
当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印"null"
6、class被声明了类型, 默认 class = null; 这样在调用class中方法的时候系统只能给你个空指针异常, 给其实例化就好了:class = new Class();
7、返回null,方法的返回值不要定义成为一般的类型,而是用数组。这样如果想要返回null的时候就能避免许多不必要的NullPointerException
8、参考实例:http://blog.chinaunix.net/uid-24386107-id-3394236.html
块作用域
java不能在嵌套的两个块中声明同名的变量,(不过在C++中科院在嵌套的块中冲定义一个变量。)
循环
注意:可能永远不会结束。由于舍入的误差,最终可能得不到精确值。例如,在上面的循环中,因
为0.1无法精确地用二进制表示,所以,x将从9.999 999 999 999 98跳到10.099 999 999 999 98。
for (double x = 0; x!= 10 ;x+=0.1)
System.out.println("args = [" + x+ "]");
for each 循环
用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心。
//打印数组a的每一个元素,一个元素占一行;
//读作 for each element in a
for(int element : a)
System.out.println(element);
提示:有个更加简单的方式打印数组中的所有值,即利用Arrays类的toString方法。调用Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分隔,例如, “[2,3,5,7,11,13]” 。要想打印数组,可以调用
int a[]= {2,3,4,5,6,87}; //a = new int[] {2,3,4,5,87}
System.out.println(Arrays.toString(a));
大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
数组
创建数组
int [] a //这句话只声明了变量,并没有初始化为一个真正的数组
int[] a = new int[100]; //利用new运算符创建数组
一旦创建了数组,就不能再改变它的大小(尽管可以改变每一个数组元素) 。如果经常需要在运行过程中扩展数组的大小,就应该使用另一种数据结构—数组列表(array list)