java - 什么时候应该或不应该使用更通用的变量类型来引用我的对象?

标签 java subtype

有2个类ABB扩展了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/

相关文章:

javascript - 在 Typescript 中,Object.prototype 函数可以返回 Sub 类型实例吗?

带参数的 Java 泛型 - 继承

raku - 让perl6调用由subtype(subset)专门化的正确的multi sub

java - 我获得了 listView 中每个项目的 key 并将其保存到 Firebase 我想将该 key 发送到另一个 Activity ,但每次我获得相同的 key

java - 在 jackson 中禁用数字到字符串的自动转换

java - 通过单击和取消单击 libgdx java 渲染多行

java - 过滤具有多个大 vector 的行

java - 通过外部化进行逆向计算

types - 什么是 Isabelle/HOL 亚型?哪些 Isar 命令产生子类型?

inheritance - JPA 多重鉴别器值