Java 将对象作为参数传递
我有一个java代码,我试图通过将类的对象传递给函数来打印语句。代码如下:Java 将对象作为参数传递,java,function,object,Java,Function,Object,我有一个java代码,我试图通过将类的对象传递给函数来打印语句。代码如下: import java.io.*; class Abc { public static void print(Object o) { o.name(); } public static void main(String args[]) { Vendor obj=new Vendor(); print(obj); } } cl
import java.io.*;
class Abc
{
public static void print(Object o)
{
o.name();
}
public static void main(String args[])
{
Vendor obj=new Vendor();
print(obj);
}
}
class Vendor
{
public void name()
{
System.out.println("The name of the customer is chandeep");
}
}
我得到的错误是,在Abc类中找不到符号名()。我知道这是一个适当的错误,但我如何解决它 它不起作用,因为
Object
类没有name()
这样的方法,而您正试图在类型为Object
的引用上调用它
只需更改方法签名,将供应商
引用作为参数:-
public static void print(Vendor vendor) {
vendor.name();
}
由于您的方法
name()
位于Vendor
类中,并且您正在传递Vendor
的引用,因此您不需要在方法中使用对象作为形式参数 它不起作用,因为Object
类没有name()
这样的方法,而您正试图在类型为Object
的引用上调用它
只需更改方法签名,将供应商
引用作为参数:-
public static void print(Vendor vendor) {
vendor.name();
}
由于您的方法name()
位于Vendor
类中,并且您正在传递Vendor
的引用,因此您不需要在方法中使用对象作为形式参数 如果您知道o是供应商,则将其强制转换为类型供应商,或者将参数类型重写为仅为供应商,而不是方法定义中的泛型对象如果您知道o是供应商,则将其强制转换为类型供应商,或者将参数类型重写为仅为供应商,而不是方法定义中的泛型对象方法print()
的参数类型为对象
而不是供应商
类型。因此,它需要类型为Object
的任何实例,该实例没有方法name()
。当然,实际的实例可能会扩展对象
,并将name()
添加到方法列表中,但编译器无法知道这一点
如果希望print()
方法只接受Vendor
,只需将参数从Object
更改为Vendor
。如果希望它接受不同的对象,则需要一种稍微复杂一些的面向对象方法。因为方法print()
的参数类型为object
而不是Vendor
类型。因此,它需要类型为Object
的任何实例,该实例没有方法name()
。当然,实际的实例可能会扩展对象
,并将name()
添加到方法列表中,但编译器无法知道这一点
如果希望print()
方法只接受Vendor
,只需将参数从Object
更改为Vendor
。如果您想让它接受不同的对象,那么您需要一种稍微复杂一点的面向对象方法。强制转换是个坏主意。更改参数类型是个好主意。OP是否表示他/她可以自由更改方法的参数类型,或者您只是假设了这一点?答案是,你只是假设。该方法可以是他/她正在编写的API,它有一个故意使用的泛型参数类型,即他/她不能随意更改的等于(对象)。如果您阅读我写的内容,您会发现我涵盖了这两种情况,并指出了在可能的情况下更改参数类型的首选项。你在假设OP从未说过的话,并据此给出不好的建议。选角是个坏主意。更改参数类型是个好主意。OP是否表示他/她可以自由更改方法的参数类型,或者您只是假设了这一点?答案是,你只是假设。该方法可以是他/她正在编写的API,它有一个故意使用的泛型参数类型,即他/她不能随意更改的等于(对象)。如果您阅读我写的内容,您会发现我涵盖了这两种情况,并指出了在可能的情况下更改参数类型的首选项。你在假设OP从未说过的话,并据此给出不好的建议。OP没有表示他可以自由更改参数类型。如果他是,那么改变它是正确的。如果他不是,那么你的建议是无用的,他必须投。在攻击他人之前,请仔细考虑他人的答案,如下所示。谢谢-1对于基于假设的不完整建议-因为攻击其他的海报,事实上,这些海报给出了正确的答案。为什么他不能根据你的意见改变呢?类Abc没有实现任何接口,也没有扩展任何限制它的抽象类,因此没有对不更改print()的限制,main()类在他显示的代码中,因此从上下文来看,他显然是一个试图学习OO概念的初学者。我说过,如果他想要接受不同的对象,他需要一种更复杂的OO方法,这不是类型转换。从他接受的答案可以看出,事实上是前者。打字一直被认为是最后的手段,先去学一些OOP。嘿,谢谢,我对OOP很熟悉。至于你的反驳,不,用户只是说他“拥有”一个类,这个类是一个模棱两可的语句,意思仅仅是因为某种原因他正在与一个类交互。。他可能是作者,也可能是消费者。他的问题中没有任何东西表明它是什么。因此,我给出了两个答案。问题是,你没有理由贬低我,因为你对我的答案的评价是事实上、客观上的错误。如果你要贬低别人,你应该对他们保持谨慎和准确。你们两个都不是。你们似乎不明白软件是由独立的团队编写的,他们相互使用自制的类。他们没有修改正在编写的类的选项(用OP的说法是“有”)。正如我在回答中所说的,如果参数是泛型的,那么如果不能重写它,您可能需要强制转换。顺便说一句,d