我对 class 的多态性和对象感到困惑
I am confused about Polymorphism and object of class
class A {}
class B extends A{}
A objectX = new B();
最后一行是什么意思?它是 class A 的对象还是 class B 的对象。
实例和对象是否具有相同的含义? objectX 是 A 的实例还是 B 的实例?
当我们运行objectX.SomeMethod。编译器会检查什么?或者方法将在 运行 时间检查?
class A{}
class B extends A{}
public class Main{
public static void main(String[] args){
A objectX = new B();
System.out.println(objectX instanceof B);//line 1
System.out.println(objectX instanceof A);//line 2
}
}
如果我 运行 上面的代码为什么第 1 行和第 2.objectX 行指向 B.How 为真,那么 objectX 是 A 的一个实例。?
检查这个例子:
Object aStringObject=new String();
在您的方案中,A 是对象(所有对象的超级 class),B 是字符串。因此,对于您的问题,现在 aStringObject 是对 class 字符串对象的引用(或指针)。它被定义为具有 Object 类型的引用,因此它可以指向不同类型的对象而不仅仅是字符串。因此,如果您想避免代码中的编译错误,您只能将其用作对象。
如果你知道它是一个字符串(你指向的实例是字符串类型),你可以将它转换为一个字符串,这样就没问题了。在上面的例子中你可以这样做:
String aStringString = (String) aStringObject;
但是如果那个对象不是你刚刚声明的东西,你不能确定你能做到这一点,而且根据它的声明,它可以是一个字符串,但也不能是一个。
你的情况:
A objectX = new B();
objectX 是类型 B 的实例,但引用(指针)是用类型 A 声明的,因此您可以安全地(无需强制转换)将其用作类型 A 对象,并且它将起作用,因为类型 B 的所有对象都是也是 A :) 你可以做 ((B)objectX).bMethod() 因为你知道它实际上是 B 但它不安全因为它可以是这样声明的 A。
A objectX = new B();
这里的objectX是Class A(parent class)的引用,它可以持有class A或class B(child class).
和 = 的右侧,即 new B(),是 B class(child class) 的对象。
永远记住 java 对象是使用 new 关键字创建的。所以左侧部分是参考,右侧部分是对象。
当你这样调用方法时
objectX.someMethod()
在这种情况下,第一个编译器检查方法存在于参考 class(A class) 或 not.if 不存在然后显示错误。
如果找到方法,那么方法将从子 class(B class) 调用。因为方法绑定是在运行时完成的。
class A {}
class B extends A{}
A objectX = new B();
最后一行是什么意思?它是 class A 的对象还是 class B 的对象。
实例和对象是否具有相同的含义? objectX 是 A 的实例还是 B 的实例?
当我们运行objectX.SomeMethod。编译器会检查什么?或者方法将在 运行 时间检查?
class A{}
class B extends A{}
public class Main{
public static void main(String[] args){
A objectX = new B();
System.out.println(objectX instanceof B);//line 1
System.out.println(objectX instanceof A);//line 2
}
}
如果我 运行 上面的代码为什么第 1 行和第 2.objectX 行指向 B.How 为真,那么 objectX 是 A 的一个实例。?
检查这个例子:
Object aStringObject=new String();
在您的方案中,A 是对象(所有对象的超级 class),B 是字符串。因此,对于您的问题,现在 aStringObject 是对 class 字符串对象的引用(或指针)。它被定义为具有 Object 类型的引用,因此它可以指向不同类型的对象而不仅仅是字符串。因此,如果您想避免代码中的编译错误,您只能将其用作对象。
如果你知道它是一个字符串(你指向的实例是字符串类型),你可以将它转换为一个字符串,这样就没问题了。在上面的例子中你可以这样做:
String aStringString = (String) aStringObject;
但是如果那个对象不是你刚刚声明的东西,你不能确定你能做到这一点,而且根据它的声明,它可以是一个字符串,但也不能是一个。
你的情况:
A objectX = new B();
objectX 是类型 B 的实例,但引用(指针)是用类型 A 声明的,因此您可以安全地(无需强制转换)将其用作类型 A 对象,并且它将起作用,因为类型 B 的所有对象都是也是 A :) 你可以做 ((B)objectX).bMethod() 因为你知道它实际上是 B 但它不安全因为它可以是这样声明的 A。
A objectX = new B();
这里的objectX是Class A(parent class)的引用,它可以持有class A或class B(child class).
和 = 的右侧,即 new B(),是 B class(child class) 的对象。
永远记住 java 对象是使用 new 关键字创建的。所以左侧部分是参考,右侧部分是对象。
当你这样调用方法时
objectX.someMethod()
在这种情况下,第一个编译器检查方法存在于参考 class(A class) 或 not.if 不存在然后显示错误。
如果找到方法,那么方法将从子 class(B class) 调用。因为方法绑定是在运行时完成的。