Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定对象';什么课?_Java_Inheritance - Fatal编程技术网

Java 如何确定对象';什么课?

Java 如何确定对象';什么课?,java,inheritance,Java,Inheritance,如果classB和classC扩展classA并且我有一个类型为B或C的对象,我如何确定它是哪种类型的实例?使用。它返回对象的运行时类型。您可以使用: if (obj instanceof C) { //your code } Object instance = new SomeClass(); instance.getClass().getName(); //will return the name (as String) (== "SomeClass") instance.getClass

如果class
B
和class
C
扩展class
A
并且我有一个类型为
B
C
的对象,我如何确定它是哪种类型的实例?

使用。它返回对象的运行时类型。

您可以使用:

if (obj instanceof C) {
//your code
}
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

嗯。但是我认为大多数时候,将其用于控制流或类似的东西是不好的实践…

使用任何建议的方法都被认为是基于糟糕的OO设计的代码气味

如果您的设计很好,您应该不需要使用
getClass()
instanceof

任何建议的方法都可以,但需要记住的是,在设计方面。

在“
类上也有一个方法。如果您通过
myBanana.getClass()
获取对象的类,您可以查看您的对象
myApple
是否与
myBanana
通过

myBanana.getClass().isInstance(myApple)

在这种情况下,我们可以使用反射

objectName.getClass().getName();
例如:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

在本例中,您将获得对象传递给
HttpServletRequest
接口引用变量的类的名称。

给出了多个正确答案,但还有更多方法:
class.isAssignableFrom()
并尝试强制转换对象(这可能会引发
ClassCastException

总结了可能的方法 让我们总结一下测试对象
obj
是否为
C
类型实例的可能方法:

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
处理中的差异 尽管在
null
处理方面存在差异:

  • 在前两种方法中,如果
    obj
    null
    null
    不是任何实例),则表达式的计算结果为
    false
  • 第三个方法显然会抛出一个
    NullPointerException
  • 第四和第五种方法则相反,它们接受
    null
    ,因为
    null
    可以强制转换为任何类型
请记住:
null
不是任何类型的实例,但它可以强制转换为任何类型

笔记
  • Class.getName()
    不应用于执行“is实例”测试,因为如果对象不是
    C
    类型,而是它的子类,则它可能具有完全不同的名称和包(因此类名显然不匹配),但它仍然是
    C
    类型
  • 出于相同的继承原因,
    Class.isAssignableFrom()
    不是对称的:
    如果
    obj
    的类型是
    C
    的子类,则
    obj.getClass().isAssignableFrom(C.class)
    将返回
    false

如果您想在运行时知道,使用
isinstance()检查是不够的。
使用:


我在GeneralUtils类中使用blow函数,请检查它是否有用

    public String getFieldType(Object o) {
    if (o == null) {
        return "Unable to identify the class name";
    }
    return o.getClass().getName();
}

我使用Java8泛型来获取运行时的对象实例,而不必使用switch case

 public <T> void print(T data) {
    System.out.println(data.getClass().getName()+" => The data is " + data);
}
以下是输出

java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []

您可以使用getSimpleName()

假设我们有一个对象:Dog d=new Dog()

我们可以使用下面的语句来获取类名:Dog。例如:

d.getClass().getSimpleName()//返回字符串“Dog”


PS:d.getClass()将为您提供对象的全名。

是的,可能99%的getClass和instanceof的使用都可以通过多态方法调用避免。我同意这一点。在本例中,我使用的是从xml生成的对象,它遵循的是一个设计糟糕的模式,我没有所有权。有时分离接口是好的。有时,您想知道A是否为B,但不想强制要求A为B,因为大多数功能只需要A—B具有可选功能。此外,有时您需要确保对象与您比较的对象属于同一类;例如,我喜欢在创建自己的类时重写对象的equals方法。我总是要验证输入的对象是否属于同一类。此外,我会说,告诉人们某些事情是不好的,而不解释确切原因,也不提及解释该问题的论文、书籍或任何其他资源被认为是没有建设性的。因此,知道我在StackOverflow,我不知道为什么人们对这个答案投了这么多的赞成票。这里发生了一些变化…@starblue Casting将是我首先想到的事情。如果不需要的话,我怀疑instanceof操作符是否存在。@b1nary.atr0phy首先使用isntanceof操作符不是很好吗。如果存在对不兼容类型的强制转换,我相信这将导致ClassCastException。注意反向检查或如何检查对象是否不是类的实例是很有用的:
If(!(obj instanceof C))
我相信getClass()方法是原始问题的答案。在这种情况下(obj instanceof A)也会给出“true”输出,但目的是在图片中查找对象的运行时类。如果Parent1由Child1和Child2扩展,请尝试以下
code
Child1 Child1=new Child1();Parent1 parentChild=新的Child2();Child2 Child2=新的Child2();(父母的子女1实例1);(child1的child1实例);(Child2的parentChild实例);(Parent1的parentChild实例);(Child1的parentChild实例)
code
,它可能会清除instanceof的意图。绝对是构建接口的替代方案如果我有两个类实现单个接口怎么办?如何区分对象的确切类?但有一件事,若obj为null,它就不起作用。然后,解决方案将是ParentInterface.class.isAssignableFrom(Child.class)。这是对不同方法中许多缺陷的一个非常好的总结。谢谢你这么完整的评论!这是正确的。仅使用
obj.getClass()    String str = "Hello World";
    int number = 10;
    double decimal = 10.0;
    float f = 10F;
    long l = 10L;
    List list = new ArrayList();
    print(str);
    print(number);
    print(decimal);
    print(f);
    print(l);
    print(list);
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []