接着上一篇文章來,這次就先看看什么是引用數據類型?首先得滿足以下條件:
- 在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、強制類型轉換:用圓括號括起來目標類型,置於變量前。
好啦,這次分享就結束了。如果感覺不錯的話,請多多點贊支持哦。。。
原文地址:https://blog.csdn.net/luyaran/article/details/80094279