数据类型与运算符
1.实例变量与类变量
成员变量:把类内、方法体外定义的变量称为成员变量。
Java中的成员变量分为两种:
一是没有static修饰的,这些成员变量是对象中的成员,称为实例变量。
二是有static修饰的,称为类变量(静态变量)。
1.静态变量(类变量)具备以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 被所有对象所共享
- 可以直接被类名调用
2.类变量和实例变量的区别是:
- 存放位置。
- 类变量随着类的加载而存在于方法区中。
- 实例变量随着对象的建立而存在于堆内存中。
- 生命周期:
- 类变量生命周期最长,随着类的消失而消失。
- 实例变量生命周期随着对象的消失而消失。
**3.注意:**在java中,没有所谓的全局变量这样的概念
4.变量的命名规则:字母,数字,下划线,美元符号,数字不能作为开头
常量:1.字面值常量,2.final修饰的变量->常量 //在程序运行的过程中不可以被修改,在编译的时候,就已经知道其值是什么,只能初始化1次
final int SIZE;
// SIZE = 99;
//SIZE = 199;
System.out.println(SIZE);//不初始化,会报错,且初始化只能为一次
变量:在程序运行的时候,才知道里面的值
2.类型强转
byte a = 1;
byte b = 2;
//cpu在计算字节数小于4的时候,会提升到int型
//运行期间进行计算,上升到int型,需要强转
byte c =(byte)(a+b);
byte e = a+=b;
System.out.println(c);
System.out.println(e);
byte d = 1+2;//这里不报错的原因是:1和2是常量,在程序编译的时候,这里已经编译成3了
System.out.println(d);
int a = 10;
a+=1;//a = a+1;
System.out.println(a);
short s = 10;
//s = (short) (s+9);9为int型,提升类型
s += 9//赋值运算时会自动转化
System.out.println(s);
解释:
byte存的是 8bit,在做+运算的时候会自动变量提升。相当于1+2这个结果是一个32bit,你把32bit放byte就会放不下,需要强制类型转换。 如果你用a+=b; +=属于赋值运算。自动提升计算后又进行了自动转换 所以就能存放在short里 。字节码文件帮我们做了转换的步骤(byte) (a+b)因为java在基本类型进行算术运算的时候,会发生小字节类型向大字节类型转换的现象。自动向上转型是按照 char->int -> long -> float -> double的顺序。比如byte+byte=int,short+short=int,由于int是2的32次方,对于一般算术运算基本够用,所以int+int=int,如果以后计算精度要求过高,以后版本的Java还可以向上转型。
例题:
short a =128;
byte b =(byte) a;
System.out.println(b);
//byte a = 130; float b = 3.5; 这两行代码会发生编译错误
解释:
强制转换时,byte是8位,截取a的后8位,1000 0000,此时最高位是1说明是负数(第一位正负位,1表示负,0表示正)
补码 :1000 0000
反码: 1000 0000 -1 = 0111 1111
原码: 1000 0000 -128
注意:强转有精度丢失的风险
3.数据类型
- 基础数据类型(只有8种且只有它们才有对应的包装类):
- 整数:byte short int long
- 浮点数:float double
- 字符:char
- 布尔: boolean //boolean只有两个取值,true或者是false,在jvm中并没有规范布尔类型的大小,有些书说是1bit或者一个字节
- 引用类型:string,数组,类,接口,枚举
包装类:将基本类型封装到类中是为了让object类接收基本数据类型,plus版本
int->Interger char -> Character //其余都是首字母大写
装箱与拆箱:
装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法实现装箱处理。
拆箱:将包装类中的基本数据类型取出,利用包装类提供的xxValue()方法eg:Integer()提供的intValue()
4.取余
思考下列代码分别输出什么
System.out.println(10%3);//1
//System.out.println(11.5%2);//1.5
System.out.println(-10%3);//
System.out.println(10%-3);//
System.out.println(-10%-3);//
5.关系运算符
使用关系运算符,其结果就是一个布尔值,if(布尔表达式),if(0)是错的, !布尔表达式:!false=true;
- [表达式1&&表达式2] 这两个表达式全是布尔表达式 ,短路:表达式1为假,就不执行表达式2了
- [表达式1||表达式2] 同样这两个表达式全是布尔表达式 ,只要有一个表达式为真,整个表达式为真,短路:表达式1为真,就不执行表达式2了
int a = 10;
int b = 20;
System.out.println(a == b);//false
System.out.println(a != b);//true
System.out.println(a < b);//true
System.out.println(a > b);//false
System.out.println(a <= b);//true
System.out.println(a >= b);//false
int a = 10;
int b = 20;
int c = 30;
System.out.println(a<b);
System.out.println(a < b || b < c);
int a = 10;
int b = 20;
System.out.println(!!(a < b));
System.out.println(10 < 20 && 10 / 0 == 0);//报异常
System.out.println(10 < 20 || 10 / 0 == 0);
6.按位与,按位或,按位取反
&按位与:对应位都是1,结果就是1
|按位或:对应位如果有1,结果就是1
^按位异或:对应位一样的是0,不一样的是1
~按位取反:0->1 ,1->0; 0000 1011->1111 0100
7.左移,右移,无符号右移(注意没有无符号左移)
- 左移<< :0000 0001 <<1 ->0000 0010 ,左边去掉1位,右边补1位,补0;数值为原来的2^1
总结:左移n位,数值就为原来的2^n - 右移>>:0000 1111>>1 ->0000 0111,右边去掉1位,左边补1位,补符号位,数值为原来的/2^1
总结:右移n位,数值就为原来的/2^n
补码:
1111 1111>>1 ->1111 1111
- 无符号右移>>>:右边去掉n位,左边补n位,补0;
1111 1111>>>1 -> 0111 1111;
8.字符串拼接
String str = "hello";
System.out.println(str);
//注意问题:
System.out.println("hello"+"world");//拼接
System.out.println("hello"+10+20);//其他数据类型和字符串使用+拼接,结果就是一个字符串
System.out.println(10+20+"hello");//30hello
System.out.println("hello"+(10+20));
System.out.println(10+""+20+"hello");
//a=10,b=20
System.out.println("a= "+10+", b="+20);
String s1 = "\"bit\"";//"bit"
String s2 = "\\bit\\";//\bit\
String s3 = "\\\\bit\\\\";//\\bit\\
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
9.switch相关问题
switch(x){}结构中,括号中可使用的数据类型?
switch()中只能支持整型数据类型,所以支持的基本数据类型有byte ,short,char,int和它们对应的包装类(因为可以自动拆箱)以及String,枚举enum
其实,x 准确的说,数值型的只可以是 int 类型,但是 byte, short, char 都可以自动转换成 int 类型,所以 x 也可以是byte, short, char。当然了,对应的包装类也是可以自动转换,所以 x 也可以是包装类型的。
不支持的有long,float,double,boolean和其他类