Java编程思想学习笔记(六)

第三章 操作符

3.1更简单的打印语句

//之前的标准Java打印语句
System.out.println("Hello world!");
//简化之后的打印语句
import static net.mindview.util.Print.*;
public class HelloDate{
    public static void main(String[] args){
        print("Hello,it`s:");
        print(new Date());
    }    
}

这里之所以可以直接使用print方法是因为上面的static类型的import语句导入了mindview库中实现的print方法,一般若是程序中大量的使用输出语句,可以使用这种编写方法。

(本章内容比较基础,就挑一些没见过的东西写一下了)

1.在对对象赋值时,真正操作的是对象的引用,而不是对象,所以在”将一个对象赋值给另外一个对象“的时候,实际上是将这个对象的”引用“从一个地方复制到另一个地方,举个例子:赋值语句c=d;执行之后,c和d都会指向原本只有d指向的那个对象。考虑下面一段程序:

public class proj1 {
    public static void main(String[] args){
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 10;
        t2.level = 20;
        t1 = t2;
        System.out.println(t1.level);//20
        System.out.println(t2.level);//20
        t2.level = 30;
        System.out.println(t1.level);//30
        System.out.println(t2.level);//30
    }
}
class Tank{
    int level;
}

举个形象的例子:有两块蛋糕,上面各插了a和b两个标签,我们执行a = b;这个语句相当于将a标签拔下来插到b标签的蛋糕上,Java的垃圾回收器会自动将没有标签的蛋糕清理掉。这个现象被成为”别名现象“。上述例子中的t1由于不再被引用,也就会被垃圾回收器回收。

补充:下面的基本类型的例子不涉及到这种情况

int a = 10;
int b = 20;
a = b;//这时a、b皆为20
b = 30;//由于这里是基本类型,所以说a仍是20,而b为30

那么怎么消除这种现象的影响,可以使用下面的写法:

t1.level = t2.level;//20 30

这样就保持了两个对象的彼此独立,不会使二者绑定到相同的对象上。

2.方法调用中的别名问题

public class proj1 {
    static void f(LetterM y){
        y.c = 'z';
        System.out.println(y.c);
    }
    public static void main(String[] args){
        LetterM a = new LetterM();
        a.c = 'a';
        System.out.println(a.c);
        f(a);
        System.out.println(a.c);
    }
}
class LetterM{
    char c;
}
//输出结果:a z z

实际上传入方法f()中的是一个引用,所以说代码执行完毕之后,修改的是方法f()之外的对象。

3.三元操作符if-else:有三个操作数,最终也会生成一个值,其一般格式为:

boolean-exp ? value0 : value1
//boolean-exp:布尔表达式
//若布尔表达式结果为真,那么计算value0,否则计算value1,并且返回相应value的计算结果

4.类型转换操作符(cast)

int i = 100;
long lng1 = (long)i;
long lng2 = (long)200;
//括号里的是你希望得到的类型,可以对变量进行类型转换,也可以对数值进行类型转换,但是Java的编译器有时候会自动的进行这些转换,有时候我们的是多余的,但是这并没有坏处

类型转换分为窄化转换扩展转换,窄化转换是将可以容纳更多信息的数据类型转化为容量更小的数据类型,这可能会导致信息丢失,这时编译器会强制我们进行显式的类型转换;但对于扩展转换,就不会有信息丢失的风险,也就不必要进行显式转换。

上面说到窄化转换会涉及到信息的丢失,这个问题被称作”截尾“,简单的说就是将小数点之后的数字截去(29.7->29)。若是想要进行四舍五入,就需要调用java.lang.Math库中的round()方法(这个不需要专门导入)。

进行运算时,如果类型小于int,那么就会先转成int在进行运算。通常情况下,表达式中出现的最大的数据类型决定了这个表达式最终结果的数据类型。

5.Java没有sizeof()

c和c++中有sizeof()的最大作用是方便进行移植,但是对于Java,不管在何种机器上,数据类型的大小都是相同的,这在语言设计中就已经规定好了,所以说不用sizeof()。

2.12上传 第三章读完

P97

原文地址:https://www.cnblogs.com/aLieb/p/14399030.html