class A{
String str="Hello";
public void t(){
System.out.println("Hello, you son of a bitch.");
}
}class B extends A{
String str="OK";
public void t(){
System.out.println("What's up, you bastard?");
}
}public class Test{
public static void main(String[] args){
A aa=new B();
System.out.println(aa.str);
aa.t();B bb=new B();
System.out.println(bb.str);
bb.t();
}
}What's the result?

解决方案 »

  1.   

    Hello
    What's up, you bastard?
    OK
    What's up, you bastard?
    可怜的揭帖率。。
      

  2.   

    OK
    What's up, you bastard?
    OK
    What's up, you bastard?请赐教!
      

  3.   

    看了上面的2个回复, 焦点就集中在第一次输出的时候到底是 “Hello” 还是 “OK” 这个A aa=new B();  的情况下String str = “Hello” 到底是有没有被重新赋值。我也很想知道请赐教!
      

  4.   

    是不是   如果B中直接用 str = "OK" ,就是我说的结果了?
      

  5.   

    A为B的父类。那么规定A aa=new B(),调用的为父类(A)的属性及方法。
    然而B中重写了A类的t()方法。所以在用aa.t()调用的是B类的t(),这时候的aa.t()相当于:
    B bb = new B();
    bb.t();
    这是关于方法的分析。下面是关于函数的:
    由于B类继承A类,那么B完全可以直接使用str = "OK";这相当于重新为A类中的str赋值。
    然而B并没有这么做,他重新声明了一个变量:String str = "OK";所以在看完答案后,本人认为B重写了A的t方法,但并没有更改A中str的值。不知道这么分析有没有错误。望赐教!
      

  6.   

    就是个继承问题。
    如楼主情况,记着:
    A aa=new B(); 
    System.out.println(aa.str); 
    aa.t(); B bb=new B(); 
    System.out.println(bb.str); 
    bb.t(); 上面调用变量时,一定是aa的,即是不考虑对象实际的类型,只考虑看到的aa.str的aa是什么类型
    方法就是考虑对象的实际类型,实际类型是什么,就调用什么的方法。故题中是子类的方法。
      

  7.   

    Hello
    What's up, you bastard?
    OK
    What's up, you bastard?
     
    1.A aa=new B(); 这句话中的对象aa执有的是A的引用是不完全属于B类的对象。所以输出的应该是A对象的属性。即Hello.但其new的却是B类的对象。所以调用的应该是子类已重写的方法。输出的是What's up, you bastard?2.B bb=new B(); 这句中,bb对象已重新new了一次。那么bb对象是跟aa完全不一样的对象。其执有的是B的引用。new的又是B的构造方法。所以bb是完全属于B类的对象。那么输出的属性与调用的方法都应该是B类的。答案也就出来了。上面的解释1中,涉及到内存中对象的存储方式与结构。详细可参考《JAVA编程思想》中对于JAVA对象在内存中存储章节的详解。
      

  8.   

    Hello
    Hello, you son of a bitch.
    OK
    What's up, you bastard?
    我觉得是这样的输出
      

  9.   

    运行结果:Hello
             What's up, you bastard?
             ok
             What's up, you bastard?
                    
      

  10.   


    bit代表什么?A.字节      B.字      C.二进制位    D.字长
      

  11.   


    三个人去motel,老板说三个人需要$30,所以他们三个人一人交了$10。第二天老板觉得,他们三个人一起,一共交$25就可以了。老板拿了$5给服务生,叫服务生给客人送过去。结果服务生因为那三个人没给小费怀恨在心,只给他们每个人退回$1。那么问题来了,他们第一天总共交了$30,现在变成他们由一人交$10,变为一人交$9,他们一共交了$27,服务生私吞$2,那么那$1哪去了?
      

  12.   

    若父类有一个方法A如下定义:
    public void A(String str){...}
    则在子类中:
    public void A(String str){...}这是重写,方法名,参数列表与父类中的方法一致.

    public void A(int i){}或public void A(String str,String str2..){}
    这些方法名相同而参数列表不同的是重载.
    并且,重写是针对子类方法对父类方法的概念,至少有两个有继承关系的类存在,被重写的方法在父类中.
    重载是指一个类自已内部存在两个或以上的,同名不同参(数列表)的方法,说不清谁重载谁了^_^!我是菜鸟,今天正好看了这方面的知识,回答得不完善的话请多多指教.
      

  13.   

    最容易搞混的是字节吧(byte) 
    正解是C二进制位.
      

  14.   

    Hello
    What's up, you bastard?
    OK
    What's up, you bastard?
      

  15.   

    正确答案为:
    Hello 
    What's up, you bastard? 
    Hello
    What's up, you bastard?原因是 实际操作的B类对象  变量是以父类的为准,方法是以子类的为准.
    调用的是父类的变量(把子类的变量覆盖了)   实际调用的是子类的方法(相同的)。
    要想调用子类的对象 
       可以用类名来约束 bb.B.str ;    
      

  16.   

    OK 
    What's up, you bastard? 
    OK 
    What's up, you bastard? 
    A类的属性和方法都被重写了
      

  17.   

    汗,从来没注意过这个问题想想应该是先输出hello的吧回去试试
      

  18.   

    这个 是最基本的
    JAVA 等面向对象的特性:,封装,继承,多态这里用到了多态  (上面说的覆盖 也是那么一回事 )
    属性不具有多态而方法具有多态 
      

  19.   

    一个类的属性和方法是不一样的~~~子类可以重载父类的方法但是不能重载属性啊~~~~所以aa.str="hello"  aa.t()输出结果为What's up, you bastard? 
      

  20.   

    JAVA

    不存在 引用传递 JAVA 只有 值传递
      

  21.   

    Hello 
    What's up, you bastard? 
    OK 
    What's up, you bastard? java基础啊
      

  22.   

    多看看基础书籍吧, 这样的问题, the java program language 里有明确说明
      

  23.   

    Hello 
    What's up, you bastard? 
    Hello 
    What's up, you bastard? 不用多说