Java基础02:类型转换、变量、常量


类型转换

由于Java是强类型语言,所以要进行有些运算的时候需要用到类型转换,运算中不同类型的数据先转化为同一类型,然后进行运算。

优先级从低到高排序:

byte->short->char->int->long->float->double

转换类型分为强制转换和自动转换

  • 强制转换 :高优先级转换为低优先级时类型需要进行强制转换:(类型)变量名 优先级高->低
int i = 10;
byte b = byte(i);
  • 自动转换 :低优先级转换为高优先级时类型自动转换:优先级低->高
int i = 10;
double c = i;
  • 注意点
  1. 不能对布尔值进行转换
  2. 不能把对象类型转换为不相干的类型
  3. 在把高优先级转换为低优先级的时候需要进行强制转换
  4. 转换的时候可能存在内存溢出的问题或者精度问题
int i = 128;
//int转byte类型强制转换 (类型)变量名 优先级高->低
byte b = (byte)i;
//int转double类型自动转换 优先级低->高
double c = i;
System.out.println(i);//输出128,正常输出
System.out.println(b);//输出-128,原因内存溢出
System.out.println(c);//输出128.0,正常输出
System.out.println((int)27.6);//double转int输出27,原因精度存在问题
System.out.println((int)-24.3f);//float转int输出-24,原因精度存在问题
  1. 操作比较大的数 时注意溢出的问题
int money = 10_0000_0000;//JDK7新特性,数字直接可以用下划线分割,不影响输出
int years = 20;
int total = money*years;
System.out.println(total);//输出-1474836480,溢出了
long total2 = money*years;
System.out.println(total2);//输出-1474836480,自动转换之前数据已经存在问题了
long total3 = money*((long)years);//先把一个数转换为long
System.out.println(total3);//正常输出20000000000

变量

  • 变量是什么:可变化的量
  • Java是一种强类型语言,每个变量都必须声明其类型
  • Java变量是程序中最基本的储存单元,其要素包括变量名,变量类型和作用域
type varName [=value] [{,varName[=value]}];
//数据类型 变量名 = 值; 可以使用逗号隔开来声明多个同类型变量,建议别一次性声明多个同类型变量以提高程序可读性

注意事项

  1. 每个变量都有类型,类型可以是基本类型,也可以是引用类型
  2. 变量名必须是合法的标识符
  3. 变量声明是一条完整的语句,因此每一个声明都必须以分号结束

变量作用域

变量作用域分为三种:

  1. 类变量:static关键字开头的变量,从属于当前类,建议前期定义变量和方法都加上static关键字方便调用
  2. 实例变量:从属于对象;如果不进行初始化,数值类型默认值为0,布尔类型默认值为false,除了基本类型,其余类的默认值都是null
  3. 局部变量:方法内部定义的变量,必须声明和初始化值
  • 声明是向编译器介绍名字-标识符。它告诉编译器这个函数或变量在某处可以找到,它的模样像什么。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为他们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存数据,对于函数,编译器会生产代码,这些代码最终也要占用一定的内存。基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。
  • 所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给他取上一个名字,这个名字就是我们常说的变量名或对象名。所谓声明就是告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。告诉编译器,这个名字已经被预定,别的地方再也不能用它来作为变量名或者对象名。
public class Variable{
    static int allClicks = 0;//类变量,需要加static关键词
    String str = "Hello World";//实例变量
    public void method(){
        int i = 0;//局部变量,必须初始化
    }
}

常量

常量(Constant):初始化(initialize)后不能再改变的值!不会变动的值。可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。常量名一般使用大写字符。

final 常量名 = 值;
final double PI=3.14;
//static,final修饰符,不存在先后顺序
static final double PI = 3.14;
final static double PI1 = 3.15;
System.out.println(PI);//输出3.14
System.out.println(PI1);//输出3.15

实例变量、类变量、常量都属于成员变量;局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量

  • 成员变量和局部变量的区别
  • 定义的位置不一样
  • 局部变量:在方法的内部
    成员变量:在方法的外部,直接写在类当中
  • 作用的范围不一样
  • 局部变量:只有方法当中才可以使用,出了方法就不能再用了
    成员变量:整个类都可以通用
  • 默认值不一样
  • 局部变量:没有默认值,如果要想使用,必须手动进行赋值
    成员变量:如果没有赋值,会有默认值,规则和数组一样
  • 内存位置不一样
  • 局部变量:位于栈内存
    成员变量:位于堆内存
  • 生命周期不一样
  • 局部变量:随着方法进栈而诞生,随着方法出栈而消失
    成员变量:随着对象的创建而诞生,随着对象被垃而消失

变量命名规范

  • 所有变量、方法、类名:见名知意
  • 类成员变量:首字母小写和驼峰原则:monthSalary
  • 局部变量:首字母小写和驼峰原则
  • 常量:大写字母和下划线:MAX_VALUE
  • 类名:首字母大写和驼峰原则:Man,GoodMan
  • 方法名:首字母小写和驼峰原则:run(),runRun()