Java 使用;“对象”;关键词
我刚刚开始学习java,我有两个基本问题。 我的main()如下所示: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
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()
?没有任何具体原因,我只是在尝试理解基本概念