zoukankan      html  css  js  c++  java
  • 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. 赋值

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

    -对基本数据类型的赋值非常easy的。基本类型存储了实际的数值,而并不是指向一个对象的引用,所以在赋值的时候,是直接将一个地方的内容拷贝到还有一个地方。对于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++没有出入。



  • 相关阅读:
    C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
    [AngularJS + Webpack] Requiring CSS & Preprocessors
    [AngularJS + Webpack] Requiring Templates
    [AngularJS + Webpack] ES6 with BabelJS
    [Flux] 3. Actions
    [RxJS] Aggregating Streams With Reduce And Scan using RxJS
    [RxJS] map vs flatMap
    [RxJS] Stream Processing With RxJS vs Array Higher-Order Functions
    [MODx] Solve cannot upload large file
    [React + webpack] hjs-webpack
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4550364.html
Copyright © 2011-2022 走看看