[读书笔记]Java编程思想第3章之操作符

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[读书笔记]Java编程思想第3章之操作符相关的知识,希望对你有一定的参考价值。

  1. ==和!=比较对象时比较的是对象的引用,引用到相同的对象时逻辑比较结果为true;如果想比较对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals(),此方法不适用于基本类型的比较。
class Value{
	int i;
}

public class EqualsMethods2{
	public static void main(String[] args)
	{
		Value v1 = new Value();
		Value v2 = new Value();

		v1.i = v2.i = 100;

		System.out.println(v1.equals(v2));
	}
}
  1. 以上代码段输出结果为false:这是由于equals(()默认行为是比较引用,所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为。
  2. 如果在应该使用String的地方使用了布尔值,则布尔值会自动转换成适当的文本形式。
  3. 可以使用Integer和Long类的静态方法toBinaryString()可以将参数值转换成对应的二进制补码值。
  4. 我们将布尔类型作为一种单比特值对待,我们可以对它执行按位“与”、按位“或”、和按位“异或”,但不能执行按位“非”。在移位表达式中,不能使用布尔运算。
  5. 左移位运算符<<能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补“0”)。“有符号”右移位操作符>>能按照操作符右侧指定的操作数将操作符左边的操作数向右移动。“有符号”右移位使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插1。Java中新增了一种“无符号”右移位操作符>>>,它使用0“扩展”:无论正负,都在高位插入0。
  6. “移位”可与“等号”(<<=或>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋值给左边的变量。如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的数据,在这种情况下可能会得到-1的结果。
  7. 如果表达式以一个字符串开头,那么后续的所有操作数都必须是字符串型。
  8. Java允许我们把任何基本数据类型转换成别的数据类型,但布尔类型除外,后者根本不允许进行任何类型的转换处理。

练习1: 使用“简短的”和正常的打印语句来编写一个程序。

练习2: 创建一个包含一个float域的类,并用这个类来展示别名机制。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version  2021/9/18 11:59
 */
public class Test2 {
    public static void main(String[] args) {
        Temp temp1 = new Temp();
        Temp temp2 = new Temp();

        temp1.data = 111;
        temp2.data = 222;

        System.out.println("temp1.data = " + temp1.data + "; temp2.data = " + temp2.data);

        temp1 = temp2;      // 将temp1与temp2绑定,temp1引用到temp2指向的对象

        System.out.println("temp1.data = " + temp1.data + "; temp2.data = " + temp2.data);

        temp1.data = 1111;
        temp2.data = 2222;

        System.out.println("temp1.data = " + temp1.data + "; temp2.data = " + temp2.data);
    }

}

class Temp {
    float data;
}

练习3: 创建一个包含一个float域的类,并用这个类来展示方法调用时的别名机制。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 17:28
 */
public class Test3 {
    static void setValue(Number num){
        num.number = 250;
    }

    public static void main(String[] args) {
        Number n = new Number();

        /**
         * 通过Number类的对象,设置Number类的字段值为380
         */
        n.number = 380;

        System.out.println("Before call function setValue, number = " + n.number);

        // 传递对象的引用n给方法setValue
        setValue(n);

        System.out.println("After call function setValue, number = " + n.number);
    }
}

class Number {
    int number;
}

练习4: 编写一个计算速度的程序,它所使用的距离和时间都是常量。

package thinkinjava.charpenter3;

import java.util.Scanner;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 17:39
 */
public class Test4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        float distance = scanner.nextFloat();
        float time = scanner.nextFloat();
        float speed = distance / time;

        System.out.println("Speed = " + speed);
    }
}

练习5: 创建一个名为Dog的类,它包含两个String域:name和says。在main()方法中,创建两个Dog对象,一个名为spot(它的叫声为"Ruff!"),另一个名为scruffy(它的叫声为“Wurf!”)。然后显示它们的名字和叫声。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 17:43
 */
public class Test5 {
    public static void main(String[] args) {
        /**
         * create two objects about class Dog
         */
        Dog dog1 = new Dog("spot","Ruff!");
        Dog dog2 = new Dog("scruffy", "Wurf!");

        /**
         * Print the message
         */
        System.out.println(dog1.name + "---" + dog1.says);
        System.out.println(dog2.name + "---" + dog2.says);
    }
}

class Dog {
    String name;
    String says;

    /**
     * Set the name and the wow about the Dog class
     * @param name The name about the dog
     * @param says The wow about the dog
     */
    Dog(String name, String says) {
        this.name = name;
        this.says = says;
    }
}

练习6: 在练习5的基础上,创建一个新的Dog索引,并对其复制为spot对象。测试用==和equals()方法来比较所有引用的结果。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 19:05
 */
public class Test6 {
    public static void main(String[] args) {
        /**
         * create two objects about class Dog
         */
        Dog1 spot = new Dog1("spot", "Ruff!");
        Dog1 scruffy = new Dog1("scruffy", "Wurf!");
        Dog1 you = new Dog1("HSL", "wang");

        /**
         * Print the message
         */
        System.out.println(spot.name + "---" + spot.says);
        System.out.println(scruffy.name + "---" + scruffy.says);
        System.out.println(you.name + "---" + you.says);

        you = spot;

        /**
         * Use operator == and equals() method to compare the object between you and spot
         */
        System.out.println(you == spot);
        System.out.println(you.name == spot.name);
        System.out.println(you.says == spot.says);
        System.out.println(you.equals(spot));
    }
}

class Dog1 {
    String name;
    String says;

    /**
     * Set the name and the wow about the Dog class
     * @param name The name about the dog
     * @param says The wow about the dog
     */
    Dog1(String name, String says) {
        this.name = name;
        this.says = says;
    }
}

