Upcasting when making object
假设您有一个
在制作新物体时,是否有任何理由向上投射,方法如下:
1 |
而不是这个:
1 | Circle s = new Circle(); |
这两个说法中的每一个所提出的
您可以认为,您的第一个示例(即
两个例子中的对象都是相同的,第一个选项被认为更好的原因更多的是一种样式。对接口进行编码可以使代码库更容易扩展和修改。
就JVM而言,这两个语句将产生相同的对象。通常情况下,您只计划将对象用于基类或接口。例如,这是常见的:
1 | List<String> list = new ArrayList<String>(); |
虽然通常不是一个好主意,但如果您确定它是一个,您可以将
1 2 3 4 | if (s instanceof Circle) { Circle c = (Circle) s; // handle Circle case } |
为了回答你的问题,这两个物体是完全相同的。两个引用都可以指向同一个对象:
1 2 |
通过对接口进行编码,您可以在对代码影响最小的情况下更改实现类。假设你有这个:
1 2 3 4 5 6 7 8 |
现在您的需求发生了变化,您希望按字母顺序打印名称,即使用hashset而不是treeset。因为您已经对接口进行了编码,并且没有使用任何特定于哈希集类的方法,所以只需更改一行:
1 2 3 4 5 6 7 8 |
接口还允许您使用依赖注入。它允许您使用在编写代码时甚至不存在的类。
http://en.wikipedia.org/wiki/dependency_注入
实例化的对象完全相同。
上抛的后果是:
我同意@whitefang34的说法。
看到这个接口编码了吗?这可能对你有帮助。
不,对象本身没有不同。只有编译器认为他看到的是不同的(例如哪些方法可用)。
这样进行强制转换的一个原因是表示您希望如何处理对象(这样您就可以轻松地插入不同的派生类)。
圆S=新圆();这里的物体是指阶级的十字线。
形状S=新圆();这里的对象引用接口
两者相同。