JAVA编程思想(2) - 操作符(一)

"在最底层,Java中的数据是通过操作符来操作的。"


1. 使用Java操作符

-操作符接受一个或者多个参数,并生成一个新值,参数的形式与普通的方法调用不用,但效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法与其他编程语言相同。


2. 优先级

-当一个表达式中存在多个操作符时,操作符的优先级就决定了各个部分的计算顺序。

public class Precedence {
    public static void main(String[] args) {
        int x = 1, y = 2, z = 3;
        int a = x + y - 2/2 + z;
        int b = x + (y - 2)/(2 + z);
        System.out.println("a = " + a + " b = " + b);
    } 
}  /* Output
 a = 5 b = 1
 */
这两个语句的区别就在于括号的应用。

-注意,System.out.println()语句中包含“+”操作符,“+”起到了字符串的连接,在必要的时候还会执行“字符串转换”,就会尝试将非String类型转换为String。


3. 赋值

-注意,常数无法作为左值。

-对基本数据类型的赋值很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在赋值的时候,是直接将一个地方的内容复制到另一个地方。对于a=b,修改b后并不会影响到a,这正是我们大多数情况下所期望的。

但是在对对象“赋值”的时候,情况却发生了变化,对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象“的时候,实际上是将“引用”从一个地方复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向原本d指向的那个对象。

class Tank {
    int level;
}

public class Assignment {
    public static void main(String[] args) {
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 9;
        t2.level = 47;
        System.out.println("1: t1.level: " + t1.level +
        ", t2.level: " + t2.level);
        t1 = t2;
        System.out.println("2: t1.level: " + t1.level +
                ", t2.level: " + t2.level);
        t1.level = 27;
        System.out.println("3: t1.level: " + t1.level +
                ", t2.level: " + t2.level);
    }
} /* Output
    1: t1.level: 9, t2.level: 47
    2: t1.level: 47, t2.level: 47
    3: t1.level: 27, t2.level: 27
*/
这个例子很明显的展示了刚刚说的,在这里t1和t2不再是互相独立的。这是由于t1和t2包含了相同的引用,它们指向相同的对象。(原本t1包含的对对象的引用,是指向一个值为9的对象。在t1赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不再被引用的对象会由“垃圾回收器”自动清理)。

-------------------------------------------------------------------------------------------------------------------------

-方法调用中的别名问题:将一个对象传递给方法时,也会产生别名问题。

class Letter {
    char c;
}

public class PassObject {
    static void f(Letter y) {
        y.c = 'z';
    }

    public static void main(String[] args) {
        Letter x = new Letter();
        x.c = 'a';
        System.out.println("1: x.c: " + x.c);
        f(x);
        System.out.println("2: x.c: " + x.c);
    }
} /*
    1: x.c: a
    2: x.c: z
*/
方法f()似乎要在它的作用域内复制其参数Letter y 的一个副本。但是实际上我们传递的是一个引用,所以f()实际改变的是作用域之外的对象。


4. 算术操作符、自动递增和递减、关系操作符、逻辑操作符

-算术操作符、自动递增和递减:Java的基本操作符和递增、递减与其他大多数的程序设计语言是相同的。

-关系操作符:关系操作符生成的是一个boolean(布尔)值,布尔值只有true或false。

-逻辑操作符:与C++和C不同的是:不可以将一个非布尔值当作布尔值在逻辑表达式中使用; ”短路“与C和C++没有出入。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LibNoise分形噪声函数库的JAVA翻译版,个人开发,仅供参考。 包中包含: 异常模块: noise.Exception noise.ExceptionInvalidParam 无效的参数异常。 noise.ExceptionNoModule 无模块异常,无法检索到该源模块 noise.ExceptionOutOfMemory noise.ExceptionUnknown 模型模块: noise.model.Line 线 noise.model.Plane 平面 noise.model.Sphere 球体 noise.model.Cylinder 圆柱 发生器模块: noise.module.Perlin 培林噪声 noise.module.RidgedMulti 脊多重分形噪声 noise.module.Billow 巨浪 value = |perlin_value|*2-1.0; noise.module.Voronoi 细胞噪声,Voronoi图 noise.module.Const 常量 value = const; noise.module.Cylinders 圆柱 noise.module.Checkerboard 棋盘格 value = (floor(x) & 1 ^ floor(y) & 1 ^ floor(z) & 1) != 0 ? -1.0 : 1.0; noise.module.Spheres 球体 选择器模块: noise.module.Select 选择 noise.module.Blend 混合 value = ((1.0 - (modules[3].value+1)/2) * modules[0].value) + ((modules[3].value+1)/2 * modules[1].value); 修饰器模块: noise.module.Invert 倒置 value = -value; noise.module.Abs 绝对值 value = |value|; noise.module.Clamp 截取 value = (value < lowerBound ?lowerBound : value) or (value > upperBound ?upperBound : value);lowerBound:下截取值;upperBound:上截取值 noise.module.Curve 曲线 value = noise.module.Curve.ControlPoint 控制点 noise.module.ScaleBias 偏移缩放, value = value*scale+offset noise.module.Turbulence 湍流 value = modules[0].getValue(x+modules[1].value * power,y+modules[2].value * power,z+modules[3].value * power); noise.module.Exponent 指数 value = (pow(abs((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); 组合模块: noise.module.Add 添加 value = modules[0].value+modules[1].value; noise.module.Max 最大值 value = max(value); noise.module.Min 最小值 value = min(value); noise.module.Multiply 乘法 value = modules[0].value * modules[1].value; noise.module.Power 权重 value = pow(modules[0].value , modules[1].value); 变压模块: noise.module.Displace 位移替换,扭曲 value = modules[0].getValue(x+modules[1].value,y+modules[2].value,z+modules[3].value); noise.module.RotatePoint 点旋转 noise.module.ScalePoint 点缩放,轴缩放 value = modules[0].getValue (x * xScale, y * yScale,z * zScale); noise.module.Terrace 露台,梯台 noise.module.TranslatePoint 位移变换 value = modules[0].getValue (x * xTranslation, y * yTranslation,z * zTranslation); 其他: noise.module.Cache 缓存 value = noise.module.Module 噪声模块基类 如果发现有要更改的地方,请发邮件给我,或者本人QQ:343179390,欢迎技术探讨
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值