数据类型与运算符
数据类型与运算符
1.Java标识符与关键字
1.1 Java注释:
Java注释主要有三种:
(1)单行注释://注释内容 一般用于方法中(用的最多)
(2)多行注释:/* 注释内容 */
(3)文档注释:/**文档注释*/(常用于方法和类之上描述方法和类的作用),可用来自动生成文档。
1.2 Java标识符
Java语言中,对于常量、变量、函数、语句块也有名字,我们将其统称为标识符。
标识符的要求:
(1)标识符由字母、数字、下划线、$组成,其中不能以数字开头,不能含有java中的保留字(关键字)。
(2)标识符采用有意义的简单命名。
(3)$不在代码中出现。
对于类名和变量的命名,Java采用“驼峰”命名法。
(1)即对于类名,类名是以大写字母开头的名词,如果由多个单词组成则每个单词首字母大写。如:FistName.并且源文件名必须和公共类同名
(2)对于变量则采用小驼峰式命名,即如果只有一个单词则全部小写;若有多个单词则从第二个单词开始每个单词首字母大写。 如:int myAge = 10.
1.3 Java关键字
1、用于定义访问权限修饰符的关键字:private(表示私有字段,或者方法等,只能从类内部访问)、protected(表示字段只能通过类或者其子类访问;子类或者在同一个包内的其他类)、public(表示共有属性或者方法)
2、用于定义函数、类、变量修饰符的关键字:abstract(抽象方法,抽象类的修饰符)、final(表示一个值在初始化之后就不能再改变了;表示方法不能被重写,或者一个类不能有子类)、static(表示在类级别定义,所有实例共享的)、synchronized(表示同一时间只能由一个线程访问的代码块)
3、用于定义类与类之间关系的关键字:extends(表示一个类是另一个类的子类)、implements(表示一个类实现了接口)
4、用于建立实例及引用实例,判断实例的关键字:new(分配新的类实例)、this(表示调用当前实例或调用另一个构造函数)、super(表示基类)、instanceof(测试一个对象是否是某个类的实例)
5、用于异常处理的关键字:try(表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码)、catch(和try搭配扑捉异常信息)、finally(try 语句不管是否发生异常都要执行的语句块)、throw(抛出异常)、throws(定义方法可能抛出的异常)
6、用于包的关键字:package(一系列相关类组成一个包)、import(导入类)
7、其他修饰符关键字:native(表示方法用非java代码实现)、strictfp(浮点数比较使用严格的规则)、transient(修饰不要序列化的字段)、volatile(标记字段可能会被多个线程同时访问,而不做同步)、assert(断言条件是否满足)
2.Java数据类型
Java是一种强类型的语言,所以必须为每变量声明一种类型。
基本数据类型的保存范围:
基本数据类型 | 默认值 | 存储 | 数值范围 |
byte | 0 | 1个字节 | -128-127 |
short | 0 | 2个字节 | -2^15-2^15-1 |
int | 0 | 4个字节 | -2^31-2^31-1 |
long | 0 | 8个字节 | -2^63-2^63-1 |
char | \u0000 | 2个字节 | 0-2^16-1 |
float | 0.0 | 4个字节 | 32位1EEEE 754单精度范围而 |
double | 0.0 | 8个字节 | 64位1EEEE754双精度范围 |
boolean | false | 1位 | true/false |
注:
1.在程序开发中,整数就用int,描述小数就用double。
2.long一般用来描述日期、时间、内存或文件大小。
3.若要进行编码转换或进行二进制流的操作时,使用byte。
4.char一般在描述中文时会用到。
2.1整型
(1)有关溢出问题
在Java程序中,任何一个整型常量都是int型。
public class Test3 { public static void main (String[] args){ int num = 20;//定义了一个整型变量 System.out.println(num*2);
int maxValue = Integer.MAX_VALUE;//当前整数的最大值 int minValue = Integer.MIN_VALUE;//当前整数的最小值 System.out.println(maxValue + 1); System.out.println(minValue - 1); } }
|
运行结果: 40 -2147483648 2147483647 |
观察上述代码及运行结果可发现运行结果出错,即在进行整型数据的操作过程中会发生溢出问题。
解决溢出问题方法:更换数据类型
则用long来解决上述数据溢出问题:
int maxValue1 = Integer.MAX_VALUE;//当前整数的最大值 long num1 = maxValue1 + 1L; System.out.println(num1); //1L表示1为长整型数据,若1不指定数据类型,则默认情况下为整型(int) |
运行结果: 2147483648 |
(2)有关类型转换问题
在进行数值运算时:小类型会自动转换为大类型数据,不需要类型换换;
但大类型转换为小数据类型时必须强制转换(有可能损失精度)。
long maxValue2 = 2147483648L; int result = (int)maxValue2; System.out.println(result); |
运行结果: -2147483648 //大数据类型强制转换为小数据类型时丢失了内容 |
(3)基本数据默认值问题
***:所有数据的默认值在主方法中无效
错误代码: //所有数据的默认值在主方法中 int i;//定义一个整形变量但并没有初始化 System.out.println(i); |
要想解决此类错误:(1)在使用前进行赋值;即int i;i = 10;
(2)在定义变量时赋值;即int i = 10;
***:各个数据类型的默认值的使用,要结合类才能观察到
class Demon{ public int i; public double l; public char c; public boolean b; } public class Test3 { public static void main (String[] args){ Demon demon = new Demon(); System.out.println(demon.i); System.out.println(demon.l); System.out.println(demon.c); System.out.println(demon.b);
} } |
运行结果:0 0.0 □ false |
2.2 浮点数
描述小数默认为double型
//浮点数 double num2 = 10.0;//这是一个小数 System.out.println(num2*2);//num2是double类型,2是int类型 |
运行结果:20.0 |
double 类型可以保存的数字是最大的,
float 保存范围小于double,若果要用float需要强制类型转换,在小数后面加F或者f。
float num3 = 10.0F;//定义float型变量 |
传统bug
System.out.println(1.1*1.1);//1.1默认为double类型 |
运行结果:1.2100000000000002 |
System.out.println(1.1f*1.1f); |
运行结果:1.21 |
整数/整数的结果分析:
int num5 = 10; int num4 = 4; //整数除以整数仍为整数(取整运算) System.out.println(num5/num4); //要想得到精确的运算结果,应将其转化为float或者double型数据 System.out.println((double)num5/num4); System.out.println(1.0*num3/num4); |
运行结果:2 2.5 2.5 |
2.3字符型
字符型数据用char来表示,并且用 ’ ’ 来表示字符变量的内容,且可以与int型数据相互转换。
//字符与整型数据的转换 char c1 = 'a'; int num6 = c1; System.out.println(num6); |
运行结果:97 |
***
大写字母(A-Z):65-90;
小写字母(a-z):97-122;
int 转换为 char 类型数据时需要强制类型转换
实现大写字母转化为小写字母
//大写字母转化为小写字母 char c2 ='A'; int num7 = c2 +32; char c3 =(char)num7; System.out.println(c3); |
运行结果:a |
注意:
字符型数字(‘0’-’9’)与int型数字(0-9)不同;if(‘0’==0)则一定为false.
2.4布尔型
在其他语言中,没有提供布尔类型,因此用’0’ 表示false,用’1’表示true;但在Java中没有这样的概念,true就是true,false就是false与0、1无关。
2.5初见String类
String是Java中比较重要的类。
char可以表示单一的字符,如果要想描述多个字符,就必须利用String(字符串)这一概念,需要注意:String并不是基本数据类型,它为引用数据类型。
String可以用 + 表示两个字符串的连接。
//字符串 String name = "张三"; String age = "18"; System.out.println("姓名:"+name+",年龄:"+age); //此处的+表示连接两个字符串 |
运行结果:姓名:张三,年龄:18 |
观察 ”+” 问题
int numA = 30; double numB = 10.5; String sum ="计算结果:" + numA + numB;//+为字符串连接符 System.out.println(sum); |
运行结果:3010.5 |
String sum1 ="计算结果:" + (numA + numB); System.out.println(sum1); |
运行结果:40.5 |
观察上述结果,可以发现只要使用了“+”出现了字符串,则所有数据类型(包含引用数据类型)都转换为String。如果要想得到正确的结果,必须使用”()”来解决问题。
转义字符:
换行:\n; 制表符(tab):\t; 双引号:\” ;单引号: \’
//转义字符 System.out.println("今天好开心\n\thappy!\"unhappy\""); |
运行结果:今天好开心 happy!"unhappy" |
3.Java运算符
3.1基础运算符
所有的运算符都是有优先级的,使用()括起来,简单性原则。
自增自减运算符(x++、++x、x--、--x)
int x = 5; int y = 6; int sum2 =x++ * y;//后置++;先运算后加加 System.out.println(x); System.out.println(sum2); |
运行结果:6 30 |
int x = 5; int y = 6; //int sum2 =x++ * y; int sum3 =++x * y;//前置++;先加加在运算 System.out.println(x); System.out.println(sum3); |
运行结果:6 36 |
总结:x++ x-- 先运算后自增/自减 ;++x --x 先自增/自减后运算
3.2 三目运算符
三目运算符是一种赋值运算,根据条件判断赋哪个值。
数据类型 变量 = 布尔表达式?满足时赋值:不满足时赋值
//三目运算符 int m = 3; int n = 4; int k =3>4?m+n:n-m;//3>4不满足则执行:后面的运算 System.out.println(k); |
运行结果:1 |
使用三目运算符可以简化代码
3.3 关系运算符(> < >= <= ==)
所有的关系运算符返回类型均为boolean类型(true false)可以与逻辑判断语句一起使用
可以直接将字符和数字进行判断
char cc = '小'; int z = 10; System.out.println(cc>z); |
运行结果:true |
3.4 逻辑运算符
逻辑运算符有:与(&,&&)、或(|,||)、非(!)
当使用"&"时,明确的表示多个条件都判断了,如果在多个表达式中有条件返回了false,剩余的条件也 要判断;而如果使用"&&"(短路与),只要有条件返回false,剩余条件不再判断,返回false。
当使用"|"时,明确的表示多个条件都判断了,如果在多个表达式中有条件返回了true,剩余的条件也要 判断;而如果使用"||"(短路非),只要有条件返回true,剩余条件不再判断,返回true。
3.5 位运算操作符(|,&,^,~)
位运算的关键在于十进制与二进制的转换。使用&(有一个0则为0),使用|(有一个1则为1)
//位运算 System.out.println(2&8); System.out.println(2|8); |
运行结果:0 10 |
思考:
1、说说 & 和 && 的区别。
当使用"&"时,明确的表示多个条件都判断了,如果在多个表达式中有条件返回了false,剩余的条件也 要判断;而如果使用"&&"(短路与),只要有条件返回false,剩余条件不再判断,返回false。
2、存在使 i + 1 < i的数吗?
存在
int maxValue = Integer.MAX_VALUE;//当前整数的最大值
System.out.println(maxValue + 1);
结果为:-2147483648
3、0.6332 的数据类型是(double)
4、 System.out.println("5" + 2);的输出结果应该是(52)。
5、 float f=3.4;是否正确?
不正确,float f = 3.14f