Java 程序的一个简单问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 11:25:52
class A
{
int n;

set_n(int v) {n=v;}
int get_n() {return n;}
};

class B extends A
{
int m;

set_n(int v) {n=v*v;}
int get_n() {return n;}
int get_m() {return m;}
};

public class TestClass
{
static public void main ( String[ ] args )
{
A a1 = new A();
B b1 = new B();
a1.set_n(2);
b1.set_n(2);
// Position 1
}
};

把这些分别放到position one,则:
((A)b1).set_n(3); System.out.println(b1. get_n());
Output:

System.out.println(((A)b1). get_m());
Output:
请问这两步,根据上面的程序为什么会得出9 和compile time error呢?这个((A)b1)是什么意思呢?

楼主是由于多态的概念不清才会遇到困惑~
((A)b1)是对b1变量进行造型~即通过此语句~b1变量的类型变成了其父类的类型,就是常说的变量的多态!
((A)b1).set_n(3); System.out.println(b1. get_n()); 这个结果是9,是由于,对于一个多态变量~它有编译时类型和运行时类型,b1在编译时是A类型,但b1所指向的对象的类型是不会发生改变的~所以运行时~b1所指向的对象会调用类B中的set_n方法。
System.out.println(((A)b1). get_m()); 这个是编译错误~b1在编译时是类A类型的变量~但类A中没有get_m()这个方法,所有不能通过编译。
不知楼主是否理解了!加油!!
虽然这题比较简单,但是一分不给,不像楼主你的风格啊~

因为在((A)b1).set_n(3); 这里你把b1强制转化成了A,但再输出时没有,又因为b是A的子类,所以在b1. get_n()还是会运行一次b中的方法,得结果9

第2个当中,你虽然声明了int型的m,但程序中没有任何地方为其附值,所以想输出m的结果时就会出现问题了

((A)b1).set_n(3);
把B类型向上转型至A类型,然后打算执行A类中的set_n(3),但因A是B的基类,B类中重写了set_n(int v),因而A类中的set_n(int v)被B类中的set_n(int v)覆盖了.所以set_n(3)调用的是set_n(int v) {n=v*v;} 又因为B类中没有重新定义n,所以n也是从A类中继承而来的.即A B类共享n.

((A)b1). get_m()
跟上题一样,把B类型向上转型至A类型,因A类中没有定义get_m(),所以也就无法调用,compile time error