[读书笔记]Java编程思想第3章之操作符
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[读书笔记]Java编程思想第3章之操作符相关的知识,希望对你有一定的参考价值。
- ==和!=比较对象时比较的是对象的引用,引用到相同的对象时逻辑比较结果为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));
}
}
- 以上代码段输出结果为false:这是由于equals(()默认行为是比较引用,所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为。
- 如果在应该使用String的地方使用了布尔值,则布尔值会自动转换成适当的文本形式。
- 可以使用Integer和Long类的静态方法toBinaryString()可以将参数值转换成对应的二进制补码值。
- 我们将布尔类型作为一种单比特值对待,我们可以对它执行按位“与”、按位“或”、和按位“异或”,但不能执行按位“非”。在移位表达式中,不能使用布尔运算。
- 左移位运算符<<能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补“0”)。“有符号”右移位操作符>>能按照操作符右侧指定的操作数将操作符左边的操作数向右移动。“有符号”右移位使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插1。Java中新增了一种“无符号”右移位操作符>>>,它使用0“扩展”:无论正负,都在高位插入0。
- “移位”可与“等号”(<<=或>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋值给左边的变量。如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的数据,在这种情况下可能会得到-1的结果。
- 如果表达式以一个字符串开头,那么后续的所有操作数都必须是字符串型。
- 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章之访问权限控制