天天看點

java入門---基本資料類型之引用資料類型&資料類型轉換

    接着上一篇文章來,這次就先看看什麼是引用資料類型?首先得滿足以下條件:

  • 在Java中,引用類型的變量非常類似于C/C++的指針。引用類型指向一個對象,指向對象的變量是引用變量。這些變量在聲明時被指定為一個特定的類型,比如 Employee、Puppy 等。變量一旦聲明後,類型就不能被改變了。
  • 對象、數組都是引用資料類型。
  • 所有引用類型的預設值都是null。
  • 一個引用變量可以用來引用任何與之相容的類型。
  • 例子:Site site = new Site("Runoob")。

    我們來看下java常量。常量在程式運作時是不能被修改的。在 Java 中使用 final 關鍵字來修飾常量,聲明方式和變量類似:

final double PI = 3.1415927;      

    雖然常量名也可以用小寫,但為了便于識别,通常使用大寫字母表示常量。字面量可以賦給任何内置類型的變量。例如:

byte a = 68;
char a = 'A'      

    byte、int、long、和short都可以用十進制、16進制以及8進制的方式來表示。當使用常量的時候,字首 0 表示 8 進制,而字首 0x 代表 16 進制, 例如:

int decimal = 100;
int octal = 0144;
int hexa =  0x64;      

    和其他語言一樣,Java的字元串常量也是包含在兩個引号之間的字元序列。下面是字元串型字面量的例子:

"Hello World"
"two\nlines"
"\"This is in quotes\""      

    字元串常量和字元常量都可以包含任何Unicode字元。例如:

char a = '\u0001';
String a = "\u0001";      

    Java語言支援一些特殊的轉義字元序列:

符号 字元含義
\n 換行 (0x0a)
\r 回車 (0x0d)
\f 換頁符(0x0c)
\b 倒退 (0x08)
\0 空字元 (0x20)
\s 字元串
\t 制表符
\" 雙引号
\' 單引号
\\ 反斜杠
\ddd 八進制字元 (ddd)
\uxxxx 16進制Unicode字元 (xxxx)

    然後我們來看下自動類型轉換。整型、實型(常量)、字元型資料可以混合運算。運算中,不同類型的資料先轉化為同一類型,然後進行運算。轉換從低級到進階:

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double       

    資料類型轉換必須滿足如下規則:

  • 1. 不能對boolean類型進行類型轉換。
  • 2. 不能把對象類型轉換成不相關類的對象。
  • 3. 在把容量大的類型轉換為容量小的類型時必須使用強制類型轉換。
  • 4. 轉換過程中可能導緻溢出或損失精度,例如:
int i =128;   
byte b = (byte)i;      

    因為 byte 類型是 8 位,最大值為127,是以當 int 強制轉換為 byte 類型時,值 128 時候就會導緻溢出。

    5. 浮點數到整數的轉換是通過舍棄小數得到,而不是四舍五入,例如:

(int)23.7 == 23;        
(int)-45.89f == -45      

    自動類型轉換必須滿足轉換前的資料類型的位數要低于轉換後的資料類型,例如: short資料類型的位數為16位,就可以自動轉換位數為32的int類型,同樣float資料類型的位數為32,可以自動轉換為64位的double類型。

public class ZiDongLeiZhuan{

        public static void main(String[] args){

            char c1='a';//定義一個char類型

            int i1 = c1;//char自動類型轉換為int

            System.out.println("char自動類型轉換為int後的值等于"+i1);

            char c2 = 'A';//定義一個char類型

            int i2 = c2+1;//char 類型和 int 類型計算

            System.out.println("char類型和int計算後的值等于"+i2);

        }

}

    運作結果為:

char自動類型轉換為int後的值等于97
char類型和int計算後的值等于66      

    c1的值為字元'a',查ascii碼表可知對應的int類型值為97,'A'對應值為65,是以i2=65+1=66。

    還有一種就是強制的類型轉化:

  • 1. 條件是轉換的資料類型必須是相容的。
  • 2. 格式:(type)value type是要強制類型轉換後的資料類型 執行個體

    public class QiangZhiZhuanHuan{

        public static void main(String[] args){

            int i1 = 123;

            byte b = (byte)i1;//強制類型轉換為byte

            System.out.println("int強制類型轉換為byte後的值等于"+b);

        }

    }

    運作結果為:

int強制類型轉換為byte後的值等于123      

    還有隐含的強制類型轉換:

  • 1. 整數的預設類型是 int。
  • 2. 浮點型不存在這種情況,因為在定義 float 類型時必須在數字後面跟上 F 或者 f。

    引用類型是一個對象類型,它的值是指向記憶體空間的引用,就是位址,所指向的記憶體中儲存着變量所表示的一個值或一組值。

