Java 数据类型总结

Java 是强类型语言, 所以在源代码编译时,声明的变量时必须明确它所属类型. 


基本数据类型                    引用数据类型

   byte     对应的包装类→        Byte

   short     对应的包装类→        Short

   int     对应的包装类→        Integer

   long     对应的包装类→        Long

   char     对应的包装类→        Character

   float     对应的包装类→        Float

   double         对应的包装类→        Double

   boolean     对应的包装类→        Boolean

                                  interface   接口

                            Array    数组



基本数据类型中,除了char ,boolean以外, 其他的都可以font用来表示数字.

区别如下:

    byte        范围  -128 ~ 128

     short          范围 -2的15次方 ~ 2的15次方-1

    int         范围 -2的31次方 ~ 2的31次方-1

    long         范围 -2的63次方 ~ 2的63次方-1 

    float        范围 -2的-149次方 ~ 2的128次方-1  

    double         范围 -2的-1074次方 ~ 2的1024次方-1 

  特殊的是char类型, 例如 char a = 1; a 表示的是 UCS-2 编码为 1 的字符,直接打印 a 是乱码

  在Java中不支持使用char类型,UCS-2 远远少于Unicode字符的数量,在跟一些数据库的char类型数据结合进行的特殊查询的情况下,会出现问题.


字节和字符

   字节: 硬盘或内存中存储形式.1个字节代表 8位的二进制数(bit).比如:1 byte = 0110 1010 

   字符: 占用字节数根据不同的字符集确定

字符集

    Unicode 字符集

         Java默认采用的就是这个字符集,

           常用编码方法 UTF-8(Unicode Tranformation Format),万国码

         一个字节代表一个英语字符,三个字节表示一个汉语字符,特殊汉语字符4个字节   

    GBK 字符集

        英语字符占一个字节,汉语字符占两个字符

        包括中日韩字符的大字符集合,支持中文简体和繁体

    GB2312 字符集

        英语字符占一个字节,汉语字符占两个字符

          GBK子集,中国国家标准的简体中文字符集, 不支持繁体字符的编码.

        一般用于中国大陆和新加坡

    ASCII 字符集

        基于罗马字母表的一套电脑编码系统,一个英语字符由占一个字节,

        汉语字符占两个字节


数据类型的转换

    自动转换 

    小范围的数据类型到大范围的数据类型会自动转换类型 

        小----------------------------------------------大   

         byte - short - int - long - float - double    

        
        byte a = 1;
		byte b = 2;
		byte c = a + b;//编译失败,需要强制类型转换成int类型
		int c = a + b;//编译通过		

    强制转换

       基本数据类型之间         

        public byte cout(byte b1, byte b2) {
           return (byte) (b1 / b2);  //需要强制类型转换
        }

             大范围类型到小范围类型强制转换会损失精度

	        double d = 3.14;
		    int i = (int) d; 
		    System.out.println(i);//打印结果 i = 3

       引用数据类型之间

           通常是在存在继承关系的父子类中的强制转换        

        	public class Father {
        		public void print() {
        		    System.out.println("Father Print");
        		}
        	}
        
        	public class Son extends Father {
        	        public void print() { 
        			    System.out.println("Son Print");
        		}
        		public void other() {
        			System.out.println("son");
        		}
        	}

           Son的内容要比Father丰富,也可以说Son的范围比Father大,所以:

         Father father = new Son();//将大范围的内容交给小范围的实例

          所以father实例虽然指向的是Son内容,但是能力被削弱了,它不能访问Son中独有的部分

          父类对象强制转换成子类类型

         Son son = (Son) father;//把father对象强化回Son对象,功能恢复

      但是:            

       Father father = new Father();
       Son son = (Son) father;//抛出异常:java.lang.ClassCastException转换异常

       总得来说:子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败.

    在强制转换之前必须保证前提是:功能较弱的类型引用的一个功能较强的对象时,使用强制转换来恢复功能,反之失败.所以,良好的编码习惯是转换之前使用方法 instanceof 方法判断一下:

        if (father instanceof Son) {  
		  Son son = (Son) father;//判断为true 则执行转换
	    }

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章