- 외부 패키지를 사용하여
- 자바를 사용하여 운영자
- 우선
- 할당
- 산술 연산자
- 자동 증가 및 감소
- 관계 연산자
- 논리 연산자
- 상수 직접
- 비트 연산자
- 시프트 연산자
- 문자열 연산자 + = + 및
- 사용 사업자는 종종 실수 연산을
- 변환 연산자
- 를 sizeof
1. 외부 클래딩
환경에 외부 패키지를 추가 :
가. CLASSPATH 환경 변수 절대 경로 컴퓨터의 외부 클래딩 추가
나. * //이 패키지 또는 방법의 모든 클래스를 가져옵니다 가져 오기 정적 패키지 이름을 사용하여
2. 운전자 자바
오퍼레이터는 하나 개 이상의 매개 변수를 사용하고, 새로운 값을 발생시킨다. 일반적인 방법의 형식 매개 변수는 서로 다른 호출하지만 효과는 동일합니다. +, -, *, /, = 다른 프로그래밍 이유와 유사 운영자.
운영자는 새로운 값을 생성 할뿐만 아니라, 일부 운영자는 또한 피연산자 자체의 값을 다를 수있다. 이는 "부작용"이라고합니다. 사용하는 사업자의 수를 변경할 수 있습니다 운영자는 가장 흔한 부작용이며, 값이 값은 부작용이 동일하지 생산했다.
거의 모든 사업자는 "기본 유형을."작동 할 수 있습니다
운영자 예외 : "=" "=", "=="이러한 연산자는 모든 개체를 조작 할 수 있습니다. 또한, String 클래스는 "+"와 "+ =."지원
3. 우선 순위
간단한 규칙 : 제 덧셈과 뺄셈, 곱셈과 나눗셈 후의
괄호의 사용은 괄호를 먼저 계산
String 형의 요소의 경우, "+"는 문자열이 아닌 유형, 그것은 문자열로 변환하려고합니다 경우 문자열 연결하고, "+"는 다음을 의미합니다
4. 할당
"="오른쪽 값을 가져가 왼쪽에있는 변수에 복사합니다. (값을 생성 할 수 있습니다) 어떤 상수, 변수, 표현식, 좌변은 명확라는 이름의 변수를해야합니다 : 오른쪽 값이 될 수 있습니다. 즉, 등호의 우변의 값을 저장하기위한 물리적 공간이 있어야한다.
기본 데이터 타입의 할당은 간단한 기본 유형이 실제 값을 저장하고있다 가 아닌 객체 참조 . 따라서, 변수, 또 다른 곳으로 한 곳에서 직접 사본에 할당시.
객체 "할당", 실제 작업은 객체를 참조합니다. 다른 개체에 개체의 할당을 말할 경우, 참조 실제로 한 장소에서 다른 장소로 복사됩니다. C = D 후, C 및 D는 그 오브젝트를 가리키는 경우에만 D 가리키는 하였다.
별칭 문제 메서드 호출
앨리어싱 문제 :
当将同一个类的一个对象引用赋值给另一个对象时引用,原来的对象引用会被覆盖,不再被引用的对象会由垃圾回收器自动清理。
在许多编程语言中,方法f()似乎要在他的作用域内复制其参数Letter y的一个副本;但实际上只是传递了一个引用。所以代码行:y.c = 'z';实际上改变的是f()之外的对象。
5.算术操作符
+,-,/,*,%(取模);
整数除法直接去掉小数位,而不是四舍五入。
随机生成数字:
1).首先创建一个Random类的对象,Random rand = new Random(47);如果创建过程中没有传递任何参数,Java会将当前时间作为随机数生成器的种子。这样的话,每次运行都将产生不同的值
47就是提供的随机数种子。
2).方法nextInt()和nextFloat()就可以获得随机产生的数字。(nextLong()和nextDouble()同样有效)
一元减号用于改变数据的符号,一元加无特殊意义,只是为了与一元减相对应。
6.自动递增和递减
前缀递增和前缀递减(++a,--a):先执行运算,再生成值
后缀递增和后缀递减(a++,a--):先生成值,再执行运算
7.关系操作符
关系操作符生成的是一个boolean结果,它们操作的是操作数的值之间的关系。如果关系为真,返回true;如果关系为假,生成false。
关系操作符有:<,>,<=,>=,==,!=
等于和不等于适用于所有的基本数据类型,而其他的比较符不适用于boolean类型。因为boolean只能为true和false。“大于”或“小于”没有实际意义。
测试对象的等价性
关系操作符==和!=也适用于所有对象
这里尽管对象的内容相同,然而对象的引用却是不同的,而==和!=比较的是对象的引用。对于基本数据类型,变量不是引用,而是真实的值,所以对于基本数据类型可以比较数值是否相等。
要比较对象的实际内容需要使用特殊的方法:equals(),这个方法不适用于基本数据类型。基本数据类型直接使用==和!=即可。
8.逻辑操作符
逻辑操作符:“与”(&&),“或”(||),“非”(!)。可根据参数的逻辑关系,生成一个布尔值(true或false)。
“与”,“或”,“非”操作只可应用于布尔值。这与C++有显著区别,Java不允许将一个非布尔值(比如:int(3))当做布尔值(非0)在逻辑表达式中使用。
如果在使用String值的地方使用了布尔值,布尔值会自动转换成适当的文本形式。
可将int类型替换成除布尔值以外的其他任何基本数据类型。
短路
一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了。因此整个逻辑表达式靠后的部分有可能不会被运算。“与”运算时,碰到逻辑表达式为0即可停止,“或”运算时,碰到逻辑表达式为1即可停止,后面的不再计算。
因为test2(2)是false,所以不会再去计算test3(),既可直接得到boolean b的结果。
9.直接常量
直接常量后面的后缀字符标志了它的类型。若为大写(或小写)的L,代表long。
大写(或小写)字母F,代表float;
大写(或小写)字母D,代表double。
十六进制数适用于所有整数数据类型,以前缀0x(或0X),后面跟随0-9或小写(或大写)的a-f来表示。
如果试图将一个变量初始化成超出自身表示范围的值(无论这个值的数值形式如何),编译器都会报告一条错误信息。
char,byte以及short如果超出范围,会自动转换成int型,并提示需要对这次赋值进行“窄化转型”;
short,char:16位;byte:8位;int:32位。
八进制由前缀0以及后续的0~7的数字表示。
使用Integer和Long类的静态方法toBinaryString()可以很容易地实现将相应的类型转换为二进制数。C++和Java都没有二进制的直接表示方法。
指数计数法:
Java采用了一种很不直观的计数法来表示指数,例如:
“e”代表自然对数的基数,大写小写都可以。约等于2.718(Java中的Math.E给出了更精确的double型值),例如1.39xe^(-43)意味着1.39x2.178^(-43)次方,但是在Java中,e表示的是以10为底,所以这个表示的含义是:1.39x10^(-43).
如果编译器能够正确地识别类型,就不必在数值后附加字符,例如语句:long n3 = 200;不存在含混不清的地方,所以200后面的L是用不着的。然而,对于语句:
float f4 = 1e-43f;编译器通常会将指数作为双精度(double)处理,如果没有f, 就会收到出错提示:必须使用类型转换将double转换成float。
10.按位操作符
按位操作符用来操作整数基本数据类型中的单个"比特"(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
如果两个输入位都是1,则按位“与”操作符(&)生成一个输出位1;否则生成一个输出位0。
如果两个输入位只要有一个1,则按位“或”操作符(|)生成一个输出位1,否则输出0(两个输入都是0)。
如果输入位的某一个是1,但不全是1,那么按位“异或”操作(^)生成一个输出位0。
按位“非”(~),也称为取反操作符,是一个一元操作符,只对一个操作数进行操作。按位"非"生成与输入位相反的值---若输入0,则输出1;若输入1,则输出0.
按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=、|=、^=都是合法的,由于“~”是一元操作符,所以不可与“=”联合使用。
将布尔类型作为一种单比特对待,可对它执行按位“与”,按位“或”,按位“异或”;但是不能执行按位“非”(大概是为了避免与逻辑NOT混淆);按位操作符具有与逻辑操作符相同的效果,只是它们不会中途“短路”。
11.移位操作符
移位操作符的运算对象是二进制的“位”。移位操作符只可用来处理整数类型。包括左移操作符(<<)和有符号右移操作符(>>)
左移操作符:按照操作符右侧制定的位数将操作符左边的操作数向左移动(低位补0)
有符号右移操作符:按照操作符右侧指定的位数将操作符左边的操作数向右移动;“有符号”右移操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插入1
“无符号”右移操作符(>>>):使用“零扩充”:无论正负都在高位插入0。
若对char,byte和short类型的数值进行移位操作,移位前会先将其转换为int类型,并且得到的结果也是一个int型。且只有数值右端的低5位才有用,这样可防止移位超过int型数值所具有位数(2的5次方为32,int只有32位。)
若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。
"移位"可与"等号"(<<=或>>=或>>>=)组合使用,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。
在进行“无符号”右移操作时可能会遇到一个问题:若对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能会得到-1的结果。
结果:
无符号右移操作,在高位添0
结果:
无符号右移,在高位添0
结果:
先将short转换成int,为什么结果也是32位?
结果:
byte先转换为int,为什么结果还是32位?
结果:
这个移位操作后没有将值赋回给b,所以其结果是正确的。
12.三元操作符if-else
三元操作符也称为条件操作符,它有三个操作数,最终生成一个值,形式如下:
boolean-exp ? value0 : value1
如果boolean-exp(布尔表达式)的结果为true,就计算value0,否则计算value1,并将结果赋值给操作数。
13.字符串操作符+和+=
这个操作符在Java中有一项特殊用途:连接不同的字符串,这是一个操作符重载
如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串型(编译器会把双引号内的字符序列自动转成字符串)
对于操作符“=”和“+=”,只要前后出现了一个字符串,就会被编译器当成是字符串连接符。
对于语法:""+int(0);显示的是字符串:0,这样做的意义就是免去了调用Integer.toString()的繁琐,即可执行字符串转换的方式。
14.使用操作符时常犯的错误
Java不会自动的将int型数值转换为boolean值。
15.类型转换操作符
类型转换的原意是“模型铸造”,在适当的时候,Java会将一种数据类型自动转换为另一种。
若将一个整数值赋给一个浮点型变量,编译器会将int自动转换成float,类型转换允许显示地进行这种类型的转换。
在不能自动进行转换时,在需要的情况下可以进行强制类型转换。强制类型转换需要将希望得到的数据类型置于圆括号内,放在要进行类型转换的值的左边。
编译器在必要的时候会自动进行int值到long值的提升,但是仍然可以使用程序做这种多余的事情,以提醒自己需要留意。
窄化转换:将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型,比如:long->int,这种操作可能会出现信息丢失的危险,这时必须显示地进行类型转换。
扩展转换:与窄化转换相对,这种转换可以不必显式地进行类型转换,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失。
Java允许我们把任何基本数据类型转换成别的基本数据类型,但是boolean除外,布尔型不允许任何类型的转换。
“类”数据类型不允许进行类型转化,为了将一种类转换成另一种,必须采用特殊的方法(向上转型/泛型)
截尾和舍入:
在执行窄化转换时,必须注意截尾与舍入的问题:例如:浮点型29.7转换为int,结果是29还是30。
将float或double转型为整形时,总是对该数字执行截尾。若想得到舍入误差,需要使用java.lang.Math中的round()方法。
如:
提升:
如果对基本数据类型执行算术运算或按位运算,只要类型比int小(即char,byte,short),那么运算前,这些值会自动转换成int,且最终生成的结果也是也是int类型。
如果想把结果赋给较小的类型(可能会出现信息丢失),就必须使用类型转换。
通常,如果一个float值与一个double值相乘,结果是double;如果一个int和一个long值相加,结果为long。
16.Java没有sizeof
C/C++中,sizeof()操作符可以告诉你数据项分配的字节数。C/C++中使用sizeof()最大的原因就是为了“移植”。Java不需要sizeof()的原因就是因为所有数据类型在所有机器中的大小都是相同的,不必考虑移植问题。