除了8种基本数据类型,其他所有类型都是引用数据类型,包括类、接口、数组。引用数据类型默认初始值都是null。
String是一个类,表示字符串(后面详讲),所有字符串,就是一串字符,也就是N个字符连接在一起(N可以表示0或多个),好比羊肉串。
字符串都得使用"" 括起来的,连接字符使用 “ + ” 符号。
字符串拼接:字符串和任意数据类型相连接,结果都是字符串类型.
转义字符号练习:输出: "你好世界"
System.out.println(8 + 7 + "Hello");//结果是15Hello
System.out.println("Hello" + 7 + 8);//结果是Hello78
System.out.println(7 + "Hello" + 8);//结果是7Hello8
String str = 17 + "ABC";//组成一个字符串
System.out.println(str);//17ABC
String str 2 =(String)17 + "ABC";//编译错误:不可转换的类型
当要表示的数据超出数据类型的临界范围时,称为溢出。溢出情况发生时程序并没有做数据范围检查处理,此时会出现数据紊乱情况。
int最大值
int intMax = 2147483647;
分析数据发生紊乱的原因.
在8大基本类型中,boolean不属于数值类型,不参与转换.
转换规则其实就是各自数据类型的空间大小.看图
把不同的数据类型看成是不同容量的容器.
byte是一个字节,最多只能装1斤水.
short是2个字节,最多只能装2斤水.
自动类型转换,也称为“隐式类型转换”:
当把小数据范围类型的数值或变量赋给另一个大数据范围类型变量,系统可以完成自动类型转型。这好比把装一斤水容器里的水倒进可以装两斤水的容器里一样。
再次强调:boolean 类型是不可以转换位其他数据类型。
一般地,byte,short,char不参与转换操作.
我们直接把byte,short,char直接赋给int类型.
强制类型转换,也称为“显示类型转换”:
当把大范围类型的数值或变量赋给另一个小范围类型变量时,此时系统不能自动完成转换,需要加上强制转换符,但这样的操作可能造成数据精度的降低或溢出,所以使用时要格外注意。
这就好比把装两斤水容器里的水倒在可以装一斤水的容器里,是可能造成水溢出的。若要坚持把4斤苹果塞进一个装3斤的袋子里,我们要怎么办?动用暴力。
强制类型转换,可能造成溢出和精度损失。
问题:
为什么byte c = 5这是符合强转类型转换条件的,可为什么没转呢?
当一个算术表达式中包含多个基本数据类型(boolean除外)的值,整个算术表达式的数据类型将在数据运算时出现类型自动提升,其规则是:
所有的byte、short、char类型被自动提升到int类型;
整个表达式的最终结果类型被提升到表达式中类型最高的类型;
double d1 = 123 + 1.1F + 99L +3.14;
System.out.println('a' + 1);//98
byte b = 22;
b = b + 11;//编译出错,此对结果类型应该是int
判断以下表达式的结果类型:
short s = 10;
byte a = 2;
int i = 5;
float f = 10.0F;
double d = 35.0;
(s/a) -(f / s) - (d + i)
String和任意数据使用+连接起来,结果都是string(字符串).
Arithmetic oprators
用来处理四则运算的符号
加号:在操作数值、字符、字符串时其结果是不同的,当两个字符相加得到的是ASCII码表值,
当两个字符串相加时表示将两个字符串连接在一起,从而组成新的字符串。
除号:整数在使用除号时,得到的结果仍为整数(小数部分忽略),当整数除以0的时候,会引发算数异常。
正无穷大(Infinity):当一个正浮点类型数除以0时,或者正整数除以0.0时;
负无穷大(-Infinity):当一个负浮点类型数除以0时,或者正整数除以0.0时;
NaN(Not a number):当0.0除以0.0时:
取模(求余数):模数的符号忽略不计,结果的正负数取决于被模数.
注意:无穷大和NaN都属于double浮点类型,但是所有正无穷大数都是相等的,所有负无穷大也是相等的,NaN永远不相等,也不等于自己.
++和--详解:都只能操作变量,不能操作常量.
++:表示当前操作变量自己累加1.
--:表示当前操作变量自己减去1.
自增:++,递增运算符,使变量值增加1,有前置和后置之分,只能操作变量。
自减:--,递减运算符,使变量值减去1,有前置和后置之分,只能操作变量。
自增和自减具体操作是一样的,仅仅是一个是加1,一个是减1而已,现在单讲++:
代码 result ++和 ++result,都将使result变量的值加1。
唯一的区别是:
前置(++result):表示对result加1之后的结果进行运算,
后置(result++):表示对result变量加1之前的值(原始值)进行运算。
如果仅仅执行简单的操作(只写result++或++result),那么选用任意一个都可以。
面试题分析:
public static void main(String[] args){
int num1 = 1;
num1 = num1 ++;
System.out.println(num1);//1
int num2 = 1;
num2 = ++ num2;
System.out.println(num2);//2
}
练习题:
public static void main(String[] args){
int i =5;
i++;
System.out.println("i= " + i);//6
++i;
System.out.println("i= " + i);//7
System.out.println("---------");
int a = ++i;
System.out.println("a= " + a);//8
System.out.println("i= " + i);//8
int b = i++;
System.out.println("b= " + b);//8
System.out.println("i= " + i);//9
assigning operator
专门为变量指定值或重新定值
注意Java支持同时多个变量赋值,好比支持同时声明多个变量一样,但因影响可读性,故也不推荐。
加等于:x += 5;相等于x = x + 5,但还包括隐式类型转换。
public class Hello{
public static void main(String[] args{
int a,b,c;//不推荐
a = b = c = 5;//不推荐
short s = 5;
//s = s + 3;//编译出错,需要强转 s = (short)(s + 3);
s += 3;//编译OK,隐式类型转换
}
}
comparision operator
用于比较两个变量或常量之间的关系,比较运算符的结果是boolean类型,其操作格式为:
boolean result = 表达式A 比较运算符 表达式B;
==:等于,若比较的两个操作数都是数值类型,即使她们的类型不同,只要值相同就返回true。
当然==也可以比较引用数据类型,留到后面讲。
instanceof:在讲面向对象的时候,再细讲。