练习7: 编写一个程序,模拟扔硬币的结果。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 19:16
 */
public class Test7 {
    public static void main(String[] args) {
        int num = Math.random() > 0.5 ? 1 : 0;

        if (num == 1) {
            System.out.println("正面");
        } else {
            System.out.println("反面");
        }
    }
}

练习8: 展示用十六进制和八进制计数法来操作long值,用Long.toBinaryString()来显示结果。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 19:30
 */
public class Test8 {
    public static void main(String[] args) {
        long num1 = 0X7abcdef;  // 十六进制
        long num2 = 0765456;    // 八进制

        System.out.println(num1);
        System.out.println(num2);

        System.out.println(Long.toBinaryString(num1));
        System.out.println(Long.toBinaryString(num2));
    }
}

练习9: 分别显示用float和double指数记数法所能表示的最大和最小的数字。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 19:34
 */
public class Test9 {
    public static void main(String[] args) {
        double maxD = Double.MAX_VALUE;
        double minD = Double.MIN_VALUE;
        float maxF = Float.MAX_VALUE;
        float minF = Float.MIN_VALUE;

        System.out.println("Max double = " + maxD);
        System.out.println("Min double = " + minD);
        System.out.println("Max float = " + maxF);
        System.out.println("Min float = " + minF);
    }
}

练习10: 编写一个具有两个常量值的程序,一个具有交替的二进制位1和0,其中最低有效位为0,另一个也具有交替的二进制位1和0,但是其最低有效位为1(提示:使用十六进制常量来表示时最简单的方法)。取这两个值,用按位操作符以所有可能的方式结合运算它们,然后用Integer.toBinaryString()显示。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/18 19:43
 */
public class Test10 {
    public static void main(String[] args) {
        int num1 = 1 + 4 + 16 + 64;
        int num2 = 2 + 8 + 32 + 128;

        System.out.println("num1 = " + Integer.toBinaryString(num1));
        System.out.println("num2 = " + Integer.toBinaryString(num2));

        System.out.println("num1 & num2 = " + Integer.toBinaryString(num1 & num2));
        System.out.println("num1 | num2 = " + Integer.toBinaryString(num1 | num2));
        System.out.println("num1 ^ num2 = " + Integer.toBinaryString(num1 ^ num2));
        System.out.println("~num1 = " + Integer.toBinaryString(~num1));
        System.out.println("~num2 = " + Integer.toBinaryString(~num2));
    }
}

练习11: 以一个最高有效位为1的二进制数字开始(提示:使用十六进制常量),用有符号操作符对其进行右移,直至所有的二进制位都被移除为止,每移一次都要使用Integer.toBinaryString()显示结果。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 8:25
 */
public class Test11 {
    public static void main(String[] args) {
        int num = 0X80000000;

        System.out.println(Integer.toBinaryString(num));
        for(int i = 0; i < 32; i++)
        {
            num >>= 1;
            System.out.println(Integer.toBinaryString(num));
        }
    }
}

练习12: 以一个所有位都为1的二进制数字开始,先左移它,然后用无符号右移操作符对其进行右移,直至所有的二进制位都被移出为止,每移一位都要使用Integer.toBinaryString()显示结果。

package thinkinjava.charpenter3;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 8:32
 */
public class Test12 {
    public static void main(String[] args) {
        int num = 0Xffffffff;

        System.out.println("=====Before move=====");
        System.out.println(Integer.toBinaryString(num));

        System.out.println("=====Left moving=====");
        for (int i = 0; i < 31; i++) {
            num <<= 1;
            System.out.println(Integer.toBinaryString(num));
        }

        System.out.println("=====Right moving with >> =====");
        for (int i = 0; i < 31; i++) {
            num >>= 1;
            System.out.println(Integer.toBinaryString(num));
        }

        System.out.println("=====Right moving with >>> =====");
        for (int i = 0; i < 32; i++) {
            num >>>= 1;
            System.out.println(Integer.toBinaryString(num));
        }
    }
}

练习13: 编写一个方法,它以二进制形式显示char类型的值。使用多个不同的字符来展示它。

package thinkinjava.charpenter3;

import java.util.Scanner;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 8:40
 */
public class Test13 {
    /**
     * Display the char's every binary bit
     * @param ch A character
     */
    public static void charToBinaryString(char ch){
        System.out.println(Integer.toBinaryString(ch));
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        /**
         * Input a string
         */
        System.out.print("Please enter a string:");
        String string = scan.nextLine();

        /**
         * Charge the every character of the string
         */
        for(int i = 0; i < string.length(); i++){
            char ch = string.charAt(i);
            charToBinaryString(ch);
        }
    }
}

练习14: 编写一个接收两个字符串参数的方法,用各种布尔值的比较关系来比较这两个字符串,然后把结果打印出来。做==和!=的同时,用equals()作测试。在main()里面用几个不同的字符串对象来调用这个方法。

package thinkinjava.charpenter3;

import java.util.Scanner;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 9:04
 */
public class Test14 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] strings = new String[5];

        /**
         * Input five strings, compare them with each other
         */
        System.out.println("Please input five strings");
        for (int i = 0; i < 5; i++) {
            strings[i] = scanner.nextLine();
        }

        /**
         * Call compareTwoStrings method to compare the two strings
         */
        for (int i = 0; i < [读书笔记]Java编程思想第6章之访问权限控制

[读书笔记]Java编程思想第8章之多态

[读书笔记]Java编程思想第7章之复用类

[读书笔记]Java编程思想第5章之初始化与清理

[读书笔记]Java编程思想第9章之接口

[读书笔记]Java编程思想第2章之一切都是对象