- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码:
class Base{}
class Agg extends Base{
public String getFields(){
String name="Agg";
return name;
}
}
public class Avf{
public static void main(String args[]){
Base a=new Agg();
//please take a look here
System.out.println(((Agg)a).getFields()); // why a needs cast to Agg?
}
}
我的问题是:为什么我们不能将 ((Agg)a).getFields()
替换为 a.getFields()
?为什么我们需要在 a
上进行类型转换?我提到 getFields()
没有在类 Base
中定义,因此类 Agg
不从其基类扩展此方法。但是,如果我在类 Base
中定义方法 getFields()
,喜欢:
class Base{
public String getFields(){
String name="This is from base getFields()";
return name;
}
}
一切都会好起来的。然后 ((Agg)a).getFields() 等同于 a.getFields()
在代码中
Base a=new Agg();
这行是否意味着a
有Agg()
的引用并且a 可以直接调用类Agg
的方法。但是,如果我没有在 Base
类中定义方法 getFields()
为什么会有区别?任何人都可以向我解释一下吗?
最佳答案
System.out.println(((Agg)a).getFields()); // why a needs cast to Agg?
因为 Base
没有名为 getFields
的方法.
声明
Base a;
...告诉编译器您将在使用 a
时使用的接口(interface).然后分配 new Agg();
并不重要接口(interface) 你必须a
还是Base
.自 Base
没有 getFields
, 尝试使用 getFields
是编译错误。
Base a=new Agg();
Does this line means
a
has the reference ofAgg()
and a can invoke directly the method of classAgg
.
意思是a
包含对 Agg
的引用对象,但该对象的接口(interface)由 Base
定义, 不是 Agg
, 所以你不能调用 Agg
如果它们不是由 Base
定义的,则在其上使用方法(没有石膏,石膏是危险的,应尽可能避免)。
如果您的代码需要访问 Agg
定义的方法或字段,那么变量(或参数,在我的例子中)应该声明为 Agg a
, 不是 Base a
.
这是一般 OOP 的基础知识,尤其是 Java 中的 OOP 实现:对象的接口(interface)与对象的实现之间存在很大差异目的。在您的示例中,您知道 Base a
真的是一个Agg
,但考虑一下:
void foo(Base a) {
// Use `a` here...
}
// A long time later in a class far, far away...
xyz.foo(new Agg());
很明显,编译器不允许您在 a
上使用方法或字段Base
未定义的.这与您的代码中的情况相同,只是不那么明显。
关于java - Java 面试后的反射(reflection) : Inheritance and polymorphism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199923/
“多态”一词从何而来? 最佳答案 它来自希腊词根“poly”(许多)和“morphe”(形式)。多态对象可以采用多种形式(它可以由指向其任何祖先类的指针表示)。多态函数也可以有多种形式(它可以对实际上
我有一个名为 Frame 的基本结构这对一堆计算很有用:。 pub struct Frame { grid_val: Vec, grid_space: Vec, calcula
我有一个名为 Frame 的基本结构这对一堆计算很有用:。 pub struct Frame { grid_val: Vec, grid_space: Vec, calcula
“多态与方法重载或方法覆盖不同。......两者都不是......本身就是多态的实现”。 这是引自 wikipedia 然而,在“面向对象编程”一书中,Timothy Budd 指出有“四种不同形式的
我有一组我没有编写的类,它们是只读的。例如,假设这些类是以下类: public class Base { } public class B : Base { } public class C : B
什么是 Smalltalk 中的“无限动态多态性”?有人可以举个例子吗? 在这个 book 中提到了它:C++ 模板:完整指南,p. 238. 最佳答案 See在 C++ 中:通过继承实现的多态性是有
我在 Laravel 4 中有一个多态关系,它像我想要的那样工作。我有另一个,当我尝试插入相关模型时它不起作用,即使它与第一个相同并且我以相同的方式使用它。 我有 Event模型和 Article模型
我试图弄清楚如何在 Hack 中实现访客模式。它显然需要函数重载多态性,但正如我所测试的,这个例子: visitInt($m); } else if (is_string($m)) {
两者有什么区别? 具有 myMethod(int a) 的父类(super class)以及具有相同方法的继承类, 这是覆盖还是多态? 我很清楚黑白覆盖和重载的区别,但多态性和覆盖似乎是一样的。还是他
来自 Programming Languages: Principles and Paradigms, byMaurizio Gabbrielli, Simone Martini Definition
给定这段代码 locale A = fixes foo :: "'a" locale B = A + fixes bar :: "'a × 'a" locale C' = A + fixe
榆树市可能存在以下情况? func : a -> {a | id : Int} func x = { x | id = 123 } 由于a的多态性太强,因此无法编译。它认为可以是任何东西,包括非记录类
我只想有一个在 Hashtbls 上通用的简单函数,所以我写了这个: let iter_htbl (type a) (module H : Hashtbl.S with type key = a) h
我了解Polymorphic 和Metamorphic 代码的概念,但是最近我同时阅读了两者的Wikipedia页面(出于某种原因,我以前没有这样做过!)。现在,我真的很想为自己编写一些变形代码。 我
多态性是过载的另一个术语吗? 最佳答案 没有;重载是创建一个具有相同名称,带有不同数量参数或具有另一种类型参数的方法。 多态性是指在各种类型(都具有相同的“基本类型”)中更改特定方法的实现/功能。 重
我试图在 OCaml 中表示一组语法的产生式,存在类型对于建模语法规则的语义 Action 非常有用。我一直在研究 Menhir 源代码,存在类型也用于建模语义 Action 。考虑以下因素: typ
我在SML的学习上取得了一些进步,试图巩固我对一些最基本概念的理解。下面的练习证明还有很多东西要学。 我被要求实现一个名为 add 的函数,它接收两个数字并返回它们的总和。问题是,add 应该接收整数
首先,请看这些 Java 代码: Drawable.java package examples.simple.model; public interface Drawable { public
考虑以下代码: trait Animal { fn make_sound(&self) -> String; } struct Cat; impl Animal for Cat { f
考虑以下代码: trait Animal { fn make_sound(&self) -> String; } struct Cat; impl Animal for Cat { f
我是一名优秀的程序员,十分优秀!