这个题为什么??求解释?详细的

时间:2021-12-17 04:47:20
22.Given:
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不防看看下面的程序。你就会很明白了:

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


引用 4 楼 chianfirstli 的回复:
la不防看看下面的程序。你就会很明白了:
Java code

package csdn.demo;
class Fu
{
    public int a;
    public Fu(){
        a=3;
        System.out.println("父类的构造方法Fu()");
    }
    public void addValue(){
        Sy……
+1

#9


没有 看懂 

#10


引用 7 楼 xiaoqiuwyh 的回复:
属性无法多态,比如父亲年龄40(属性),儿子年龄15(属性),父子都有吃水果的方法,父亲有苹果,儿子有桔子,可是儿子不爱吃桔子,父亲把桔子吃了,相当于方法多态,但是父亲的年龄仍然是40岁,变量不多态。


简单,易理解!

#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不防看看下面的程序。你就会很明白了:

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


引用 4 楼 chianfirstli 的回复:
la不防看看下面的程序。你就会很明白了:
Java code

package csdn.demo;
class Fu
{
    public int a;
    public Fu(){
        a=3;
        System.out.println("父类的构造方法Fu()");
    }
    public void addValue(){
        Sy……
+1

#9


没有 看懂 

#10


引用 7 楼 xiaoqiuwyh 的回复:
属性无法多态,比如父亲年龄40(属性),儿子年龄15(属性),父子都有吃水果的方法,父亲有苹果,儿子有桔子,可是儿子不爱吃桔子,父亲把桔子吃了,相当于方法多态,但是父亲的年龄仍然是40岁,变量不多态。


简单,易理解!