`

14章类型信息-之类型转换前先做检查--之instanceof

 
阅读更多

instanceof用法:

对于instanceof有比较严格的限制,只可将其与命名类型进行比较,而不能与class对象做比较。

理解:这里所说的就是像if(pet instanceof Mutt)
counter.count("Mutt");这里的Mutt,不能用对象比较,只能用类名,比如(Mutt mutt = new Mutt()然后用mutt)或者 Mutt.class就不行了,

实例代码:

实体类父类:

//: typeinfo/pets/Individual.java
package typeinfo.pets;


public class Individual implements Comparable<Individual> {
private static long counter = 0;
private final long id = counter++;
private String name;
public Individual(String name) { this.name = name; }
// 'name' is optional:
public Individual() {}
public String toString() {
return getClass().getSimpleName() +
(name == null ? "" : " " + name);
}
public long id() { return id; }
public boolean equals(Object o) {
return o instanceof Individual &&
id == ((Individual)o).id;
}
public int hashCode() {
int result = 17;
if(name != null)
result = 37 * result + name.hashCode();
result = 37 * result + (int)id;
return result;
}
public int compareTo(Individual arg) {
// Compare by class name first:
String first = getClass().getSimpleName();
String argFirst = arg.getClass().getSimpleName();
int firstCompare = first.compareTo(argFirst);
if(firstCompare != 0)
return firstCompare;
if(name != null && arg.name != null) {
int secondCompare = name.compareTo(arg.name);
if(secondCompare != 0)
return secondCompare;
}
return (arg.id < id ? -1 : (arg.id == id ? 0 : 1));
}
} ///:~

继承类:

//: typeinfo/pets/Cat.java
package typeinfo.pets;


public class Cat extends Pet {
public Cat(String name) { super(name); }
public Cat() { super(); }
} ///:~

 

//: typeinfo/pets/Dog.java
package typeinfo.pets;


public class Dog extends Pet {
public Dog(String name) { super(name); }
public Dog() { super(); }
} ///:~

 

//: typeinfo/pets/Rodent.java
package typeinfo.pets;


public class Rodent extends Pet {
public Rodent(String name) { super(name); }
public Rodent() { super(); }
} ///:~

创建宠物的抽象类:

//: typeinfo/pets/PetCreator.java
// Creates random sequences of Pets.
package typeinfo.pets;
import java.util.*;


public abstract class PetCreator {
private Random rand = new Random(47);
// The List of the different types of Pet to create:
public abstract List<Class<? extends Pet>> types();
public Pet randomPet() { // Create one random Pet
int n = rand.nextInt(types().size());
try {
return types().get(n).newInstance();
} catch(InstantiationException e) {
throw new RuntimeException(e);
} catch(IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public Pet[] createArray(int size) {
Pet[] result = new Pet[size];
for(int i = 0; i < size; i++)
result[i] = randomPet();
return result;
}
public ArrayList<Pet> arrayList(int size) {
ArrayList<Pet> result = new ArrayList<Pet>();
Collections.addAll(result, createArray(size));
return result;
}
} ///:~

实现(创建宠物抽象类)的实现类:

//: typeinfo/pets/ForNameCreator.java
package typeinfo.pets;
import java.util.*;


public class ForNameCreator extends PetCreator {

private static List<Class<? extends Pet>> types =
new ArrayList<Class<? extends Pet>>();
// Types that you want to be randomly created:
private static String[] typeNames = {
"typeinfo.pets.Cat",
"typeinfo.pets.Dog",
"typeinfo.pets.Rodent"
};
@SuppressWarnings("unchecked")
private static void loader() {
try {
for(String name : typeNames)
types.add(
(Class<? extends Pet>)Class.forName(name));
} catch(ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
static { loader(); }
public List<Class<? extends Pet>> types() {return types;}
} ///:~

用于计算各个宠物个数的类:

package typeinfo.pets;


//: typeinfo/PetCount.java
// Using instanceof.
import typeinfo.pets.*;
import java.util.*;
import static net.mindview.util.Print.*;


public class PetCount {
static class PetCounter extends HashMap<String,Integer> {
public void count(String type) {
Integer quantity = get(type);
if(quantity == null)
put(type, 1);
else
put(type, quantity + 1);
}
}
public static void countPets(PetCreator creator) {
PetCounter counter= new PetCounter();
for(Pet pet : creator.createArray(20)) {
// List each individual pet:
printnb(pet.getClass().getSimpleName() + " ");
if(pet instanceof Pet)
counter.count("Pet");
if(pet instanceof Dog)
counter.count("Dog");
if(pet instanceof Cat)
counter.count("Cat");
if(pet instanceof Rodent)
counter.count("Rodent");
}
// Show the counts:
print();
print(counter);
}
public static void main(String[] args) {
countPets(new ForNameCreator());
}
}

//测试打印:Rodent Rodent Dog Rodent Dog Rodent Dog Rodent Cat Dog Cat Cat Cat Dog Rodent Dog Dog Dog Rodent Dog
//{Cat=4, Pet=20, Dog=9, Rodent=7}

工具类:

//: net/mindview/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
package net.mindview.util;
import java.io.*;


public class Print {
// Print with a newline:
public static void print(Object obj) {
System.out.println(obj);
}
// Print a newline by itself:
public static void print() {
System.out.println();
}
// Print with no line break:
public static void printnb(Object obj) {
System.out.print(obj);
}
// The new Java SE5 printf() (from C):
public static PrintStream
printf(String format, Object... args) {
return System.out.printf(format, args);
}
} ///:~

 

分享到:
评论

相关推荐

    java学习笔记 初学者必读

    4.4. 强制类型转换 4-8 4.5. 转换的二种类型 4-8 4.6. 控制流 4-8 4.7. 循环语句 4-8 5. 四•数组 5-9 5.1. 声明数组 5-9 5.2. 创建数组 5-9 5.3. 初始化数组 5-10 5.4. 多维数组 5-10 5.5. 数组拷贝 5-10 6. 五•...

    corejavaNoteBook

    4.4. 强制类型转换 4-8 4.5. 转换的二种类型 4-8 4.6. 控制流 4-8 4.7. 循环语句 4-8 5. 四•数组 5-9 5.1. 声明数组 5-9 5.2. 创建数组 5-9 5.3. 初始化数组 5-10 5.4. 多维数组 5-10 5.5. 数组拷贝 5-10 6. 五•...

    Java Bug模式详解

    22.1.7 将类型转换和 instanceof测试降至最少 22.1.8 使用Singleton设计模式帮助最小化instanceof的使用 22.2 将引入bug的可能降至最 低 22.2.1 提取通用代码 22.2.2 尽可能实现纯 功能性方法 22.2.3 在构造...

    疯狂JAVA讲义

    5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,...

    java8集合源码-kotlin:这个代码仓库有关于kotlin、springkotlin的信息

    java8集合源码Kotlin 在行动 Kotlin 是一种类似于 Java 的静态类型语言。 想测试您的 ...这是一个显式的类型转换。 val n = e as Num for循环在 kotlin 中是不同的。 检查示例LoopExample.kt文件。 地图

    整理后java开发全套达内学习笔记(含练习)

    instanceof (关键字) 运算符,用于引用变量,以检查这个对象是否是某种类型。返回 boolean 值。 interface (关键字) 接口 ['intәfeis] invoke vt.调用 [in'vәuk]' ( invocation [,invәu'keiʃәn]) Iterator ...

    Java开发技术大全 电子版

    2.3.10数据类型转换34 2.4运算符与表达式37 2.4.1算术运算符和算术表达式38 2.4.2关系运算符和关系表达式43 2.4.3逻辑运算符和逻辑表达式44 2.4.4条件运算符和条件表达式48 2.4.5位运算符和位运算表达式50 ...

    corejava培训文档

    4.4. 强制类型转换 4.5. 转换的二种类型 4.6. 控制流 4.7. 循环语句 5. 四 数组 5.1. 声明数组 5.2. 创建数组 5.3. 初始化数组 5.4. 多维数组 5.5. 数组拷贝 6. 五 对象和类 6.1. 面向对象与面向...

    javaSE代码实例

    8.4.2 对象引用的强制类型转换 131 8.4.3 对象引用所能调用的成员 132 8.4.4 对象引用的赋值与比较 133 8.5 方法的继承与重写 135 8.5.1 方法的继承规则 135 8.5.2 方法重写的基本知识 136 8.5.3 构成...

    javascript学习笔记.docx

    当类的这两个方法实现不一致时,在要进行类型转换时指定具体的实现方法比较安全。 4) 在比较运算中,若一个对象或值被转换成NaN(Not a Number),则永远返回false。 5) in可以检查指定字符串是否是一个对象的基本...

    Java-Tutorial:该项目包括有关Java核心,io,集合,oop,多线程,异常处理,java 8,jsoup,docx4j,Web服务,jdbc,单元测试,java公共库的所有示例

    源代码指导Java的基本知识,例如:安装Java开发环境,创建和运行Java程序,声明变量,数据类型,使用数组,控件结构,编码标准(编码约定),数据类型转换,枚举,正则表达式, ... 链接: : Java中的面向对象...

    超级有影响力霸气的Java面试题大全文档

    引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 21、heap和stack有什么区别。  栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的...

    JAVA面试题最全集

    数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字转换为字符 如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何...

    java jdk实列宝典 光盘源代码

    12反射 是java程序开发的特征之一,允许java程序对自身进行检查,并能直接操作程序的内部属性; instanceof操作符,instanceof.java; 获取类的信息,ViewClassInfoJrame.java; 动态调用类的方法,CallMetod.java; ...

    java 面试题 总结

    引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 18、heap和stack有什么区别。 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式...

Global site tag (gtag.js) - Google Analytics