今天逛貼吧的時候偶然發現吧友的一個有趣例子。
public class Demo{ public static void main(String[]args){ System.out.println(24/0); //會拋byzero異常 System.out.println(24.0/0.0) //可以輸出,輸出爲Infinity; } }
原因補充20160805:
查閱了Double包裝類的源碼,發現:
/** * A constant holding the smallest positive nonzero value of type * {@code double}, 2<sup>-1074</sup>. It is equal to the * hexadecimal floating-point literal * {@code 0x0.0000000000001P-1022} and also equal to * {@code Double.longBitsToDouble(0x1L)}. */ public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
這句話的意思是定義一個最小的非零常數,意思就是說我們定義double類型的0.0時其值是4.9e-324(十進制),即4.9乘以10的負324次方。想象得到非常接近於零了,但並非零,這樣進行除法,那結果肯定就是無限大了(Infinity)。
關於java類的繼承協變返回類型的例子
栽自《java編程思想第八章8.4節》
package com.wwp.abc; /** * * 1 子類完全擁有父類的方法,且具體子類必須實現父類的抽象方法。 * 2 子類中可以增加自己的方法. * 3 當子類覆蓋或實現父類的方法時,方法的形參要比父類方法的更爲寬鬆。(逆變) * 4 當子類覆蓋或實現父類的方法時,方法的返回值要比父類更嚴格(協變) * * * * ***/ public class Test1 { public static void main(String []args){ //int c=a.age; Mill m=new Mill(); Grain g=m.process(); System.out.println(g); m=new WheatMill(); g=m.process(); System.out.println(g); } } class Grain{ @Override public String toString(){ return "Grain"; } } class Wheat extends Grain{ @Override public String toString(){ return "Wheat"; } } class Mill{ public Grain process(){ return new Grain(); } } class WheatMill extends Mill{ @Override public Wheat process(){ return new Wheat(); } }
輸出結果爲
Grain
Wheat
java接口之再學習
在《thinking in java》裏的第九章接口講解中,講到了策略模式和適配器模式。於是自己聯繫生活中的電腦與USB連接手機的例子。進行理解。
package com.wwp.abc; /** * *接口的適配器功能及策略模式Demo * * * * ***/ public class Test1 { public static void main(String []args){ Computer computer=new Computer(new Androidphone()); computer.conectionWrite(); computer.connectionRead(); computer=new Computer(new Iphone()); computer.conectionWrite(); computer.connectionRead(); } } interface USB{ public void write();//寫 public void read();//讀 } class Androidphone implements USB{ public void write(){ System.out.println("安卓手機在寫數據"); } public void read(){ System.out.println("安卓手機在讀數據"); } } class Iphone implements USB{ public void read() { // TODO Auto-generated method stub System.out.println("蘋果手機在讀數據"); } public void write() { // TODO Auto-generated method stub System.out.println("蘋果手機在寫數據"); } } class Computer{ public Computer(USB usb){ this.usb=usb; } private USB usb; private String name; public USB getUsb() { return usb; } public void setUsb(USB usb) { this.usb = usb; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void connectionRead(){ usb.read(); } public void conectionWrite(){ usb.write(); } }
從上面的例子可以看出接口的靈活性,當想和電腦連接時,必須實現USB接口裏的方法,即某些協議你必須遵守。至於你是誰,並不是電腦關心的。而這裏的接口就起到了一個橋樑的作用,它建立了設備與電腦間的聯繫,同樣別的類型設備想要連接電腦,那它實現該接口即可。這就是所謂的適配器模式。接口就是一個適配器。而電腦內部則是採用策略模式,根據不同的接口實現類,調用不同的實現方法。這樣使代碼更加簡潔,同時增加了代碼的擴展性。