使用"Object"关键字在Java中创建对象

Coo*_*oli 1 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 baCls = BankAccount.class;
    try {
    Object myAccount = baCls.newInstance();
    aStorage.setValue( myAccount );
    myAccount.deposit( 15 );
    }
    catch ( InstantiationException e ) {
    }
    catch ( IllegalAccessException e ) {
    }
}}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这些错误:

  • 对于Object类型,方法deposit(int)是未定义的
  • 存储类型中的方法setValue(BankAccount)不适用于参数(Object).

之后我试图替换:

Object myAccount = baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)

BankAccount myAccount = baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)

但后来我收到了这个错误:

  • 类型不匹配:无法从Object转换为BankAccount

我知道正确的方法是:

BankAccount myAccount = (BankAccount) baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)

但我不确定我理解为什么......我试图从各种来源阅读它,所以我有一些理论,但我仍然无法正确地理解这一点.有人可以帮我理解吗?

PS很抱歉发布这样一个基本问题.

Jas*_*son 9

执行BankAccount myAccount = baCls.newInstance()调用反射以创建新对象.Class是通用的,但您尚未指定泛型类型.如果你这样做,Class<BankAccount> baCls = BankAccount.class你就不需要施放.

Java是强类型的.通过声明一个对象,就像object你对该语言说这个对象只是一个对象:就是它只有在所有对象上找到的方法和字段,仅此而已.

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

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

然而,更大的问题是你newInstance首先使用的原因.有可能做到:

BankAccount myAccount = new BankAccount();
Run Code Online (Sandbox Code Playgroud)

对于初学者来说,反思有点先进.

  • 执行`BankAccount myAccount = baCls.newInstance()`调用反射来创建一个新对象.类是通用的,但您尚未指定泛型类型.如果你做`Class <BankAccount> baCls = BankAccount.class`那你就不需要施放. (3认同)