java-轉型有風險使用許謹慎,java-轉型風險
在使用類型轉換時,經常會遇到類型轉換錯誤的情況。比如 無法將String轉換成int累類型等等,這裡將所有的類型轉換全部列舉出來
保證在轉換的適合不會出現錯誤。
import java.lang.reflect.Field;import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import org.apache.commons.lang3.time.DateFormatUtils;import org.apache.commons.lang3.time.DateUtils;/** * * <strong>功能:</strong>類型轉換 * <strong>作者:</strong>Gary Huang * <strong>日期:</strong> 2014-3-5 * <strong>著作權:<strong>著作權(C) 2014,QQ 834865081 */@SuppressWarnings("unchecked")public class TransformUtils {public static boolean toBoolean(Object obj) {return toBoolean(obj, false);}public static boolean toBoolean(Object obj, boolean defaultValue) {if (obj == null) {return defaultValue;}try {return Boolean.parseBoolean(toString(obj));} catch (Exception e) {}return defaultValue ;}public static byte toByte(Object obj) {return toByte(obj, (byte) 0);}public static byte toByte(Object obj, byte defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.byteValue();}String value = toString(obj) ;try {return Byte.parseByte( value ) ;} catch (Exception e) {}return defaultValue ;}public static char toCharacter(Object obj) {return toCharacter(obj, (char) ' ');}public static char toCharacter(Object obj, char defaultValue) {if (obj == null) {return defaultValue;}String str = obj.toString().trim();if (str.length() == 0) {return defaultValue;}return (char) str.toCharArray()[0];}public static double toDouble(Object obj) {return toDouble(obj, 0d);}public static double toDouble(Object obj, double defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.doubleValue() ;}String value = toString(obj) ;try {return Double.parseDouble(value) ;} catch (Exception e) {}return defaultValue ;}public static float toFloat(Object obj) {return toFloat(obj, 0);}public static float toFloat(Object obj, float defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.floatValue();}String value = toString(obj) ;try {return Float.parseFloat(value) ;} catch (Exception e) {}return defaultValue ;}public static int toInt(Object obj) {return toInt(obj, 0);}public static int toInt(Object obj, int defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.intValue();}String value = toString(obj) ;try {return Integer.parseInt(value) ;} catch (Exception e) {}return defaultValue ;}public static long toLong(Object obj) {return toLong(obj, 0L);}public static long toLong(Object obj, long defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.longValue();}String value = toString(obj) ;try {return Long.parseLong(value) ;} catch (Exception e) {}return defaultValue ;}public static short toShort(Object obj) {return toShort(obj, (byte) 0);}public static short toShort(Object obj, short defaultValue) {if (obj == null) {return defaultValue;}if (obj instanceof Number) {Number number = (Number) obj;return number.shortValue();}String value = toString(obj) ;try {return Short.parseShort(value) ;} catch (Exception e) {return defaultValue;}}public static String toString(Object value) {if (value == null) {return "";}return value.toString().trim();}public static BigDecimal toBigDecimal(Object value){return toBigDecimal(value , new BigDecimal(0)) ;}public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {if(value == null){return defaultValue ;}if(value instanceof BigDecimal){BigDecimal decimal = (BigDecimal) value ;return decimal; }return new BigDecimal( toDouble( value ) );}public static String dateToString(Object value, String pattern){java.util.Date date = (java.util.Date) value; Calendar calendar = Calendar.getInstance(); calendar.setTime( date ) ; SimpleDateFormat sdf = new SimpleDateFormat( pattern ); return sdf.format( date ) ; }public static Object transform(Object obj,Class<?> clazz){if(clazz == null){return obj ; }if(clazz.isEnum()){Field[]fields=clazz.getFields() ;int tempInt = toInt(obj) ;if(fields.length > tempInt){try {return Enum.valueOf((Class)clazz , fields[tempInt].getName());} catch (Exception e) {}}}if(obj.getClass().equals(clazz)){return obj ; }if(int.class.equals(clazz) || Integer.class.equals(clazz)){return toInt(obj) ; }else if( String.class.equals(clazz) ){return toString( obj ) ; }else if(float.class.equals(clazz) || Float.class.equals(clazz)){return toFloat(obj) ; }else if(double.class.equals(clazz) || Double.class.equals(clazz)){return toDouble(obj) ; }else if(byte.class.equals(clazz) || Byte.class.equals(clazz)){return toByte(obj) ; }else if(char.class.equals(clazz) || Character.class.equals(clazz)){return toCharacter(obj) ; }else if(short.class.equals(clazz) || Short.class.equals(clazz)){return toShort(obj) ; }else if(long.class.equals(clazz) || Long.class.equals(clazz)){return toLong(obj) ; }else if(boolean.class.equals(clazz) || Boolean.class.equals(clazz)){return toBoolean(obj) ; }else if(BigDecimal.class.equals(clazz)){return toBigDecimal( obj ) ; }else if(java.util.Date.class.equals(clazz) || java.sql.Date.class.equals(clazz) || java.sql.Timestamp.class.equals(clazz)){try {java.util.Date date = DateUtils.parseDate(obj.toString() , "yyyyMMdd" , "yyyy-MM-dd" , "yyyy年MM月dd日" , "yyyyMMddHHmmss" , "yyyy-MM-dd HH:mm:ss" , "yyyy年MM月dd日HH時mm分ss秒" ) ; if(java.sql.Date.class.equals(clazz)){return new java.sql.Date(date.getTime()) ; }else if(java.sql.Timestamp.class.equals(clazz)){return new java.sql.Timestamp(date.getTime()) ;}return date ; } catch (Exception e) {return null;}}return obj ; }public static String objToString( Object value ){if(Helper.isNull( value )){return "" ; }if(value instanceof BigDecimal || value instanceof Double ||value instanceof Float){BigDecimal decimal = toBigDecimal( value ) ;DecimalFormat df = new DecimalFormat("0.00");return df.format( decimal ) ;}else if(value instanceof Date){Date date = (Date) value ;Calendar calendar = Calendar.getInstance() ;calendar.setTime( date ) ; String pattern = "yyyy-MM-dd HH:mm:ss" ;if(calendar.get(Calendar.HOUR_OF_DAY) == 0 && calendar.get(Calendar.MINUTE) == 0 && calendar.get(Calendar.SECOND) == 0){pattern = "yyyy-MM-dd" ; }return DateFormatUtils.format(calendar, pattern) ;}return value.toString() ; }}
java中向上轉型與向下轉型有何用途
Person 可以表示為一個抽象的東西 就是人。比如說人可以唱歌, 就好比Person類中有一個sing方法.
那麼這個抽象的類(Person 人)可以具體到兩類或者更多類 比如 男人,女人 。
Man extends Person 或者 Woman extends Person
那麼男人 還有 女人 分別實現sing方法。 因為男人和女人唱歌總還是有區別的嘛。
當 Person p = new Man(); p.sing(); 這個時候就是調用男人唱歌的sing方法
當 Person p = new Woman(); p.sing(); 這個時候就是調用女人的唱歌的sing方法
這樣其實就是一個java的繼承,多態. 利於程式擴充. 你需要理解這種設計方式,會讓你寫出更易維護,簡潔的代碼。
JAVA轉型問題
給你看另外個例子
public class Father {
public int a = 1;
public void amethod(int a){
System.out.println("I'm a father "+"a = "+ a);
}
}
public class Child extends Father{
public int a = 2;
public void amethod(int a){
System.out.println("I'm a child "+"a = "+ a);
}
public static void main(String[] args) {
Father f = new Child();
f.amethod(f.a);
}
}
結果是I'm a child a = 1
可以看出在JAVA中,父子類之間執行個體方法採用的是動態綁定,即運行時綁定類型而非編譯時間,所以f在運行時指向的是Child對象,所以調用子類方法,而對於執行個體變數則採用靜態繫結,即編譯時間決定的,編譯做的事主要是就是把java檔案編譯成.class檔案,而接下來Java虛擬機器會把.class檔案裝載到虛擬機器中進行包括驗證,靜態變數初始化,符號引用轉直接引用等,做好了這些,執行器會執行.class檔案,相應的會有對象的初始化等,說了這麼多有點跑題的話,我只想說的是編譯時間是不知道f實際的指向的,只知道f是Father類型的,所以f.a拿到的是父類的變數a的值。
這是JAVA的多態特徵。
說了這麼多,希望對你有所協助。