今天逛贴吧的时候偶然发现吧友的一个有趣例子。
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接口里的方法,即某些协议你必须遵守。至于你是谁,并不是电脑关心的。而这里的接口就起到了一个桥梁的作用,它建立了设备与电脑间的联系,同样别的类型设备想要连接电脑,那它实现该接口即可。这就是所谓的适配器模式。接口就是一个适配器。而电脑内部则是采用策略模式,根据不同的接口实现类,调用不同的实现方法。这样使代码更加简洁,同时增加了代码的扩展性。
转载于:https://blog.51cto.com/wwpstl/1827152