Java 操作符常见问题(基础)

文章目录

  • 前言
  • 一、在最底层,Java中的数据是通过使用操作符来操作的!
  • 二、问题
    • 赋值
    • 关系操作符
    • 逻辑操作符
    • 类型转换操作符
  • 总结


前言

读了Thinking in Java 第三章操作符,自己总结了一些自己感觉重要的一些问题。


一、在最底层,Java中的数据是通过使用操作符来操作的!

二、问题

1.赋值

(1)对基本数据类型赋值是简单的。

        基本数据类型存放了实际的数据,而并非是一个对象的引用。

(2)对对象赋值的时候存在问题
     
  如果我们将一个对象赋值给另一个对象,实际上复制的是对象的引用。我们改变一个对象的字段,另一个对象的相应字段也会被改变。


class Student {
    public int num;
    public int age;

    public Student() {
    }

    public Student(int num, int age) {
        this.num = num;
        this.age = age;
    }

    public void show() {
        System.out.println("num:" + this.num + "age:" + this.age);
    }
}
public class CopyStu {
    public static void main(String[] args) {
        Student s1=new Student(12,13);
        Student s2=s1;
        s1.show();//起初s1的字段的值: num:12age:13
        s2.age=14;//改变s2的age
        s1.show();//s1的字段:num:12age:14   s1的age也随着改变
    }
}

2.关系操作符

(1) ==和!=比较的是对象的引用,尽管对象的内容相同,也是false。 

  基本数据类型直接使用就行。

public class Text1 {
    public static void main(String[] args) {
        Integer i1 = new Integer(47);
        Integer i2 = new Integer(47);
        System.out.println(i1 == i2);//false
        System.out.println(i1 != i2);//true
    }
}

(2)equals()方法 比较的是两个对象的实际内容是否相同,

public class Text1 {
    public static void main(String[] args) {
        Integer i1 = new Integer(47);
        Integer i2 = new Integer(47);
        System.out.println(i1.equals(i2));//true
    }
}

3.逻辑操作符

(1) 短路现象

   一旦确定整个表达式的值,就不会计算剩余表达式的部分。例如:if(true||表达式1||2||3||...)和if(false&&表达式1&&2&&3&&...)

      

public class Test
{
    public static void main(String[] args)
    {
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) {
            if ((++x > 2) && (++y > 2) && (k++ > 2))
            {
                x++;
                ++y;
                k++;
            }
        }
        System.out.println(x + ”” +y + ”” +k);
    }
}

        z=0时候,执行++x > 2,不成立,&&后面就不执行了,此时 x=1,y=0,k=0;

        z=1时候,执行++x > 2,还不成立 ,&&后面就不执行了,此时 x=2,y=0,k=0;

        z=2时候, 执行++x > 2,成立,继续执行 ++y > 2, 不成立  , &&后面就不执行了, 此时 x=3,y=1,k=0;

        z=3时候,执行++x > 2,成立,继续执行++y > 2,不成立  , &&后面就不执行了, 此时 x=4,y=2,k=0;

        z=4 时候,执行++x > 2,成立,继续执行 ++y > 2, 成立  , 继续执行k++>2 ,不成立,此时仍没有进入for循环的语句中, 但此时 x=5,y=3,k=1;  

        z=5时候,不满足条件了,整个循环结束,所以最好打印时候: x=5,y=3,k=1。

4.类型转换操作符

(1)窄化转换

   将能容纳更多信息的数据类型转化成无法容纳那么多的数据类型,这里有着信息丢失的危险,我们需要进行强制类型转换(显性类型        转换)。

(2)扩展转换

   与窄化转换相反,不会造成信息丢失,不必进行显性转换。

public class Text1 {
    public static void main(String[] args) {
        int a=128;
        byte b=(byte) a;//窄化转换,显性
        System.out.println(b);//输出-128 因为byte范围是-128到127
        float c=a;//扩展转换  非显性
        System.out.println(c);//输出128.0
    }
}

 (3)截尾和舍入

      进行窄化转换时考虑截尾和舍入问题

       double和float类型转换为int类型时候对该数据进行截尾,如果想得到舍入的结果需要调用java.lang.Math中的round()方法

       

public class Text1 {
    public static void main(String[] args) {
        double above=0.5,below=0.4;
        float fabove=0.5f,fbelow=0.4f;
        System.out.println(Math.round(above));//1
        System.out.println(Math.round(below));//0
        System.out.println(Math.round(fabove));//1
        System.out.println(Math.round(fbelow));//0
    }
}

 (4)提升

        通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。

        例如:float类型和double类型相乘结果就是double;

                   int和long相加结果就是long类型。


总结

继续加油 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值