您的位置:首页 > 编程语言 > Java开发

《 Java 编程思想》CH03 操作符

2020-03-01 05:23 99 查看

《Java编程思想》CH03操作符

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

操作符

  • ,
    -
    ,
    *
    ,
    *
    =
    与其他语言类似
  • 几乎所有的操作符只能操作“基本类似”,而
    =
    ==
    !=
    是例外
  • String类支持
    =
    操作符,表示拼接操作,在进行拼接的操作会尝试将非String的元素转换为String(调用tostring())
  • 赋值操作符
    =
    的左边(左值)必须是一个明确的已命名的变量。

赋值

在为对象“赋值”时,其实质是拷贝“引用”,需要注意“别名现象”

packagecom.company.ch03;

classTank{
intlevel;
}

publicclassAssignment{
publicstaticvoidmain(String[]args){
Tanktank1=newTank();
Tanktank2=newTank();
tank1.level=12;
tank2.level=13;
System.out.println("tank1="tank1.level);
System.out.println("tank2="tank2.level);

tank1=tank2;
tank1.level;
System.out.println("tank1="tank1.level);
System.out.println("tank2="tank2.level);
}
}
//tank1=12
//tank2=13
//tank1=14
//tank2=14

方法调用中的别名问题

packagecom.company.ch03;

classLetter{
charc;
}

publicclassPassObject{
staticvoidf(Lettery){
y.c='z';
}

publicstaticvoidmain(String[]args){
Letterx=newLetter();
x.c='a';
System.out.println("x.c="x.c);//a
f(x);
System.out.println("x.c="x.c);//z
}
}

不管是那种别名问题,关键是要理解到拷贝的是引用,不是对象。

算数操作符&自增与自减&按位操作符

  • 整数除法不会四舍五入,而是直接舍去小数位
  • 其余与C中的一样

关系操作符

关系操作符与C也是类似,有一点比较特殊的是在Java中

==
!=
可以用在对象上,其比较的是引用,而不是对象内的值,如果要比较两个对象是否相等(语义上),通常调用
equals
函数来比较。

Integern1=newInteger(47);
Integern2=newInteger(47);
n1==n2;//false
n1.equals(n2);//true

equals
默认是比较引用,所以在自己实现的类中需要覆盖
equals
方法才能进行语义上的比较

逻辑操作符

&&
,
||
!
操作只能用于布尔值,与C不同,对一个非布尔值进行逻辑运算不会对该值强制转换,会报编译错误

Java中的逻辑操作符也有“短路”现象

直接常量

  • 十六进制
    0x/0X
    前缀
    0-9
    a-f
  • 八进制
    0
    前缀
    0-8
  • 后缀
    l/L
    表示
    long
    类型
  • 后缀
    f/F
    表示
    float
    类型
  • 后缀
    d/D
    表示
    double
    类型
  • 指数记数法:
    1.39E-43
    表示$1.39timese^{-43}$

移位操作符

  • 移位操作符只能用于处理整数类型
  • >>
    符号扩展,
    >>>
    0扩展
  • 对char、byte、short类型进行移位运算,在进行移位之前会先转回为int

三元运算符

boolean-exp?value0:value1

字符串操作符
=

  • 字符串中操作符
    =
    表示“拼接”操作
  • 如果一个表达式以字符串开头,那么其后续操作数都必须是字符串类型(不是则进行强制转换)

类型转换操作符

类型转换(

cast
)是指,在适当的时候,Java会将一种数据类型自动转换为另一种。

显式的类型转换如下:

inti=200;
longl=(long)i;
intj=(int)l;

类型转换:

  • 窄式转换,需要显式指定(如long转int)
  • 扩展转换,无需显式指定(如int转long)
  • Java允许任何基本类型之间的类型转换,除了布尔值。
  • “类”数据类型不允许类型转换

截尾和舍入

  • 当float或double转向整型时,总是对数字进行截尾
  • 如果需要舍入,可以调用
    java.lang.Math.round()

提升

一个表达式中出现的最大的数据类型决定了该表达式最终结果的数据类型,如int类型与long类型相加,得到一个long类型。

Java没有sizeof

由于Java中所有基本数据类型的大小都是明确的,所以不需要sizeof。BTW,boolean不是没有明确嘛。

本文首发于Code&Fun

  • 点赞
  • 收藏
  • 分享
  • 文章举报
wuxiaobai24 发布了8篇原创文章·获赞0·访问量292 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: