目录

  • JAVA的数据类型
  • JAVA数据类型转换
  • 自动类型转换
  • 强制类型转换
  • 常量
  • 作用域
  • 成员变量
  • 局部变量
  • 方法参数变量
  • 方法局部变量
  • 代码块局部变量

JAVA的数据类型

首先我们要知道,JAVA是强类型语言,也就是他对于数据类型有着严格的规范,所有的变量必须在定义初始化之后才能使用。强类型语言的优点在于安全性高,但是相对地是以牺牲效率为代价的。

JAVA的数据类型

  • 基础数据类型(整型、浮点型、布尔型)
  • JAVA基础数据类型如下:
  • java 类型转换失败 异常 java类型转换的原理_局部变量

  • 引用数据类型(引用、类、数组)

JAVA数据类型转换

数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。数据类型的转换可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。

自动类型转换

所谓的自动类型转换,就是一种类型的数据赋给另一个数据时是自动发生的。这种情况的发生需要两个条件:

  • 两种数据类型彼此兼容
  • 目标数据类型的取值范围大于原数据类型(比如从short-->int)

在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:

  • 数值型数据的转换:byte→short→int→long→float→double。
  • 字符型转换为整型:char→int。

有时候自动类型转换会产生让我们意想不到的错误,比如:

public class Demo2 {
    public static void main(String[] args) {
    byte bNum = 50;
    bNum = bNum * 2;
    System.out.println(bNum);
    }
}

以上程序运行会显示如下错误:

java 类型转换失败 异常 java类型转换的原理_数据类型_02


因为我们的运算操作中的2是默认直接为int,所以进行乘法运算后,表达式的结果值就为int类型,此时左侧的byte类型当然不能赋值为右侧的int类型

这个时候我们就需要强制类型转换:

byte bNum = 50;
 bNum = (byte)(bNum * 2);

强制类型转换

当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。

格式和C语言一样:

(数据类型)变量名

常量

JAVA语言使用final关键字来定义一个常量,其语法如下所示:

final 数据类型 数据名 = 值

常量有三种类型,分别是静态常量,成员常量,局部常量:

public class HelloWorld {
    // 静态常量
    public static final double PI = 3.14;
    // 声明成员常量
    final int y = 10;

    public static void main(String[] args) {
        // 声明局部常量
        final double x = 3.3;
    }
}

作用域

变量的作用域规定了变量所能使用的范围,只有在作用域范围内变量才能被使用。根据变量声明地点的不同,变量的作用域也不同。
JAVA根据作用域的不同,一般将变量分为成员变量与局部变量。

成员变量

JAVA的成员变量有两种,分别是全局变量和静态变量(类变量)。定义在方法体和语句块之外,不属于任何一个方法,作用域是整个类。

其中全局变量也叫做实例变量

修饰:没有static关键字修饰
访问:对象名、变量名
生命周期:只要对象被当作引用,全局变量就将存在

静态变量也叫做类变量

修饰:需要static关键字修饰
访问:类名/对象名、变量名
生命周期:生命周期取决于类的生命周期

接下来用代码实例来演示一下静态变量和全局变量:
首先我们定义一个dataclass来定义我们的静态变量与全局变量

public class Dataclass {
    String sName = null;
    int nAge = 0;

    static final String sDataname = "helloworld";
    static String URL = "http://baidu.com";
}

接着在我们的测试类中调用这些变量:

java 类型转换失败 异常 java类型转换的原理_作用域_03

局部变量

局部变量指的是方法或者方法块中定义的变量,其作用域是在所在的代码块中:

  • 方法参数变量:整个方法类有效
  • 方法局部变量:从定义这个变量开始到方法结束这段时间内有效
  • 代码块局部变量:从定义这个变量开始到代码块结束这一段时间内有效

注意
局部变量在使用前必须被程序员初始化!

方法参数变量

public class Demo2 {

    public static int Add_Num(int a, int b){
        int nRes = a + b;
        return nRes;
    }

    public static void main(String[] args) {
        int nNum = Add_Num(3,2);
        System.out.println(nNum);
    }
}

上述代码中定义了Add_Num方法,这个方法有两个参数,那么这两个参数的作用域就在Add_Num这个方法体内。

方法局部变量

public class Test2{
    public static void main(String[] args) {
        int a = 7;
        if (5 > 3) {
            int s = 3; // 声明一个 int 类型的局部变量
            System.out.println("s=" + s);
            System.out.println("a=" + a);
        }
        System.out.println("a=" + a);
    }
}

上述实例中定义了a和s两个局部变星,其中int类型的a的作用域是整个main() 方法,而int类型的变量s的作用域是if语句的代码块内

代码块局部变量

代码块局部变量常用于try catch代码块中,成为异常处理参数变量。

异常处理参数变量的作用域是在异常处理块中,该变量是将异常处理参数传递给异常处理块,与方法参数变量类似。

public class Test4 {
    public static void test() {
        try {
            System.out.println("Hello!Exception!");
        } catch (Exception e) { // 异常处理块,参数为 Exception 类型
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        test();
    }
}

在上述实例中定义了异常处理语句,异常处理块catch的参数为Exception类型的变量e,作用域是整个catch块。