2021-10-12_java数据类型+运算符

数据类型与运算符

1.实例变量与类变量

成员变量:把类内、方法体外定义的变量称为成员变量。
Java中的成员变量分为两种:

一是没有static修饰的,这些成员变量是对象中的成员,称为实例变量。

二是有static修饰的,称为类变量(静态变量)。

1.静态变量(类变量)具备以下特点:

  1. 随着类的加载而加载
  2. 优先于对象存在
  3. 被所有对象所共享
  4. 可以直接被类名调用

2.类变量和实例变量的区别是:

  1. 存放位置。
  • 类变量随着类的加载而存在于方法区中。

  • 实例变量随着对象的建立而存在于堆内存中。

  1. 生命周期:
  • 类变量生命周期最长,随着类的消失而消失。

  • 实例变量生命周期随着对象的消失而消失。

**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.数据类型

  1. 基础数据类型(只有8种且只有它们才有对应的包装类):

    • 整数:byte short int long
    • 浮点数:float double
    • 字符:char
    • 布尔: boolean //boolean只有两个取值,true或者是false,在jvm中并没有规范布尔类型的大小,有些书说是1bit或者一个字节
  2. 引用类型: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.左移,右移,无符号右移(注意没有无符号左移)

  1. 左移<< :0000 0001 <<1 ->0000 0010 ,左边去掉1位,右边补1位,补0;数值为原来的2^1

    总结:左移n位,数值就为原来的2^n

  2. 右移>>:0000 1111>>1 ->0000 0111,右边去掉1位,左边补1位,补符号位,数值为原来的/2^1

    总结:右移n位,数值就为原来的/2^n

​ 补码:

​ 1111 1111>>1 ->1111 1111

  1. 无符号右移>>>:右边去掉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和其他类

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

协行士辉妖秋落木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值