class A 
{
    void f() 
    {
       System.out.println("hello,A");
    }
}class B extends A 
{
    void f() 
   {
   System.out.println("hello,B");
   }
}public class TestA 
{
public static void main(String [] args)
         {
A b = new B();
b.f();
}
}请问1:A b = new B();到底产生的是谁的对象???
请问2:在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?

解决方案 »

  1.   

    1、b是B的实例,如果B有其他的扩展属性或者方法,则b全部拥有,只是可以把b当作A的实例来访问而已;
    2、对两者应该都没有影响
      

  2.   

    请问1:A b = new B();到底产生的是谁的对象???答: 产生的是B类的实例! 只不过引用此实例的对象类型是A的(可行,看看对象类型转换的知识就明白了).
    请问2:在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?答:都没有影响!b.f()执行的是B类的方法.因为override了
     
      

  3.   

    楼主来这里瞧瞧http://community.csdn.net/Expert/topic/4169/4169454.xml?temp=.2743494
      

  4.   

    1产生的是b的对象,这个是向上转型.2给f()加上static b.f()调用的就是A中的f()方法了,因为static方法不能被覆盖!对A b = new B();没影响.
    在java中除了static和final方法外都是后期绑定,所以static 和final方法都不能被覆盖.static方法不能覆盖和被覆盖!
      

  5.   

    其实楼主可以搜索一下,论坛上关于static方法是否能被覆盖的帖子很多 !
      

  6.   

    A b = new B();
    前半部只是A的reference,但具体在后半部指向B的一实例。因此调用的是B的f()方法。
    涉及JAVA的多态问题,有一“向上转型”的效果,即可认为B是一种特殊的A。但调用的是这种特殊A(即B)的方法
      

  7.   

    shxchenwind(秋风扫落叶) 说的就对
      

  8.   

    1.A b = new B();叫做里氏代换,也可叫做上塑造型;
    这就是里氏代换原则:如果对每个类型T1的对象o1,都有类型为T2的对象O2,使得一T1定义的所有程序P在所有对象o1都代换成o2时,程序P的行为没有变化,那么T2为T1的子类型。
    这里的b是一个特殊的对象,即不属于A也不属于B,
    它拥有A类的属性,B类的方法(B继承A);
    如果B中有重构A的方法,则拥有B中重构的方法;
    本例,b实现的是B类中的f()方法;
    2.没影响
      

  9.   

    A b = new B();
    这句话表示用父类的引用指向子类对象,
    这时 b.f();当然是调用的是子类的方法在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?
    没有影响
      

  10.   

    对这一问题我也有疑惑,结果为 hello,B   ,两个方法都加上static后,如果没有什么影响,为什么产生的结果又会不同呢 hello,A,这其间到底发生了什么变化, 望各位指教.
      

  11.   

    class A 
    {
        /*void f() 
        {
           System.out.println("hello,A");
        }*/
    }class B extends A 
    {
        void f() 
       {
       System.out.println("hello,B");
       }
    }public class TestA 
    {
    public static void main(String [] args)
             {
    A b = new B();
    b.f();
    }
    }当我将类A中的void f()方法注释掉后,这个程序编译时提示出错,信息如下:
    C:\TestA.java:22: cannot resolve symbol
    symbol  : method f ()
    location: class A
                    b.f();
                     ^
    1 errorA b = new B();如果生成的是B类的一个对象,b.f()应该会直接调用类B中的void f()方法,不应该报错啊??现在出错了,说明调用的是A类中的方法,可A中的void f()方法被注释,不存在了。所以出错。到底怎么了?
      

  12.   

    因为方法是静态的所以不能被override,两个f()是不同的,b已经向上转型为A  了,所以调用的是A中的方法
      

  13.   

    如果类B是A的子类,那么A b = new B();无论在什么情况下产生的都是B的对象; 否则的话,编译时将出现编译错误.而b.f()到底调用的是哪个f方法,则要视情况而定;
    1. 如果f不是static方法, 那么 这时候要看b到底指向的哪个对象,千万不要认为b是对象,b只不过是一个引用变量,它的作用是指向一个A或者A的子类的对象; b指向了哪个类的对象,那么b就调用这个类的f方法。
    2. 如果f是static方法,这时候则调用A类中的方法,因为static方法是不能override的。关于这点,可以看其他的帖子。而当你把A类中的f方法删除时,出现了编译错误,解释如下:
    因为通过 A b 这句话,可以知道 b 需要指向 A 或者A的子类的对象;也即b是A类型的引用变量;
    而 编译器 在面对 b.f() 这条语句时,当然要先判断A类中到底有没有f这个方法, 如果A中没有则当然会报出编译错误。
      

  14.   

    通俗理解:
    b只是相当于一个interface,具体还是关联B的实现,所以A中需要有“f()”方法去关联。
      

  15.   

    回复人: hthunter(核桃-我的心在下雨,雨中我和她携手漫步) ( ) 信誉:100  2005-07-27 00:12:00  得分: 0  
    1、b是B的实例,如果B有其他的扩展属性或者方法,则b全部拥有,只是可以把b当作A的实例来访问而已;
    2、对两者应该都没有影响WRONG!
      

  16.   

    如果A一个接口
    b是一个A接口的实例。
    它执行的方法。是接口的方法。只不过在B类中实现了接口的方法。同理A是一个类
    b同样是A的一个实例,执行的是在B中重写的方法。不知道这样明白不。
      

  17.   

    A是一个接口并被B实现或是B的父类。实际上的对象是B的对象。你可以通过getName()得到。前面好象还有一个方法,整个的好象是B.toClass().getName()以前学这部分的时候用过,后来就没用过。你可以自己去查一下到底是什么方法。我也记不清了。你的整个代码我没看。联系上下文,也可能我说的不对。仅供参考。