Java 编程思想——第三章 操作符总结

在最底层,java中的数据是通过使用操作符来操作的。 

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以外,任何一种基本类型都可以转化为其他类型。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值