一、数据类型知识点
1.浮点类型数据比较会出错
float a = 0.1f;
double b = 0.1/10;
System.out.println(a==b);
结果为:false
float c = 12345678901234f;
float d = c + 1;
System.out.println(c==d);
结果为:true
对于金钱类的运算要用BigDecimal 类型 ,不能用float和double,比如银行业务的钱的计算
进制问题
二进制
十进制
八进制:0
十六进制:0x
int i = 10;
int i2 = 010;
int i3 = 0x10;
System.out.println(i,i2,i3);
结果为:10,8,16
2.类型转换
数据进行运算,需要先把数据转换成同一类型才能计算
数据类型转换顺序
低---------------------------------------------------------->高
byte,short,char—>int–>long–>float–>double
自动类型转换:当一个子类型的要被父类型的引用时,这时就会自动类型转换,举个例子:
int i=100;
double=i+10;//这时就i就自动转换了double类型了称为隐式类型转换
而如果是这样:
double pi=3.1415926;
int i=pi;//这时编译会出错,说类型不兼容,就需要强制类型转换了,也成显式类型转换
应该这样写:
int i=(int)pi;
转换应当注意内存溢出问题
int i = 128;
byte b = (byte)i;
System.out.println(b);
此时b为-128
//原因:byte类型数据范围为-128到127,赋值128会出问题
注意点:
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型,如把猪转成鸡鸭
- 把高容量转换成低容量的时候,强制转换
- 转换过程种可能存在内存溢出的问题,或者精度问题!
二、变量、常量、作用域
-
局部变量(即方法中的变量)必须声明和初始化
-
实例变量(从属于对象,即某个类中的变量),可以不用初始化,会赋默认值见下表:
数据类型 默认值 byte 0 short 0 char ‘u0000’ int 0 long 0L float 0.0f double 0.0 String null boolean false -
类变量:前面加上static修饰,如:
static double b = 2000;
-
常量:前面加上final,并且一般用大写
final double PI = 3.1415926;
-
变量命名规范
(1)所有方法、变量、类名都要见名知意
(2)实例变量
定义:即在类中定义的变量,即类的属性,可以在new对象的时候,每个对象都有一个属性,这些属性就是类成员变量,在整个类中都可以被访问
构成:访问修饰符 修饰符 type name = value
命名规范:首字母小写和驼峰 lastName mouthSalary
(3)局部变量
定义:只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效
命名规范:首字母小写和驼峰 lastName mouthSalary
(4)类变量
定义:独立于方法之外,用static修饰
命名规范:首字母小写和驼峰 lastName mouthSalary
public class Variable{ static int allClicks=0; // 类变量 String str="hello world"; // 实例变量 public void method(){ int i =0; // 局部变量 } }
(5)类名
命名规范:首字母大写和驼峰 Run() RunFast()
(6)常量
命名规范:全部大写,若是多个单词构成用下划线分开 MAX_VALUE
三、运算
-
'+'的使用
int a = 10; int b = 20; System.out.println(a+b); System.out.println(""+a+b); System.out.println(a+b+""); System.out.println(a+""+b); 结果为: 30 1020 30 1020
原因:
当没有String类型时或者String类型在最后面的时候,加号的作用就是算数;
当String类型在最前面或者中间的位置,加号的作用就是拼接。
-
自增++,自减- -
int a = 1;
int b = a++;
int c = ++a;
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
结果为:
a:3
b:1
c:3
原因:
b = a++是先将a赋值为b,然后a自增,此时a变为2
c = ++a是先将a自增,再把自增后的a赋值给c,即2+1=3赋值为c
3.位运算符
A = 0011 1100
B = 0000 1101
A&B = 0000 1100 //相对应的位都是1则结果为1,否则为0
A | B = 0011 1101 //相对应的位有一个为1则为1,都是0则为0
A ^ B = 0011 0001 //相对应的位不同则为1,相同则为0
~A= 1100 0011
A << 2得到240,即 1111 0000 //按位左移运算符。
A >> 2得到15即 1111 //按位右移运算符。
面试题
2*8=16计算机怎么计算最快?
答案:用位运算
/* 二进制: 十进制:
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
*/
System.out.println(2<<3);
16
-
三元运算符: ?:
x ? y : z
含义:如果x为true,则返回y,否则返回z
int score = 60; String type = score<80 ? "优秀":"良好"; //即当score<80成立时,返回冒号前的值,不成立则返回冒好后的值 System.out.println(type); 结果为: 优秀