java學習tips

今天逛貼吧的時候偶然發現吧友的一個有趣例子。

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();
	}
	
}

結果爲wKioL1ej-aGDFQjHAAAmFUkI7TM632.png


從上面的例子可以看出接口的靈活性,當想和電腦連接時,必須實現USB接口裏的方法,即某些協議你必須遵守。至於你是誰,並不是電腦關心的。而這裏的接口就起到了一個橋樑的作用,它建立了設備與電腦間的聯繫,同樣別的類型設備想要連接電腦,那它實現該接口即可。這就是所謂的適配器模式。接口就是一個適配器。而電腦內部則是採用策略模式,根據不同的接口實現類,調用不同的實現方法。這樣使代碼更加簡潔,同時增加了代碼的擴展性。

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