笔记之java基础-02

1、常量分类:

A:字面值常量
        1)整数常量 123 -234
        2)实数常量 123.5
        3)字符常量:用单引号括起来的数据 ‘A’,'a''2'
        4)字符串常量:用双引号括起来的数据“hello world”
        5)布尔常量: true false

        6)空常量:

B:自定义常量

2、进制 

    1)字节数据是计算机表示(存储和传输)的最基本单位。

     1个二进制数据被称为位 bit,1字节type=8 bit

     1k=1024byte

     1H=1024k

     1G=1024H

     1T=1024G

     1个汉字占2个字节。

            

         2)进制之间的转换

           10进制到2进制:倒叙取余法

           二进制到八,十六进制:

        基本做法:二进制--十进制--十六or八进制

        简单做法:二进制到八进制,三位一组 110 101 111=657(八进制)

                                             二进制到16进制 ,四位一组1101 0010 1011=D2B(十六进制)

           or十六进制到2进制:每位转换成3位或者4位的数

                         657(八进制)=110(6)101(5)111(7)

         3)有符号数据的表示,原码,反码,补码

           在计算机中数据是以补码形式存储的。最高位是符号位,其他位是数据位

   反码:正数的反码和原码相同,负数的反码是原码除去符号位,其他数值位取反,0变1,1变0.

   补码:正数的补码和原码形同,负数的补码是负数的反码+1.

           在计算的时候,符号位也会参与计算,超出后舍弃。 

3.变量:

        1)变量是内存中的一个存储区域

        2)该区域有自己的名称(变量名)和类型(数据类型)。

        3)该区域的数据可以在同一类型范围内不断变化。

            为什么定义变量:用于不断地存放同一类型的常量,并可以重复使用。

4.数据类型

        java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。

          笔记之java基础-02

类型              占用存储空间

Byte              1字节

Short             2字节

Int               4字节

Long              8字节 

Foloat            4字节

Double            8字节

整型默认int型,字符型默认double型

java浮点型有两种表示方式:

十进制数形式    3.14

科学计数法:    3.14e2=3.14*10^2

//定义长整型,必须加后缀L,因为默认整型

//定义单精度的时候必须加后缀,F或者f,否则可能损失精度。

5.java中的类型转换:

        注意:在运算的过程中一般要求类型一致,如果遇到类型不一致的情况,就会有报错  。

        类型转换怎么做的:

        A:boolean类型不可以转换为其他的数据类型。

        B:隐式转换,(从小到大)

           Byte,short,char---int--long--float--double

   注意:long是8个字节,float是4个字节但是long可以转换到float,原因是整数和浮点数的存储规则不一样。

          例: byte a=10;
  int b=a;
System.out.println(b);

        C:强制转换

            如果明确知道数据是可以表示的,则可以强制转换

            格式:(转换后数据类型)变量或者数值

            注意:一般情况下不推荐使用强制转换

            例:int a=4;
byte c=3;
byte d=(byte)(a+c);
System.out.println(d); //因为明确a+b  = 7的值可以用byte值表示。

            

class VariableDemo3{

public static void main(String[] args){

byte b=126;

 System.out.println(b);

 byte b2=(byte)130;//输出结果为-126.

 System.out.println(b2);

 byte b3=(byte)300;

 System.out.println(b3);

}

}

1. 数值在内存中默认是int型的,byte占一个字节8位数,表示数值范围为-128--127.

当定义byte b=126,在范围内可以直接输出。

分析如下:126在内存以如下形式存储:

00000000 00000000 00000000 01111110

byte b=126后,截取后8位即b的存储方式是:01111110然后输出,并没有改变数值大小

2.当定义byte b2= 130;

130在内存中的存储形式是:00000000 00000000 00000000 10000010

做强制转换截取后8位,是10000010;

原码:10000010

反码:11111101

补码:11111110

最终结果为:11111110

3.当定义byte b2= 300;

130在内存中的存储形式是:00000000 00000000 00000001 00011100

做强制转换截取后8位,是00011100;

原码反码补码都是00011100

故最后结果是44.

6.面试题

面试题:下面的语句有没有错误,如果有请解释:

 byte b1=3;

byte b2=4;

byte b3=b1+b2;

byte b4=3+4;

有问题,在 byte b3=b1+b2;时报错

解释:

 b1+b2在做运算时首先会自动转换成int类型,byte short char在做运算首先自动转换成int类型

 在这个时候b1,b2会提升为Int类型。

最终相当于直接把int类型赋值给byte类型。

