变量的作用域

变量的作用域:变量的使用范围
分类:全局变量     局部变量

1.局部变量:
    定义位置:局部方法区或者代码块中
    使用范围:方法区的内部或者代码块内部
    注意事项:同一个方法不能定义相同的变量
                     方法中定义的局部变量使用前

2.全局变量:
    定义位置:类的内部方法的外部
    使用范围:整个类中任意方法中或者代码块中都可以使用
    注意事项:main方法区是static的,直接使用全局变量,全局变量就必须定义为static的
                     static修饰的方法只能调用static修饰的方法
                     当全局变量和局部变量同名的时候,方法区内部访问的是局部变量
                     定义全局变量可以不赋初值,jvm会自动根据变量的数据类型赋该类型数据的默认初始值
                        int --- 0
                        String --- null
                        char --- ''    '\u0000' --- unicode编码  
                        boolean --- false
                        double --- 0.0

独立代码块:
    定义位置:类的任意地方
    语法:
        {
            //独立块中的具体内容,可以定义任意的变量或者语句
        }
    使用范围:代码块的内部
class Demo1
{
    //定义一个整数类型的全局变量,分配的内存在整个类中
    //直接被main方法区执行的话,全局变量必须是static
    static int num = 1;


    //类内部定义一个独立代码块
    {
        int m = 100;
        System.out.println("代码块1");
        System.out.println("代码块1 m = " + m);
        System.out.println("代码块1");
    }

    public static void main(String[] args)
    {
        //在main中定义一个整数类型的变量i,分配0900首地址
        int i;
        //在内存中放入数据的过程,变量的赋值
        i = 10;
        //从内存地址取出数据,变量的使用
        System.out.println("main i = " + i);

        //jvm只加载main方法区的变量,执行fun1方法中的变量
        //在main方法调用fun1方法
        fun1();//使用方法==方法名()

        //在main方法中使用变量num的值
        //在main方法中定义一个局部变量num
        int num = 365;
        //在main方法中将全局变量num的值修改为365
        num = 365;
        //访问的是main 方法中的局部变量num
        System.out.println("main num = " + num);

        //main方法中定义一个独立代码块
        {
            int value = 90;
            System.out.println("代码块2");
            System.out.println("代码块2 num = " + num);
            System.out.println("代码块2 i = " + i);
        }
        System.out.println("代码块2 value = " + value);
        
        //Math -- 数学运算类
        //定义变量用final关键字修饰,用final关键字修饰的变量
        //叫做最终常量 -- 只能赋一次值,代表了一个固定的数值,要求字母全部大写
        final double SQRT = Math.pow(i,3);
    }

    //定义一个方法
    public static void fun1()
    {
        //fun1中获取变量i的值,并且打印输出
        //定义一个整数类型变量i,fun1方法区的局部变量
        int i = 90;
        System.out.println("fun i = " + i);
        System.out.println("fun num = " + num);
    }
}




NullPointerException --- 空指针异常
程序运行:JVM内存中地址为null,取不到数据
发生情况:对象类型的数据赋值为null
                 方法中的参数赋值为null
解决方法:给变量或者方法重新赋值或者传参




数据类型

8种基本数据类型,3种引用数据类型
3种引用数据类型:类、接口、数组

基本数据类型:

数据类型
关键字
内存字节
二进制位
数据范围
包装类表示
整型(4种)
byte(字节)
1
8
-128~127
Byte.MIN_VALUE~Byte.MAX_VALUE
short(短整型)
2
16
-32768~32767
Short.MIN_VALUE~Short.MAX_VALUE
int(整型)
4
32
-2147483648~2147483647
Interger.MIN_VALUE~Interger.MAX_VALUE
longint(长整型)
8
64
以9开头的19位数字
Long.MIN_VALUE~Long.MAX_VALUE
浮点型(2种)
float
4
32
单精度
没有整数,小数点后8位可见
有整数,小数点后最多6位可见(不固定)
Float.MIN_VALUE~Float.MAX_VALUE
double
8
64
双精度
没有整数,小数点后17位可见
有整数,小数点后最多16位可见(不固定)
Double.MIN_VALUE~Double.MAX_VALUE
字符型
char
2
16
0~65535(\uffff)unicode编码ASCII码 
Character.MIN_VALUE~Character.MAX_VALUE
布尔型
boolean


byte<boolean<int     true/false
介于byte和int 之间

字符型表示方式:
    第一种:字符表示方式    '\r'
    第二种:整数值(ASCII码值)    13
    第三种:根据unicode编码    \u前缀
                  字符型数据的十六进制表达式 \u000D

常量表示:
    前缀:
        整型:八进制0    十六进制0x
        字符型: \u
    后缀:
        整型:长整型L/l
        浮点型:f/F    d/D 

基本数据类型的精度比较
    损失精度:低精度数据类型(内存小) <-- 高精度数据
    不损失精度:高精度数据类型(内存大) <-- 低精度数据
 
    精度高:内存大,小数点位多
    精度低:内存小,小数点位少
    
    byte < short < int < float < long < double

    低精度 ---> 高精度    (隐式转换)    没有精度损失
    高精度 ---> 低精度    (显示转换)    有精度损失

    char比较复杂
        -->有精度损失    ==》没有精度损失 
        byte --> char
        char --> byte
        short --> char
        char --> short
        int --> char 
        char ==》int

强制类型转换:
    存在精度损失的时候,为了防止精度损失,内存的数值强制性放入相应的数据类型中去
    语法:变量类型1    变量名 = (变量类型1)变量值;
    特征:
        有值损失强转:强转的数据超过了强转后的数据类型的范围
        没有值损失强转:强转的数据在强转后的数据类型范围内

负数二进制位:
    运算法则:正数的二进制取反 + 1

注意特殊:
    1.byte,char,char数据类型在运算过程或者堆内存,自动升精度到int
    2.当byte,char,short数据类型在运算过程中等号右边没有去内存获取变量的过程,不会自动升精度到int
        //等号右边没有从内存取出进行运算过程,byte,char,short不会自动升精度
char ch = 90;
char ch1 = ch + 20;  //会自动升精度
char ch2 += 20;  //不会自动升精度