本固枝荣 —— Java关键字之数据类型

Java数据类型的关键字

Java中的数据类型可分为8种基本数据类型和3种引用数据类型,用途可概括如下:

  • 修饰变量;
  • 作为方法的返回值类型;

从这两方面简单分析下相关的关键字用法(void、boolean、char、byte、short、int、long、float、double、instanceof、new、class、interface、enum等)。

修饰变量

关于变量的描述:

变量是由字母,数字和某些特殊字符(如_、$)组成,它只能由字母或_开头。Java中的关键字和保留字等不能作为变量使用,而且变量对大小写敏感的,定义变量时需要指定明确的数据类型(Java10之前),变量命名的方式通常有驼峰命名法和下划线分隔法等。

常量,可理解为不可变的变量,必须由final修饰符修饰,名称全部大写,一旦给常量赋值后,就会固定下来,不能再改变了。

面向对象编程中,变量有全局变量(实例变量、静态变量(也叫类变量)之分)、局部变量等类型。实例变量可以被类中的非静态方法直接使用;而静态变量是一种所有对象可共享的全局变量;局部变量只能限定在本方法内使用。

值得注意的是:实例变量或静态变量可以不进行初始化,Java会默认给定初始值(整型-0,布尔-false,浮点型-0.0,字符-0对应的字符),而局部变量不初始化的话则无法通过编译!!

关于上面的描述写个测试类验证测试下:

class VariateTests {
    final int INT_ONE = 1; //常量
    static int a = 5; //静态变量(所有对象共享)
    int b = 8; //实例变量
    boolean flag1; //实例变量(未初始化)

    // 普通方法
    public void testVariate() {
        final int INT_ZERO = 0; //局部常量
        int c = 9; //局部变量
        boolean flag2; //局部变量(未初始化)
        
        System.out.println("使用静态变量:" + a); //5
        System.out.println("使用实例变量:" + b); //8
        System.out.println("使用局部变量:" + c); //9
        System.out.println("使用实例常量:" + INT_ONE); //1
        System.out.println("使用局部常量:" + INT_ZERO); //0
        System.out.println("全局变量默认值:" + flag1); //false
//        System.out.println("局部变量默认值:" + flag2); //报错
    }

    // 静态方法只有共享的静态变量可用,其他变量均报错
    public static void main(String[] args) {
        System.out.println("使用静态变量:" + a); //5
//        System.out.println("使用实例变量:" + b);
//        System.out.println("使用局部变量:" + c);
//        System.out.println("使用实例变量:" + INT_ONE);
//        System.out.println("使用局部常量:" + INT_ZERO);
    }
}

 

关于8种基本数据类型:

Java中的8种基本数据类型有boolean、char、byte、short、int、long、float、double等关键字,修饰变量时为变量明确数据类型。值得注意的是,浮点型修饰变量时默认的是double,使用float时需要在变量后缀加上f或F。

不同类型的变量在进行赋值操作时,会存在自动转换和强制转换的现象。

自动转换,就是低级数据类型到高级数据类型的转换(所谓的低级和高级,可以用基本类型在内存中占用的字节来理解,低级占用字节少,如byte、boolean各占1个字节,short、char各占2个字节,int、float各占4个字节大小,long、double各占8个字节),同时还要考虑数据类型的兼容,像布尔类型boolean不参与字符类型char、数字类型的转换。因此数字类型自动转换的大致方向为:byte-short-int-long-float-double,字符类型的自动转换方向为:char-int,用下图更能形象的表达:

 

强制转换,就是不满足自动转换条件而发生的转换,转换语法格式:(dataType) variableName ,基本数据类型是这样,引用数据类发生强制转换时型亦是如此。

关于3种引用数据类型:

Java中的引用数据类型有:类class、接口interface、数组。从JVM堆栈角度来看,这些对象本身是存储在java堆上的,指向对象的引用则是存在栈上,程序中通过栈上的引用变量来操作堆中的对象。

实际上,使用引用类型修饰变量时不小心就会出现空指针异常,如果要通过引用变量操作对象的属性或方法,必须要对引用变量进行初始化(一般通过构造器方式,借助new关键字)。

值得注意的是interface关键字定义的接口,常用来定义常量、接口方法(Java8后可以有具体的方法实现);enum关键字定义的类属于枚举类,用来定义和存储字符串类型的常量。

关于上面的描述写个测试类验证测试下:

class ReferenceTests {
    SportUserVo suv = new SportUserVo(); //自定义的实体类vo
    List<Integer> list; //jdk中的List接口

    // 普通方法
    public void testReference() {
        char[] cArr = {}; //字符数组
        Integer[] iArr; //整型数组(未初始化)

        System.out.println("SportUserVo---->" + suv.getName()); //null
        System.out.println("List---->" + list); //null
        System.out.println("cArr---->" + cArr.length); //0
//        System.out.println("iArr---->" + iArr.length); //编译报错

        // 接口常量或枚举常量直接使用即可
        System.out.println("CarEnum---->" + CarEnum.GEELY);
        System.out.println("Road---->" + Road.MIDDLE_ROAD);

    }

    // 测试
    public static void main(String[] args) {
        new ReferenceTests().testReference();
    }
}

class SportUserVo{
    public String name;
    SportUserVo() {}
    // get/set方法省略...
}

public interface Road {
    // 接口常量默认修饰符为:public static final
    public static final int ROAD_LEVEL_1 = 1;
    int ROAD_LEVEL_2 = 2;
    public static final String FAST_ROAD = "快速路";
    String MIDDLE_ROAD = "一般公路";

    // 接口方法默认修饰符public
    void m1();
    default void m2(){
        System.out.println("-----默认方法-----");
    }
}

public enum CarEnum {
    AUDI, BMW, GEELY, KIA, CHANGAN // 一系列字符串常量
}

用作方法的返回值类型

void :无返回值。

基本类型:return,返回基本数据类型的值。

引用类型:return,返回对象引用。

上面的关键字作为标识方法的返回值类型很简单,没什么说的,这里特别提一下关键字instanceof的用法和注意事项:

  • 关键字instanceof 是一个二元运算符,用于测试左边的对象object是否为右边的类class的实例,返回的是boolean,语法格式:boolean res= object instanceof class; 
  • instanceof 使用注意事项:object 为null时,直接返回false;object 为基本数据类型时,编译报错,因为instanceof 只能用作对象比较。
public static void main(String[] args) {
    System.out.println("ArrayList---->" +(new ArrayList() instanceof List)); //true
    System.out.println("LinkedList---->" +(new LinkedList<>() instanceof List)); //true
    System.out.println("HashMap---->" +(new HashMap<>() instanceof List)); //false
    System.out.println("null---->" +(null instanceof List)); //直接返回false
//    System.out.println("基本类型---->" +(int instanceof List)); //编译报错
}

总结一下

这里的基本数据类型和引用数据类型从Java关键字的角度出发,整理了它们的常用用法及做了一些细节分析。文中提及的Java10除外、Java8后接口可以有默认方法的实现、引用变量如何操作对象的属性和方法等等并没有展开说明和相应的测试,后面会继续分析的,这里的主旨是Java关键字,因此不能偏离了这个主题,哈哈哈哈,见谅~~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值