如果参与运算的是常量,编译器会先计算值再看该值是否是左边类型可以表示的范围,与变量不同

 变量是只要做加法就自动转为int类型。若是常量先计算然后赋值,若结果在范围内不报错,

若结果不在范围内则报错

7.运算符:

运算符:把变量和常量进行连接的符号

分类:
算术运算符
赋值运算符
关系运算符
逻辑运算符
位运算符
三元运算符

1)算数运算符:+ — * /

除法:整数/整数=整数,若要保持小数形式,则被除数或者除数必须有一个为浮点型。

%取余运算

左边的数据大于右边,结果是余数

左边的数据小于左边结果是左边

左边等于右边结果为0

符号与左边一致          

System.out.println(-5%3);//结果为-2

System.out.println(5%-3);//结果为2

System.out.println(-5%-3);//结果为-2 

++ --

1)单独使用时,++i 与i++效果一致

2)如果++或者(--)放在操作数的后面,操作数据先操作,在++

3)如果++(--)放在操作数的前面,先++,再赋值。

4)int x=3;

int y=x++;

System.out.println(x); //x=4

System.out.println(y);//先执行y=3,在执行3++,y=3

 

int z=++x;//先执行++4,再执行z=5;

System.out.println(z);  

+的特殊用法

+可以作为字符串的连接符,会按照从左到有的顺序链接

若是先遇到字符则直接连接,若是先遇到数字则先计算在连接。

 String s="hello"+5+5+5+5; //输出结果为hello5555

String s=5+5+"hello";//输出结果为10hello

 System.out.println(s);   

2)赋值运算符
=,+=,-=,*=,/=,%=
int a = 10;
把10赋值给int类型的变量a。
a += 20;
把左边和右边的和赋值给左边。
注意事项:
a = a + 20;
a += 20;
结果是等价的,理解不是等价的。
因为+=这种运算符,内含了强制类型转换功能。
比如:
short s = 2;
s+=3;
等价于

s = (short)s + 2;

3)关系运算符
==,!=,>,>=,<,<=
特点:关系运算符的结果都是boolean类型。
      请千万注意:== 不要写成 =

    分隔符:";" 表示语句结束,可以在一行上写多条语句,但是,建议一行上只写一条语句
    空格:关键字前后必须有空格,在运算符两端可有可无,建议有

4)逻辑运算符

&,|,!,^,&&,||

&:有false则false
|:有true则true
!:true变false,false变true
^:相同false,不同true

&&:有false则false
||:有true则true
            如果从结果看,单&和双&,单|和双||一样,那么区别在哪呢?
        &&前面出现了fause后面将不再执行,而&不管前面是true还是fause,后面都执行
        ||前面出现true后面将不再执行,而|不管前面是true还是fause,后面都执行

开发中常用:
&&,||,!(s+3);

        5)位运算符(了解):对二进制码进行运算

        << 左移

        >>右移

        >>>无符号右移

        &与运算  两边是布尔类型的表达式则为逻辑运算符,两边是数据则为位运算符

        |或运算

        ^异或运算

        ^ : 一个数据对同一个数据^两次,结果还是数据本身。
举例:a ^ b ^ b = a

       面试题
请把两个数据交换
举例:
int a=10;
int b=20;

开发使用第三方变量的形式,面试使用^的形式

                a = a^b;
b = a^b;
a = a^b;
System.out.println(a);//a=a^b^a=b,把b赋给了a,
System.out.println(b);//b=(a^b^b=a),即b=a,把a赋给b

        ~反码 

向左移动或者向右移动就是把数据增大或者缩小2的指定次幂,左移是高位舍弃,右边补0

    System.out.println((-16)<<2);//(-16)*2^2=-64 若最高位是1,左移完了后最高位仍然是1

         向左移动或者向右移动就是把数据增大或者缩小2的指定次幂,如果最高位是0,左移后最高位还是0

如果最高位是1,左移后最高位还是1,即相当于最高位的1不移动,总的来说就相当于乘以2的倍数

   右移稍微复杂点,如果最高位是0,左边被移空的位置就补0。如果最高位是1,左边被移空的位置就补1,

但是右移时最高位的1不会移动,总的来说就相当于除以2的倍数 

>>> 无符号右移

6)条件运算符
格式:
条件表达式?表达式1:表达式2
执行流程:
根据条件表达式返回的是true还是false,决定结果是什么。
如果是true,就把表达式1作为结果。
如果是false,就把表达式2作为结果。
举例:
int a = 100;
int b = a > 50 ? 200 : 100;
请问b的值?200