Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Class_Object - Fatal编程技术网

Java 使用;“对象”;关键词

Java 使用;“对象”;关键词,java,class,object,Java,Class,Object,我刚刚开始学习java,我有两个基本问题。 我的main()如下所示: public class Main { public static void main(String[] args) { Storage<BankAccount> aStorage = new Storage<BankAccount>(); Storage<String> sStorage = new Storage<String>(); Class

我刚刚开始学习java,我有两个基本问题。 我的main()如下所示:

public class Main {
public static void main(String[] args) {
    Storage<BankAccount> aStorage = new Storage<BankAccount>(); 
    Storage<String> sStorage = new Storage<String>();

    Class baCls = BankAccount.class;
    try {
    Object myAccount = baCls.newInstance();
    aStorage.setValue( myAccount );
    myAccount.deposit( 15 );
    }
    catch ( InstantiationException e ) {
    }
    catch ( IllegalAccessException e ) {
    }
}}

但是我得到了这个错误:

  • 类型不匹配:无法从对象转换为BankAccount
我知道正确的方法是:

BankAccount myAccount = (BankAccount) baCls.newInstance();
但我不确定我是否理解为什么。。。 我试着从各种渠道读到它,所以我有一些理论,但我仍然不能正确地理解它。 有人能帮我理解吗

附言。
很抱歉发布这样一个基本的问题。

执行
BankAccount myAccount=baCls.newInstance()
调用反射以创建新对象<代码>类是泛型,但您尚未指定泛型类型。如果您执行了
Class baCls=BankAccount.Class
,则不需要强制转换

Java是强类型的。通过将一个对象声明为
object
,您是在对语言说这个对象只是一个对象:也就是说,它只有在所有对象上找到的方法和字段,而没有更多

通过指定类型,您可以告诉Java您可以访问哪些方法和字段,这就是为什么在编写
BankAccount myAccount
时,它允许您对其调用函数的原因

但是
baCls.newInstance()
为任何类baCls创建一个新实例。它不知道它正在创建什么类型的类,因为它是类本身的一个方法(令人困惑),所以您必须通过强制转换告诉Java您希望它返回什么类:
BankAccount myAccount=(BankAccount)baCls.newInstance()

然而,更大的问题是,首先为什么要使用
newInstance
。是否有可能做到:

BankAccount myAccount = new BankAccount();

反射对于初学者来说有点高级。

执行
BankAccount myAccount=baCls.newInstance()
调用反射来创建新对象<代码>类
是泛型,但您尚未指定泛型类型。如果您执行了
Class baCls=BankAccount.Class
,则不需要强制转换

Java是强类型的。通过将一个对象声明为
object
,您是在对语言说这个对象只是一个对象:也就是说,它只有在所有对象上找到的方法和字段,而没有更多

通过指定类型,您可以告诉Java您可以访问哪些方法和字段,这就是为什么在编写
BankAccount myAccount
时,它允许您对其调用函数的原因

但是
baCls.newInstance()
为任何类baCls创建一个新实例。它不知道它正在创建什么类型的类,因为它是类本身的一个方法(令人困惑),所以您必须通过强制转换告诉Java您希望它返回什么类:
BankAccount myAccount=(BankAccount)baCls.newInstance()

然而,更大的问题是,首先为什么要使用
newInstance
。是否有可能做到:

BankAccount myAccount = new BankAccount();

反射对于初学者来说有点高级。

因为您已经通过对象接口定义了反射,而对象接口不知道特定于对象的方法,例如deposit()

应该是

BankAccount myAccount = (BankAccount)(baCls.newInstance());
或者干脆

BankAccount myAccount = new BankAccount();
然后,您可以调用它的存款,正如BankAccount定义的合同中存在的那样,假设baCls确实是一个银行帐户。如果您不确定银行账户的类型,您可以事先使用银行账户的实例进行检查

通过进一步解释

如果我定义了一个
OperatingSystem
类,那么我将该类分为
UnixOperatingSystem
WindowsOperatingSystem
。现在,显然有一些东西是共同的,但也具体到每台计算机。但是如果我这样做

OperatingSystem os = new WindowsOperatingSystem();

然后,我创建了一个WindowsOperatingSystem,但只允许调用常见的OperatingSystem方法,因为这是超类中通过方法签名契约定义的。因此,我可能可以调用
shutdown()
方法(因为任何操作系统都应该能够关闭),但不能调用
runBatchFile(“test.bat”)
方法。我需要将其显式声明为WindowsOperatingSystem,以便能够调用该特定方法。

因为您通过对象接口定义了它,而对象接口不知道特定于对象的方法,例如deposit()

应该是

BankAccount myAccount = (BankAccount)(baCls.newInstance());
或者干脆

BankAccount myAccount = new BankAccount();
然后,您可以调用它的存款,正如BankAccount定义的合同中存在的那样,假设baCls确实是一个银行帐户。如果您不确定银行账户的类型,您可以事先使用银行账户的实例进行检查

通过进一步解释

如果我定义了一个
OperatingSystem
类,那么我将该类分为
UnixOperatingSystem
WindowsOperatingSystem
。现在,显然有一些东西是共同的,但也具体到每台计算机。但是如果我这样做

OperatingSystem os = new WindowsOperatingSystem();

然后,我创建了一个WindowsOperatingSystem,但只允许调用常见的OperatingSystem方法,因为这是超类中通过方法签名契约定义的。因此,我可能可以调用
shutdown()
方法(因为任何操作系统都应该能够关闭),但不能调用
runBatchFile(“test.bat”)
方法。我需要将其显式声明为WindowsOperatingSystem,以便能够调用该特定方法。

您尝试使用
对象#newInstance
而不是像
BankAccount myAccount=new BankAccount()
这样的东西来实例化有什么原因吗?没有任何具体原因,我只是在尝试理解该语言的基本概念:)有什么原因让你尝试使用
Object\newInstance
而不是像
BankAccount myAccount=newbankaccount()
?没有任何具体原因,我只是在尝试理解基本概念