int a;
a = 250; // 聲明變量a的同時,系統給a配置設定了空間。      

    引用類型就不是了,隻給變量配置設定了引用空間,資料空間沒有配置設定,因為不知道資料是什麼。來看個錯誤的例子:

MyDate today;
today.day = 4; // 發生錯誤,因為today對象的資料空間未配置設定。      

    引用類型變量在聲明後必須通過執行個體化開辟資料空間,才能對變量所指向的對象進行通路:

MyDate today;          //将變量配置設定一個儲存引用的空間
today = new MyDate();     // 這句話是2步,首先執行new MyDate(),給today變量開辟資料空間,然後再執行指派操作      

    再來看引用變量指派:

MyDate a,b;       // 在記憶體開辟兩個引用空間
a = new MyDate();       // 開辟MyDate對象的資料空間,并把該空間的首位址賦給a
b = a;                   // 将a存儲空間中的位址寫到b的存儲空間中      

    對資料類型轉換再來個補充說明哈。首先是包裝類過度類型轉換。一般情況下,我們首先聲明一個變量,然後生成一個對應的包裝類,就可以利用包裝類的各種方法進行類型轉換了。例如:當希望把float型轉換為double型時:

float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue();//F1.doubleValue()為Float類的傳回double值型的方法      

    簡單類型的變量轉換為相應的包裝類,可以利用包裝類的構造函數。即:Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)。而在各個包裝類中,總有形為××Value()的方法,來得到其對應的簡單類型資料。利用這種方法,也可以實作不同數值型變量間的轉換,例如,對于一個雙精度實型類,intValue()可以得到其對應的整型變量,而doubleValue()可以得到其對應的雙精度實型變量。

    還有就是其他資料類型向字元串類型轉換:

  • 調用類的串轉換方法:X.toString();
  • 自動轉換:X+"";
  • 使用String的方法:String.valueOf(X);

    還有就是字元串轉換為其他資料類型:1、先轉換成相應的封裝器執行個體,再調用對應的方法轉換成其它類型。例如,字元中"32.1"轉換double型的值的格式為:new Float("32.1").doubleValue()。也可以用:Double.valueOf("32.1").doubleValue()。

    2、靜态parseXXX方法:

String s = "1";
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );      

    3、Character的getNumericValue(char ch)方法。

    4、Date類與其它資料類型的互相轉換。整型和Date類之間并不存在直接的對應關系,隻是你可以使用int型為分别表示年、月、日、時、分、秒,這樣就在兩者之間建立了一個對應關系,在作這種轉換時,你可以使用Date類構造函數的三種形式:

  • Date(int year, int month, int date):以int型表示年、月、日
  • Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、時、分
  • Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、時、分、秒

    在長整型和Date類之間有一個很有趣的對應關系,就是将一個時間表示為距離格林尼治标準時間1970年1月1日0時0分0秒的毫秒數。對于這種對應關系,Date類也有其相應的構造函數:Date(long date)。

    擷取Date類中的年、月、日、時、分、秒以及星期你可以使用Date類的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以将其了解為将Date類轉換成int。而Date類的getTime()方法可以得到我們前面所說的一個時間對應的長整型數,與包裝類一樣,Date類也有一個toString()方法可以将其轉換為String類。有時我們希望得到Date的特定格式,例如20020324,我們可以使用以下方法,首先在檔案開始引入:

import java.text.SimpleDateFormat;

java.util.Date date = new java.util.Date();
//如果希望得到YYYYMMDD的格式
SimpleDateFormat sy1=new SimpleDateFormat("yyyyMMdd");
String dateFormat=sy1.format(date);
//如果希望分開得到年,月,日
SimpleDateFormat sy=new SimpleDateFormat("yyyy");
SimpleDateFormat sm=new SimpleDateFormat("MM");
SimpleDateFormat sd=new SimpleDateFormat("dd");
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date);      

    關于資料類型轉換,我們可以來個總結啊哈:

    1、隻有 boolean 不參與資料類型的轉換

    2、自動類型的轉換:

  • a.常數在表數範圍内是能夠自動類型轉換的
  • b.資料範圍小的能夠自動資料類型大的轉換(注意特例)
  • float 到 int,float 到 long,double 到 int,double 到 long 等由浮點類型轉換成整數類型時,是不會自動轉換的,不然将會丢失精度。
  • c.引用類型能夠自動轉換為父類的
  • d.基本類型和它們包裝類型是能夠互相轉換的

    3、強制類型轉換:用圓括号括起來目标類型,置于變量前。

    好啦,這次分享就結束了。如果感覺不錯的話,請多多點贊支援哦。。。