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编程语言中,强制类型转换是将一个数据类型转换为另一个数据类型的语法操作。这通常发生在需要将数值从精度较高的类型转换为精度较低的类型,或者在处理对象时需要明确指定子类对象为父类类型的情况。在“java...
根据转换方式的不同,类型转换可以分为两大类:自动类型转换(也称隐式类型转换)与强制类型转换(也称显式类型转换)。此外,在面向对象编程中,还涉及到对象类型的转换。 #### 二、自动类型转换 自动类型转换是...
在Java面向对象编程中,`instanceof`运算符是一个至关...同时,结合强制类型转换,可以确保我们在操作对象时不会因类型不匹配而导致运行时错误。因此,熟练掌握`instanceof`的使用对于构建健壮的农业信息系统至关重要。
// 强制类型转换后调用Dog的方法 } else if (animal instanceof Cat) { ((Cat) animal).meow(); // 强制类型转换后调用Cat的方法 } ``` 此外,`instanceof`还可以用于检查对象是否实现了特定的接口。假设我们有一...
- 强制转换前需要进行`instanceof`检查,以避免`ClassCastException`。 ### 数组类型的转换 数组转换通常涉及引用类型的转换,如从父类数组转换为子类数组。这种转换只能通过创建新数组并遍历旧数组来实现,因为...
1. **类型转换安全检查**:在进行强制类型转换前,我们通常会先使用`instanceof`检查目标对象是否可以被转换,以避免ClassCastException。例如: ```java if (obj instanceof String) { String str = (String)obj...
- C-style强制类型转换:`(int) value`,但不推荐,因为可能会丢失信息且难以调试。 - 构造函数转换,如`int(i)`,利用构造函数将一个类型转换为另一个类型。 6. **JavaScript中的数据类型转换**: - `Number()`...
1. **类型转换检查**: 当我们需要将一个对象强制转换为另一种类型时,使用`instanceof`可以避免不必要的ClassCastException。例如,如果`obj`是一个`Object`类型的引用,我们想要将其转换为`String`类型,可以先...
对象类型的转换则是指将一个对象从其实际类型转换为它的父类型或接口类型。这种转换有时被称为向上转型,因为我们在向类层次结构的上层移动。下面我们将深入探讨这两个概念,并通过实例代码来阐述它们的工作原理。 ...
在进行类型转换时,Java有自动类型转换和强制类型转换两种方式。 1. 自动类型转换(widening conversion): 当我们将一个数据类型转换为另一个兼容的、范围更大的数据类型时,Java会自动进行这种转换,无需程序员...
`instanceof`操作符可以帮助我们确保在进行类型转换时避免出现`ClassCastException`,这是一种在运行时抛出的异常,表明我们试图将一个对象强制转换为其实际类型不兼容的类型。 `instanceof`的基本语法如下: ```...
### JavaScript 类型转换详解 #### 一、概述 JavaScript 是一种动态类型的语言,它支持多种数据类型之间的自动转换。在日常开发中,我们经常会遇到不同类型数据间的比较或运算,这时就需要进行类型转换。掌握好 ...
在JavaScript中,数据类型转换是编程过程中不可或缺的一部分。由于JavaScript是一种动态类型语言,变量的数据类型在运行时可以改变,这给编程带来了灵活性,但也可能导致一些意外的错误。本篇文章将深入探讨...
通过使用instanceof进行检查、使用泛型确保类型安全、避免不必要的类型转换、捕获和处理异常以及进行代码审查和单元测试等方法,我们可以有效地避免和解决这类错误。正确的类型转换不仅保证了程序的正确性,也提高了...
- AS3提供了is和as操作符来检查和转换类型,而Java通常通过instanceof关键字来检查一个对象是否属于特定类或接口。 9. 泛型: - Java引入了泛型,允许在编译时指定集合元素的类型,而AS3虽然没有直接的泛型概念,...
在Java中,其语法是`object instanceof ClassName`,而在Delphi中,虽然没有直接的`instanceof`关键字,但可以通过类型转换和异常处理来达到类似的效果。如果对象确实属于指定的类,`instanceof`返回`true`,否则...
三、`instanceOf`与类型转换 虽然`instanceOf`可以用来判断对象的类型,但并不能进行类型转换。例如,即使`instanceOf`返回`true`,你也需要显式地进行类型转换,如下所示: ```java if (animal instanceof Dog) {...
在Java编程语言中,"instanceof"关键字和try-catch语句块是两种处理类型检查和异常处理的重要机制。它们各自在不同的场景下发挥着关键作用。...在涉及类型转换和异常处理的场景时,应根据具体情况选择合适的机制。
在Java编程语言中,类型转换是一项重要的操作,特别是在软件开发过程中。本文主要关注将对象转换为String类型的方法,这是在处理用户输入、日志记录、数据展示等场景中常见的需求。以下是对三种常见转换方法的详细...