10. public class Foo {
11. public int a;
12. public Foo() { a = 3; }
13. public void addFive() { a += 5; }
14. }
and:
20. public class Bar extends Foo {
21. public int a;
22. public Bar() { a = 8; }
23. public void addFive() { this.a +=5; }
24. }
invoked with:
30. Foo foo = new Bar();
31. foo.addFive();
32. System.out.println( " Value: " + foo.a);
结果是什么?
A. Value: 3
B. Value: 8
C. Value: 13
D. Compilation fails.
E. The code runs with no output.
F. An exception is thrown at runtime.
10 个解决方案
#1
A.....
#2
A,当调用子类构造函数构建子类对象的时候,必然会先调用父类的构造函数,即构建一个父类对象,因此父类的成员(变量和方法)也会被构建。如果存在同名,内存中将会同时存在父类的同名成员和子类的同名成员。由于Java的多态性只针对方法来说的,成员变量不存在多态,因此成员变量只与访问的变量类型有关,而方法的调用遵从多态的规则。
#3
是F ,因为System.out.println( " Value: " + foo.a)这句话中,foo.a 可以看出其最后调用的是类Foo中的public Foo()方法,但是在 Foo foo = new Bar()中定义的是Bar类,所以应该先调用子类中的方法,由于子类中的方法是不能覆盖父类中的构造方法,所以最后在执行的时候抛出异常,即答案是F
#4
la不防看看下面的程序。你就会很明白了:
(1)lz的问题就相当于把父类中的得到属性的方法改为getB().然后再分析就是了,这下你就明白二楼的意思了。
package csdn.demo;
class Fu
{
public int a;
public Fu(){
a=3;
System.out.println("父类的构造方法Fu()");
}
public void addValue(){
System.out.println("父类的构造方法addValue()");
a =a+3;
}
public int getA(){
System.out.println("父类的方法getA()");
return this.a;
}
};
class Zi extends Fu
{
public int a;
public Zi(){
a = 8;
System.out.println("子类的构造方法Zi()");
}
public void addValue(){
this.a=a+5;
System.out.println("子类的构造方法addValue()");
}
public int getA(){
System.out.println("子类的方法getA()");
return this.a;
}
};
public class Csdndemo01
{
public static void main(String[] args)
{
Fu f = new Zi();
f.addValue();
System.out.println("a="+f.getB());
}
}
(1)lz的问题就相当于把父类中的得到属性的方法改为getB().然后再分析就是了,这下你就明白二楼的意思了。
#5
成员变量不多态
#6
2楼4楼正解,解释的挺不错的!好好看看Java中多态吧:答案-A
#7
属性无法多态,比如父亲年龄40(属性),儿子年龄15(属性),父子都有吃水果的方法,父亲有苹果,儿子有桔子,可是儿子不爱吃桔子,父亲把桔子吃了,相当于方法多态,但是父亲的年龄仍然是40岁,变量不多态。
#8
+1
#9
没有 看懂
#10
简单,易理解!
#1
A.....
#2
A,当调用子类构造函数构建子类对象的时候,必然会先调用父类的构造函数,即构建一个父类对象,因此父类的成员(变量和方法)也会被构建。如果存在同名,内存中将会同时存在父类的同名成员和子类的同名成员。由于Java的多态性只针对方法来说的,成员变量不存在多态,因此成员变量只与访问的变量类型有关,而方法的调用遵从多态的规则。
#3
是F ,因为System.out.println( " Value: " + foo.a)这句话中,foo.a 可以看出其最后调用的是类Foo中的public Foo()方法,但是在 Foo foo = new Bar()中定义的是Bar类,所以应该先调用子类中的方法,由于子类中的方法是不能覆盖父类中的构造方法,所以最后在执行的时候抛出异常,即答案是F
#4
la不防看看下面的程序。你就会很明白了:
(1)lz的问题就相当于把父类中的得到属性的方法改为getB().然后再分析就是了,这下你就明白二楼的意思了。
package csdn.demo;
class Fu
{
public int a;
public Fu(){
a=3;
System.out.println("父类的构造方法Fu()");
}
public void addValue(){
System.out.println("父类的构造方法addValue()");
a =a+3;
}
public int getA(){
System.out.println("父类的方法getA()");
return this.a;
}
};
class Zi extends Fu
{
public int a;
public Zi(){
a = 8;
System.out.println("子类的构造方法Zi()");
}
public void addValue(){
this.a=a+5;
System.out.println("子类的构造方法addValue()");
}
public int getA(){
System.out.println("子类的方法getA()");
return this.a;
}
};
public class Csdndemo01
{
public static void main(String[] args)
{
Fu f = new Zi();
f.addValue();
System.out.println("a="+f.getB());
}
}
(1)lz的问题就相当于把父类中的得到属性的方法改为getB().然后再分析就是了,这下你就明白二楼的意思了。
#5
成员变量不多态
#6
2楼4楼正解,解释的挺不错的!好好看看Java中多态吧:答案-A
#7
属性无法多态,比如父亲年龄40(属性),儿子年龄15(属性),父子都有吃水果的方法,父亲有苹果,儿子有桔子,可是儿子不爱吃桔子,父亲把桔子吃了,相当于方法多态,但是父亲的年龄仍然是40岁,变量不多态。
#8
+1
#9
没有 看懂
#10
简单,易理解!