- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我有一个类 A 和一个类 B(其中 B 扩展 A )并且它们有一个公共(public)实例变量 size 并且从方法调用以下命令时,这些命令之间有什么区别 < B 内的strong>printSize1?
class A {
protected int size;
}
class B extends A {
protected int size=7;
public void printSize1() {
System.out.println(((A)this).size)
System.out.println(super.size);
}
}
我也和这两个人有同样的问题。我有一个类 A 和一个类 B,其中 B 扩展了 A,它们都有一个具有相同名称 printSize 的方法和一个实例变量 size ,并且调用以下命令来自类 B 内的方法 printSize2。
class A {
protected int size;
public void printSize() {
System.out.println("Size=" + size);
}
}
class B extends A {
protected int size=7;
public void printSize2 {
((A) this).printSize();
super.printSize();
}
public void printSize() {
System.out.println ("MSize="+size);
}
}
最佳答案
i have a class A and a Class B where B extends A which they have a common instance variable size
不,他们没有。它们有单独名为 size
的实例变量。 。一个位于与 A 关联的对象部分,另一个位于与 B 关联的对象部分。我们称它们为 A$size
。和B$size
。为了让它们有一个公共(public)实例变量,您需要删除 size
的声明来自B
所以他们都使用 A$size
.
重新声明祖先的非 private
实例变量(字段)始终是一个坏主意,因为它会导致这种困惑。
以下两个输出 0
对于您的示例代码,因为它们都访问 A$size
,您从未为其赋值,因此它具有默认值 0
:
System.out.println(((A)this).size); // 0
System.out.println(super.size); // 0
所以问题是:为什么他们都使用 A$size
而不是B$size
?由于我们用来查找 size
的引用的类型 。在这两种情况下,引用的类型都是 A
,因为 (A)this
的类型是 A
(通过强制转换)和 super
的类型在B
中的方法中也是A
。由于引用的类型是 A
,是A
的size
被使用。
在这种特定情况下,两者之间没有太大区别,但如果您向层次结构添加另一层,就会有区别:
class A {
protected int size = 1;
}
class B extends A {
protected int size = 2;
}
class C extends B {
protected int size = 3;
void printSize() {
System.out.println(((A)this).size); // 1
System.out.println(super.size); // 2
System.out.println(this.size); // 3
}
}
这个故事的寓意:不要重新声明祖先声明的实例变量(除非祖先的版本是 private
)。
请注意,变量与方法的情况不同。实例方法是多态的。实例变量则不然。通过方法,您可以获得与对象的最终类型关联的方法(除非您使用 super
或限定的 super
,因为它们很特殊并且绕过多态性)。
这就是 printSize2
中的第二个示例中发挥作用的内容。 。由于方法是多态的,因此您是否强制转换 this
并不重要。输入 A
在((A)this).printSize()
,你仍然得到 B
的printSize
。但是super.printSize()
很特别,因为super
是特殊的并且绕过多态性,给出 B
访问A
的printSize
.
关于java - 下面的命令中 super 和 this 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42876391/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!