有2个类A
和B
,B
扩展了A
。两者有什么区别
A a = new B();
和
B b = new B()?
两者都创建B类的对象。有什么区别?
最佳答案
你是对的,在这两种情况下都会创建类 B
的对象。两个声明之间的区别在于变量的类型。
记住变量和对象之间的区别非常重要。例如,以下代码定义了 3 个变量,但仅定义了 2 个对象:
Circle c1 = new Circle(5);
Circle c2 = c1;
Circle c3 = new Circle(5);
当你说
Shape s = new Circle(5);
而不是
Circle s = new Circle(5);
假设Circle
扩展了Shape
,那么,即使在这两种情况下您确实创建了一个圆对象,在前一种情况下您只能调用圆上的形状方法(通过变量s
),而在第二种情况下,您可以使用所有循环方法(因为您将通过循环变量c
调用它们)。像 s.getArea()
这样的调用在两种情况下都可以工作,但是像 s.getRadius()
这样的调用只会在第二种情况下被允许(除非你使用一个丑陋的)类型转换)。
那么为什么我们经常会做第一种情况这样的事情呢?也就是说,为什么我们经常定义比必要的更通用的类型的变量?通常我们这样做是因为我们想要限制接口(interface)以确保安全。也许我们只关心形状,但在这种情况下,特定的形状恰好是一个圆形。如果您关心圆的特定属性,那么我们会使用圆变量。但我们应该努力尽可能笼统。通过对最通用的接口(interface)进行编码,我们的代码无需修改即可处理圆形以外的形状。
当然,要真正理解这一点,您必须亲 body 验,但希望这个解释是一个开始。我确信有许多书籍、博客文章和文章通过有用的现实生活轶事更详细地解释了这一点。
关于java - 什么时候应该或不应该使用更通用的变量类型来引用我的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7036210/