1. 更简单的打印语句
静态导入(static import)类库后,可以编写更简洁的输出语句,一般用System.out.println().
2. 使用java操作符
几乎所有的操作符都只能操作基本类型,但是"=',"==","!="操作符可以操作所有的对象。除此之外,String类也支持“+”,“+=”。
3. 优先级
优先级和其他编程语言基本一样,但是Java也做了一些规定,最基本的是先乘除后加减,然后用括号明确规定计算顺序。Systtem.out.println()中的操作符“+”是字符串连接,如果有必要,还会进行字符串转换。
4. 赋值
1.对象赋值时的别名机制
赋值对基本数据类型和其他语言中一样,但是当遇到对象赋值时就出现了别名问题。对一个对象操作时,实际上操作的是对象的引用,如果将一个对象赋值给另一个对象时,实际上将一个对象的引用复制给另一个对象。
程序举例:
//Java 编程思想第三章
//练习二:创建一个包含float域的类,并用这个类来展示别名机制
class Tank{
float level;
}
public class AnotherNameTest {
public static void main(String [] args)
{
Tank f1=new Tank();
Tank f2=new Tank();
f1.level=18.4f;
f2.level=10.6f;
System.out.println("1:f1.level:"+f1.level+",f2.level:"+f2.level);
f1.level=f2.level;
System.out.println("2:f1.level:"+f1.level+ ",f2.level:"+f2.level);
f1=f2;
System.out.println("3:f1.level:"+f1.level+",f2.level:"+f2.level);
f1.level=89.5f;
System.out.println("4:f1.level:"+f1.level+",f2.level:"+f2.level);
}
}
运行结果:
2.方法调用时的别名机制
程序举例:
/**Java 编程思想第三章
* 练习三:创建一个包含float域的类,并用这个类来展示方法调用时的别名机制
*@author RobortZhao
*@version 1.0
*/
class Letter{
float f;
}
public class AnotherNameUseTest {
static void f(Letter y){
y.f=46.6f;
}
public static void main(String [] args){
Letter d=new Letter();
d.f=78.0f;
System.out.println("1:d.f="+d.f);
f(d);
System.out.println("2:d.f="+d.f);
}
}
运行结果:
5. 算术操作符
1.和C,C++类似。
2.用Random类产生随机数。
6. 自动递增与递减
用法和C++中的类似。
7. 关系操作符
等于和不等于适用于所有的数据类型,而其他比较符不适合于boolean类型。因为boolean值只能是true和false,其它的关系操作符没有实际意义。
7.1测试对象的等价性:用==和!=,以及equals()方法。
程序举例1:
/**
*<0l>
*<li>Java 编程思想 第四版:第三章练习五
*<li>题目:创建一个名为Dog的类,他包含两个String域:name和says。在main()方法中创建两个Dog对象,一个名为"spot",他的叫声为“Ruff!”.另一个名为"scruffy",他的叫声为“Wurf!").然后显示他们的名字和叫声。
*<li>输出:
*<li>Spot
*<li>Ruff!
*<li>Scruffy
*<li>Wurf!
*@author RobortZhao
*@version 1.0
*/
class Dog{
String name;
String says;
void SetName(String n){
name=n;
}
void SetSays(String s){
says=s;
}
void ShowName(){
System.out.println(name);
}
void ShowSays(){
System.out.println(says);
}
}
public class DogTest {
public static void main(String [] args){
Dog Spot=new Dog();
Dog Scruffy=new Dog();
Spot.SetName("Spot");
Spot.SetSays("Ruff!");
Scruffy.SetName("Scruffy");
Scruffy.SetSays("Wurf!");
Spot.ShowName();
Spot.ShowSays();
Scruffy.ShowName();
Scruffy.ShowSays();
}
}<strong>
</strong>
运行结果:见程序注释。
程序举例2:
/**
*<0l>
*<li>Java 编程思想 第四版:第三章练习五
*<li>题目:在练习五的基础上,创建一个新的Dog索引,并对其赋值为Spot对象。测试用==和equals()方法比较所有引用的结果。
*<li>注意:==和equals比较的都是引用
*@author RobortZhao
*@version 1.0
*/
class Dog{
String name;
String says;
void SetName(String n){
name=n;
}
void SetSays(String s){
says=s;
}
void ShowName(){
System.out.println(name);
}
void ShowSays(){
System.out.println(says);
}
}
public class DogCompareTest{
public static void main(String [] args){
Dog Spot=new Dog();
Dog Scruffy=new Dog();
Dog AHuang=new Dog();
Spot.SetName("Spot");
Spot.SetSays("Ruff!");
Scruffy.SetName("Spot");
Scruffy.SetSays("Ruff!");
AHuang.SetName("AHuang");
AHuang.SetSays("wangwang");
Spot.ShowName();
Spot.ShowSays();
Scruffy.ShowName();
Scruffy.ShowSays();
AHuang.ShowName();
AHuang.ShowSays();
//当没有这句时:比较结果是false;当有这句时,比较结果是true;虽然前面赋值的时候是一样的
//Spot=Scruffy;
System.out.println("Compare:");
System.out.println("Spot==Scruffy:"+(Spot==Scruffy));
System.out.println("Spot.equals(Scruffy):"+(Spot.equals(Scruffy)));
System.out.println("Scruffy.equals(Spot):"+(Scruffy.equals(Spot)));
System.out.println("Assign again:");
Spot=AHuang;
System.out.println("Compare again:");
System.out.println("Spot==AHuang:"+(Spot==AHuang));
System.out.println("Spot.equals(AHuang):"+(Spot.equals(AHuang)));
System.out.println("AHuang.equals(Spot):"+(AHuang.equals(Spot)));
}
}
运行结果:
8. 逻辑操作符
不可将一个非布尔值当做布尔值在逻辑表达式中使用。
程序举例:
/**
*<ol>
*<li>Java 编程思想 第四版 第三章 练习七
*<li>题目:编写一个程序,模拟投硬币的结果。
* @author RobortZhao
* @version 1.0
*/
import java.util.*;
public class ThrowCoinBool {
public static void main(String [] args){
Random rand=new Random(47);
int i=rand.nextInt();
if(i%2==0)
System.out.println("heads");
else
System.out.println("tails");
}
}
8.1短路:一旦明确无误的确定某整个表达式的值,就不在往后计算。提高了程序的效率。
程序举例:
public class ShortCircuit {
static boolean test1(int val) {
System.out.println("test1(" + val + ")");
System.out.println("result: " + (val < 1));
return val < 1;
}
static boolean test2(int val) {
System.out.println("test2(" + val + ")");
System.out.println("result: " + (val < 2));
return val < 2;
}
static boolean test3(int val) {
System.out.println("test3(" + val + ")");
System.out.println("result: " + (val < 3));
return val < 3;
}
public static void main(String[] args) {
boolean b = test1(0) && test2(2) && test3(2);
System.out.println("expression is " + b);
}
}
9. 直接常量
通过与直接向量相关的某些字符类指导编译器。
程序举例:
/**
*<ol>
*<li>Java 编程思想 第四版 第三章 练习8
*<li>题目:
*<li>展示用十六进制和八进制记数法来操作long值,用Long.toBinaryString()来显示结果。
* @author RobortZhao
* @version 1.0
*/
public class LongtoBinaryString {
public static void main(String [] args){
long n1=0xffffffff;
long n2=07777777777;
System.out.println("n1="+Long.toBinaryString(n1));
System.out.println("n2="+Long.toBinaryString(n2));
char c=0xffff;
byte b=0x7f;
System.out.println(" c="+Long.toBinaryString(c));
System.out.println(" b="+Long.toBinaryString(b));
}
}
9.1 指数记数法:用e代表底数10.
/**
*<ol>
*<li>Java 编程思想 第四版 第三章 练习9
*<li>题目:
*<li>分别显示用float和double指数记数法所能表示的最大和最小的数字。
*@author RobortZhao
*@version 1.0
*/
public class DecFloatDouble {
public static void main(String [] args){
double Max=java.lang.Double.MAX_VALUE;
double Min=java.lang.Double.MIN_VALUE;
float MAX=java.lang.Float.MAX_VALUE;
float MIN=java.lang.Float.MIN_VALUE;
System.out.println("double Max="+Max);
System.out.println("double Min="+Min);
System.out.println("float MAX="+MAX);
System.out.println("float MIN="+MIN);
}
}
运行结果:
10. 按位操作符
按位与:&
按位或:|
按位异或:^
按位反:~
11. 移位操作符
移位操作符可以和等号一起使用。
12. 三元操作符if-else
和C++中的类似。
13. 字符串操作符+和+=
在前面提到了。
14. 使用操作符时常犯的错误
注意逻辑符号和按位符号区别。
15. 类型转换操作符
程序举例:
public class Casting {
public static void main(String[] args) {
int i = 200;
long lng = (long)i;
lng = i; // "Widening," so cast not really required
long lng2 = (long)200;
lng2 = 200;
// A "narrowing conversion":
i = (int)lng2; // Cast required
}
} ///:~
1.窄化转换:比如将int类型转化为long类型时,要注意。
2.扩展转换:是比较安全的操作。
3.截位和舍入:一般情况下执行的是截尾,如果用java.lang.Math中的round()方法时执行的是舍入。
16. Java中没有sizeof在C/C++中,当我们想知道一个对象或者一个原始数据类型所占用的内存大小时,只需简单调用sizeof操作符即可,但是,在java中是没有相应的操作符或者方法来直接完成相应功能的。
sizeof 在C/C++得到大量的运用,是程序员必不可少的工具之一,那么为什么java却不提供呢?要回答这个问题,我们可以从另外一个角度来看,那就是为什么C/C++中要使用sizeof。
C中要使用sizeof主要是因为C程序员要自己管理堆内存的分配和释放,在使用malloc来获取堆内存时,我们必须知道要创建的对象的具体大小,才能根据对象的具体大小从堆中分配相应大小的动态内存,而获取对象大小这个工作就是通过sizeof来完成的。
到了C++, 我们可以使用操作符new来动态分配内存,这时,对于sizeof的依赖也没有在C时代时那么严重了。在C++中保留sizeof,主要是为了跟C保持兼容。
为什么java中为什么没有sizeof了? java中的内存管理任务直接交给了JVM,这比C++更为彻底。同时,java是一个全新设计的完全面向对象语言,不存在C++向下兼容的问题,因此,java中不存在类似sizeof的操作符。
17. 操作符小结
1.对比int小的数据类型进行算术运算,都会获得一个int值。
2.如果两个足够大的int类型的值相乘,会发生溢出现象。
3.除了boolean以外,任何一种基本类型都可以转化为其他类型。