Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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_Reflection_Object_Constructor - Fatal编程技术网

Java 如何知道在创建对象时使用了哪个构造函数?

Java 如何知道在创建对象时使用了哪个构造函数?,java,reflection,object,constructor,Java,Reflection,Object,Constructor,考虑 Class A has two constructors new A(int), new A(int, String) 也 然后给出这样一个陈述 A a1= new A(4); A a2= new A(3, "foo"); 后来在代码中(或在传递这些对象的某些方法中) 如果我想区分基于对象(a1和a2)和基于类实例表达式(在构造函数上直接调用show)的show方法,但不知道使用了哪个构造函数(特别是对于对象a1和a2)我如何找到它——比如说反射?不可能通过反射来确定使用哪个构造函数实

考虑

Class A has two constructors new A(int), new A(int, String)

然后给出这样一个陈述

A a1= new A(4);
A a2= new A(3, "foo");
后来在代码中(或在传递这些对象的某些方法中)


如果我想区分基于对象(a1和a2)和基于类实例表达式(在构造函数上直接调用show)的show方法,但不知道使用了哪个构造函数(特别是对于对象a1和a2)我如何找到它——比如说反射?

不可能通过反射来确定使用哪个构造函数实例化对象。为什么不在每个构造函数中简单地将实例变量设置为不同的值,以跟踪调用了哪个实例变量?

不可能通过反射来确定使用哪个构造函数实例化对象。为什么不在每个构造函数中将一个实例变量设置为不同的值以跟踪调用了哪个实例变量?

唯一的方法是让每个构造函数设置一个不同的变量以指示它被使用


但我同意汤姆的观点;这听起来是个坏主意。如何创建对象并不重要(因为构造函数可能根本没有被使用过,比如序列化),重要的是它的所有属性(公共或非公共)都被正确设置,为了反映它需要处于的状态。

唯一的方法是让每个构造函数设置一个不同的变量来指示它被使用


但我同意汤姆的观点;这听起来是个坏主意。创建对象的方式并不重要(因为构造函数可能根本没有被使用过,比如说在序列化中),重要的是它的所有属性(公共或非公共)都被适当地设置,以反映它需要处于的状态。

也许一个对象应该是两个不同的类(每个类都有不同的构造函数);或者一个公共基类的两个不同的子类:这样,每个类都可以有自己的show方法的不同实现


或者,在a(可能是布尔值或字符串)中有一个数据成员,其值由每个构造函数设置不同。

可能a应该是两个不同的类(每个类具有不同的构造函数);或者一个公共基类的两个不同的子类:这样,每个类都可以有自己的show方法的不同实现


或者,在一个(可能是一个布尔值或字符串)中有一个数据成员,其值由每个构造函数设置不同。

同意最好使用两个单独的类,在这种情况下,可以使用多态性(例如C#)

然后给学生打电话

Base a1= new A(4);
Base a2= new B(3, "foo");

基于a1和a2对象,应该很容易区分这些显示方法。

同意最好使用两个单独的类,在这种情况下,可以使用多态性(例如C#)

然后给学生打电话

Base a1= new A(4);
Base a2= new B(3, "foo");

基于a1和a2对象,应该很容易区分这些显示方法。

如果两个类具有不同的行为集,那么它们是两个不同的类。单个类的行为不应因其构造方式而有所不同。

如果两个类具有不同的行为集,则它们是两个不同的类。单个类的行为不应该因其构造方式而有所不同。

那么调用show的所有四种方式都应该执行不同的操作吗

为什么以及每种行为之间的区别是什么

不知道更多,我们只能胡乱猜测。这听起来确实像是两个甚至四个类(加上一个基类/接口)和一个创建它们的工厂的工作

如果问题纯粹是理论性的-否,您无法在运行时分辨出以下两者之间的区别:

A a = new A();
a.show();


这样做的唯一方法是检查源代码,因此您必须包含源代码并使用完整的源代码进行编译。解析源代码以了解如何调用它。

那么所有四种调用show的方法都应该执行一个差异操作吗

为什么以及每种行为之间的区别是什么

不知道更多,我们只能胡乱猜测。这听起来确实像是两个甚至四个类(加上一个基类/接口)和一个创建它们的工厂的工作

如果问题纯粹是理论性的-否,您无法在运行时分辨出以下两者之间的区别:

A a = new A();
a.show();


这样做的唯一方法是检查源代码,因此您必须包含源代码并使用完整的源代码进行编译。分析源代码以确定它是如何被调用的。

这听起来像是一种“我真的不知道你为什么要这么做,但这是个坏主意”的情况。如果可以的话,你可能想澄清并添加一些细节。另外,如果可能的话,我们需要知道你在说什么语言。C#?C++?Javascript?Java?这是为了什么?这似乎是一个“标记”类,可能应该分为两个类。更多的信息会给出更好的答案。这听起来像是一种“我真的不知道你为什么要这么做,但这是个坏主意”的情况。如果可以的话,你可能想澄清并添加一些细节。另外,如果可能的话,我们需要知道你在说什么语言。C#?C++?Javascript?Java?这是为了什么?这似乎是一个“标记”类,可能应该分为两个类。更多的信息会给出更好的答案。可能需要注意的是,构造函数并不总是被调用来创建对象,所以这个解决方案通常不会起作用。silky:请告诉我,你是如何在不调用构造函数的情况下用Java创建对象的?R:公平地说,当我评论到海报没有确认该语言时;我不是一个普通的Java用户,但有人告诉我,通过
sun.misc.Unsafe
,这是可能的。需要进一步研究;放心吧
A a = new A();
a.show();
new A().show();