JAVA学习笔记3

变量

  在Java中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量名之前。Java中不能使用Java保留字作为变量名。
  可以在一行中声明多个变量:

int i,j;

  不过不提倡使用这种风格,逐一声明每个变量名可以提高程序的可读性。
1.1 变量的初始化
  声明一个变量后必须用赋值语句对变量进行显式初始化,千万不要使用未初始化的变量。也可以将变量的声明和初始化放在同一行。例如:

int vacationDays = 12;

  在Java中,变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格。

C++注释:C和C++区分变量的声明和定义。例如:

int i = 10;

是一个定义,而

externa int i;

是一个声明。在Java中,不区分变量的声明与定义。

常量

  在Java中,利用关键字final指示常量。
  关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。
在Java中,经常希望某个常量可以在一个类中的多个方法中使用,称为类常量。可以使用关键字static final设置一个类常量。

public class Constants2{
    public static final double CM_PRE_INCH = 2.54;
    public static void main(tring[] args){
        double paperWIdth = 8.5;
        double paperHeight = 11;
        System.out.println("Paper size in centimeters:" + paperWidth * CM_PRE_INCH + "by" + paperHeight * CM_PRE_INCH);
    }
}

  需要注意,类常量的定义位于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。这里我理解为类似C中的全局变量。

C++注释:const是Java保留的关键字,但目前并没有使用。在Java中,必须使用final定义常量。

运算符

  在Java中,使用算数运算符+、-、*、/表示加减乘除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则为浮点除法。整数的求余(也叫取模)用%表示。
  需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。

  为了保证Java的可移植性,对浮点数的处理上Java采取在默认情况下,虚拟机设计者允许对中间计算结果采用扩展的精度。但对于使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。例如,main方法可标记为

public static strictfp void main(String[] args)

  如果一个类被标记为strictfp,这个类中的所用方法都要使用严格的浮点计算。

  println方法和sqrt方法存在微小差异。println方法处理System.out对象。但在Math类中,sqrt方法处理的不是对象,这样的方法称为静态方法。在Java中没有幂运算,因此需要借助Math类的pow方法。

Math类提供了一些常用的三角函数:

Math.sin
Math.cos
Math.tan
Maht.atan
Math.atan2

还有指数函数以及它的反函数——自然对数以及以10为底的对数:

Math.exp
Math.log
Math.log10

最后,Java还提供里两个用于表示π和e常量的近似值。

Math.PI
Math.E

提示:不必在数学方法名和常量名前添加前缀“Math”,只要在源文件的顶部加上下面这行代码就可以了。

import static java.lang.Math.*;

数值类型之间的转换

JAVA学习笔记3
  图中有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度缺失的转换。
例如:

int n = 123456789;
float f = n;//此时f=1.234567892E8

  当使用上面两个数值进行二元操作时,要先将两个操作数转换为同一种类型,然后再进行计算。

  • 如果两个操作数中有一个是double类型,另一个操作数就会转换成double类型。
  • 否则,如果两个操作数中有一个是float类型,另一个操作数就会转换成float类型。
  • 否则,如果两个操作数中有一个是long类型,另一个操作数就会转换成long类型。
  • 否则,两个操作数都将转换成int类型。

强制类型转换

  在必要的时候需要将double转换成int,需要通过强制类型转换(cast)实现这个操作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型。后面紧跟待转换的变量名。例如:

double x = 9.997;
int nx = (int) x;

  这样,变量nx的值为9。强制类型转换通过截断小数部分将浮点值转换为整型。

  如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要使用Math.round方法:

double x = 9.997;
int nx = (int) Math.round(x);

  现在,变量nx的值为10,。当调用round的时候,仍然需要使用强制转换类型(int)。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能将long类型转换成int类型。

  自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。

  当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。 操作比较大的数时,要留意是否溢出,尤其是整数操作时。 不要命名名字为l的变量,l容易和1混淆。long类型使用大写L不要用小写。

二元运算符的运算规则:

整数运算:

  1. 如果两个操作数有一个为Long, 则结果也为long。

  2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。

浮点运算:

  3. 如果两个操作数有一个为double,则结果为double。

  4. 只有两个操作数都是float,则结果才为float。

取模运算:

  • 其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:*7%3=1,-7%3=-1,7%-3=1。
  • 算术运算符中++,–属于一元运算符,该类运算符只需要一个操作数。
  • 短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。

关系和boolean运算符

Java包含丰富的关系运算符。要检测相等性,可以使用两个等号== 。例如:3==7的值为false。
Java沿用C++的做法来表示一些运算符。

逻辑运算符 表示 解释
逻辑与 && &&与||是按照短路的方式来求值。
逻辑或 || 即如果第一个操作数能确定表示式的值,第二个操作数就不必计算了。
逻辑非
  • 位运算符作用在所有的位上,并且按位运算。
位运算符 表示 解释
“and” & 如果相对应位都是1,则结果为1,否则为0
“or” | 如果相对应位都是0,则结果为0,否则为1
“xor” ^ 如果相对应位值相同,则结果为0,否则为1
“not” ~ 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
  • &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
  • 不要把“^”当做数学运算“乘方”,是“位的异或”操作。
  • “+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
  • 逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)。如:
  • a||b&&c的运算结果是:a||(b&&c),而不是(a||b)&&c