《疯狂Java讲义(第4版)》-----第3章【数据类型与运算符】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/82799932

Java的官方API下载
Java语言是一门强类型语言。强类型含义:

  • 所有变量必须先声明,后使用;
  • 指定类型的变量只能接受类型与之匹配的值

注释

//单行注释
/*
多行注释
*/

/**
*文档注释
*/

标识符

字母、下划线、美元符号、数字组成。字母、下划线、美元符号开头。(据说这里的字母不仅限于26个英文字母,)

标识符不能是Java关键字和保留字。也不能是true,false,null这三个直接量(literal)。保留字的意思是未来的Java版本中可能会使用的关键字,如goto,const。

数据类型

Java语言支持两种数据类型:基本类型(Primitive Type)和引用类型(Reference Type)

  • 基本类型:boolean,byte,short,int,long,char,float,double
  • 引用类型:类、接口、数组、null

整型(byte,short,int,long)

byte 1个字节(-27~27-1)
short 2个字节(-215~215-1)
int 4个字节(-231~231-1)
long 8个字节(-263~263-1)
  • 整数默认是int类型
  • 把较小的整数值(在byte,short范围内)赋给byte,short,系统会自动把这个整数值当成byte,short
  • 直接把一个超过int范围的整数赋值给long类型变量,这个整数(int)不会自动转为long类型,会报错,因为Java还是认为这个数是int类型,超出了int表示的范围。正确处理方式是在这个整数后加L或l
  • 二进制整数开头是0b或0B,八进制整数开头是0,十六进制数开头是0x或0X

字符型(char)

  • Java语言采用16位Unicode字符集作为编码方式(’\u0000’’\uFFFF’,前256个’\u0000’’\u00FF’和ASCII码对应)。char相当于无符号整型(0-65535)。

  • 字符型三种写法:‘x’,’\’,’\u0a18’(四位十六进制数)

  • 注意在路径中用\而不是用\,不然就当成转义字符处理了。

浮点型(float,double)

按照IEEE754标准
float:4个字节
double:8个字节

表示方法:5.12,5.12e2

  • 用科学计数法表示的数哦都市浮点数
  • 浮点数默认是double类型,float数必须末尾加F或f
  • 浮点数从表示原理上只能精确到一定的精度,小数点后位数过多的时候就不能精确了

关于负无穷、正无穷、非数

public class HelloWorld{
	
	public static void main(String[] args){
		
				
		//正数除以0得到Infinity---必须是浮点数之间的运算
		System.out.println(1.0/0);
		//负数除以0得到-Infinity---必须是浮点数之间的运算
		System.out.println(-1.0/0);
		//0.0/0.0得到NaN(非数)
		System.out.println(0.0/0.0);
		//1/0报错java.lang.ArithmeticException: / by zero---不是浮点数之间的运算
		//System.out.println(1/0);

		//所有的正无穷都相等
		System.out.println(1.0/0==Double.POSITIVE_INFINITY);
		//所有的负无穷都相等
		System.out.println(Double.NEGATIVE_INFINITY==Float.NEGATIVE_INFINITY);
		//NaN不和任何数值相等,甚至两个非数不想等
		System.out.println(Double.NaN==0.0/0.0);
		System.out.println(Double.NaN==Float.NaN);
	}
}
char c = 9_7;
//整型数可以用下划线分隔,位数多的时候方便看出多少位
System.out.println(c);

布尔型(boolean)

布尔型只有两个取值:true、false,不能用0或非0代表。boolean类型之间不能做算术运算。

下面代码将输出truefalse,boolean类型可以自动转成字符串!

String str = true  + "" + false;
System.out.println(str);

基本类型的类型转换

自动类型转换

总体而言,小范围的可以自动转换成表示范围大的。就好比小瓶子里的水倒进大瓶子里面可以装得下。具体如下。
在这里插入图片描述

  • 任何基本类型和字符串连接都会转换成字符串

  • 字符串类型都可以通过八种基本类型的包装类的静态方法parseXxx(String s)转换成相应的基本类型String str = "2.32"; double d = Double.parseDouble(str);

  • 八种基本类型的包装类:Boolean,Byte,Short,Character,Integer,Long,Float,Double

  • 表达式类型中数据类型的自动提升也是根据这个图。表达式的类型严格保持和表达式中最高等级操作数的类型相同。

强制类型转换

根据上面自动类型转换的图,逆过来得强制类型转换,可能会造成数据丢失。可以从底层数据二进制表示的原理进行解释。比如int转为byte,就是把int的低8位给了byte。

直接量

boolean b = true;
int a = 8;
char c = 'c';
long l = 2L;
float f = 2.3f;
double d = 2.3;
String str = "hello";
String s = null;

能进行直接量赋值的只有:八大基本类型、null、字符串。

字符串直接量的常量池

第一次使用字符串直接量时,Java会把这个字符串常量放在常量池里缓存起来,程序再次用到的时候就会直接使用这个字符串,不会再新建了。

public class HelloWorld{
	
	public static void main(String[] args){

		String s1 = "hello";
		String s2 = "hello";
		String s3 = "hell" + "o";
		//输出true
		System.out.println(s1==s2);
		//输出true
		System.out.println(s1==s3);
		
	}
}

运算符

%:求余。求余也是要进行除法运算的,得到余数,所以当两个整数做求余运算的时候,除数为0会报错。
++,–:针对变量。不能用于表达式、直接量、常量。
>>>:无符号右移位。及其他移位具体细节用时再看课本深究吧
==:System.out.println(8==8.0);//返回true
&,|,^:这几个既是位运算符又是逻辑运算符!注意区别!

发现问题积累

在命令行运行程序,输出中文乱码怎么办?

命令行默认是GBK编码方式,可以设置成UTF-8方式编码。
查看当前编码方式(默认是936,即GBK方式):

C:\Users\xxx\Desktop>chcp
活动代码页: 936

修改成UTF-8(65001):

C:\Users\xxx\Desktop>chcp 65001
Active code page: 65001

现在再用命令行运行Java程序,打印中文字符串,就不会有乱码了。

随机生成小写英文字母组成的字符串的方法?

可以先随机生成小写字母,再拼起来。可以随机生成97-122之间的数,强转成char即可。下面以随机生成6位的字符串为例子完成代码:

public class HelloWorld{
	
	public static void main(String[] args){

		String str = "";
		for(int i=0;i<6;i++){
			int intValue = (int)(Math.random()*26+97);
			str += (char)intValue;
		}		
		System.out.println(str);
		
	}
}

+=的奇妙?

byte a = 5;
a = a+5;//报错
byte a = 5;
a+=5;//正确,这就和+=符号底层设计有关了

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/82799932