第一题如下:
1. public class SimpleCalc {
2. public int value;
3. public void calculate() { value += 7; }
4. }
And:
1. public class MultiCalc extends SimpleCalc {
2. public void calculate() { value -= 3; }
3. public void calculate(int multiplier) {
4. calculate();
5. super.calculate();
6. value *=multiplier;
7. }
8. public static void main(String[] args) {
9. MultiCalc calculator = new MultiCalc();
10. calculator.calculate(2);
11. System.out.println("Value is: "+ calculator.value);
12. }
13. }
What is the result?
A. Value is: 8
B. Compilation fails.
C. Value is: 12
D. Value is: -12
E. The code runs with no output.
F. An exception is thrown at runtime.
可以告诉大家这题答案是A,但是我有个问题很疑惑.父类和子类都应该有values这个属性对吧?
但是为什么调用这句话super.calculate();后改变的是子类中的value属性值,而不是父类的?
第二题如下:
1. public class Blip {
2. protected int blipvert(int x) { return 0; }
3. }
4. class Vert extends Blip {
5. // insert code here
6. }
Which five methods, inserted independently at line 5, will compile?
(Choose five.)
A. public int blipvert(int x) { return 0; }
B. private int blipvert(int x) { return 0; }
C. private int blipvert(long x) { return 0; }
D. protected long blipvert(int x) { return 0; }
E. protected int blipvert(long x) { return 0; }
F. protected long blipvert(long x) { return 0; }
G. protected long blipvert(int x, int y) { return 0; }这道题还是大家先给个答案吧,我看看,如果作对了才有可能给我讲对是吧!请大家先给出答案,然后给出解释原因,都正确的一定会给分!
高手可以详细讲下子类中覆盖父类方法时的要求有哪些?

解决方案 »

  1.   

    第一题:
    首先:value = 0
    执行:calculate(2)
       1. calculate();       value = -3
       2. super.calculate();  value = 4
       3. value *=multiplier;  value = 8
    父类中的value是public的,子类使用的value和父类的其实是一个值
    如果父类中声明private int value
    子类中再声明public int value
    那结果才会出你说的那种问题
      

  2.   

    第二题:
    A. public int blipvert(int x) { return 0; }  //改变了返回值类型
    B. private int blipvert(int x) { return 0; } //缩小访问范围
      

  3.   

    1、
    value没有给显示给初值,默认为0
    calculate(2)的时候先执行calculate()
    此时调用的子类中的calculate(),执行完后value的值为-3
    然后执行super.calculate()执行父类中的calculate方法,value的值为4
    然后value*multiplier,最好value的值就是8了
    子类中的value继承父类来的,所以是一样的一份
    2、
    A正确,构成了重写(Override)
    B错误,价低了访问权限
    C正确,构成重载(Overload)
    D错误,返回类型long与int没有supertype与subtype之间的关系
    E正确,构成重载(Overload)
    F正确,构成重载(Overload)
    G正确,构成重载(Overload)
    关于Overload与Override,可以看看这里:
    http://blog.csdn.net/dreamhunter_lan/archive/2009/03/06/3962218.aspx
      

  4.   


    那我想再请教个问题,你说这种情况下父类和子类的value是同一个值!那么我现在有n个类都继承了这个父类,那这N个子类的value都和父类的一样?
      

  5.   

    重写的话:
    1.方法名相同
    2.参数必须相同,不管参数是否有继承关系
    比如父类public void a(Object a)
    子类public void a(String a)
    这样都不算
    3.在参数和方法名都相同的情况下,
    如果返回值有继承关系,可以改变
    比如父类public Object a()
    子类public String a()
    这个算,倒过来不行
    4.访问范围只能不变或扩大,不能缩小
    暂时能想到的就这几点哈
      

  6.   

    第一个题目就是因为二者同时拥有一个变量
    第二个分清楚overload和override的区别就好
    overload不看返回值,访问修饰符和异常,只看名称和参数列表
    override要注意:
    1.返回值一样,但是类型兼容也可以
    2.异常不成超过父类的异常层次,当然允许父类有异常而子类没有异常,一旦有,就要遵循那个规则
    3.访问权限不能降低
      

  7.   

    A 正确
    覆盖(override): 三同一不低:方法名称,参数列表,返回值类型相同;子类的函数访问权限不能比父类低。区分下重载(overload): 对于类的方法,方法名相同,参数列表不同的方法之间就构成了重载关系。
      

  8.   


    第一题一楼正解,你声明为public和protected都应该只有一份value,除非你在子类中声明了同名的field,此时结果就不一样了第二题
    答案应该是ACEFG
    A:override
    B:不能降低权限(protected->private)
    C:overload
    D:返回类型不一样,签名一样,既不满足override,因为long、int不存在父子关系(JAVA SE5添加了协变返回类型,指的是子类override的函数可以返回父类函数返回值的子类),也不满足overload(因为只有返回类型不一样)
    E、F、G都是overload
      

  9.   


    怎么就算是重载了?是修饰符改变就算重载还是参数改变就算重载,只改变参数的类型也算重载?修饰符改变应该不能算是重载重载需要的是函数参数列表不一样,不包括返回类型改变参数的类型当然算重载
    不仅如此,只改变参数的顺序也可以构成重载,只是不推荐这么做
    例如protected long blipvert(int x, long y)

    protected long blipvert(long x, int y)这也是重载,不妨试试
      

  10.   

    请问F,G的返回类型不也是long吗?
      

  11.   

    两道题目的答案都是A。第一道,value值只有一个而不是两个,说以是A。第二道,如果题目的考点是重写的话就是A,因为重写一个方法最不容易出错就是把要重写的方法的签名COPY下来然后重写方法的实现就OK!如果要改权限修饰符的话,就不能改得比父类更严格,如父类是PROTECTED的话,子类只能是PROTECTED或PUBLIC,绝对不能是PRIVATE或不写.
      

  12.   

    给大家推荐一个校内网刷人气工具
    使用校内的朋友,你知道为什么有的人人气那么多吗?几万几十万甚至百万千万的,而你的只有几百?其实很简单,使用刷人气的软件刷的!在此为大家推荐一个刷人气软件,这个软件很早就有了,并且是第一个使用软件自动互刷进行刷人气的,所以想比来说是所有刷人气软件中最安全的,完全模拟真人点击,这就是为什么使用该软件的人从没被查封的原因,如果校内想封这样的软件,只有一条:禁止校内用户相互浏览,呵,我想校内没那么傻,如果真那样的话,校内网网站世界排名绝对马上下降,使用这个软件一天刷个几千一点问题都没有,你要是整天挂着那就更不堪设想了,马上你的人气就会是你朋友的几倍甚至几百倍(一点都不夸张),对于人气嘛其实很多人还是很虚荣的想高点,校内网刷人气,校内网刷人气工具
    就用CSUBOY校内人气之星这个刷校内人气工具吧,这个刷校内人气软件现在一直在更新,是所有校内刷人气工具中更新最快的一个,百度一下“校内人气之星”,看看排第一的是哪个就知道它的影响力了,现在CSUBOY校内人气之星QQ群联盟就有30多个,百度一下“校内人气之星官方论坛”出来的竟然不是校内网的!排第一的就是CSUBOY校内人气之星的论坛,官方网站是http://www.csuboy.com,论坛是http://bbs.csuboy.com(论坛现在指向的是http://csuboy.5d6d.com)下面是它的截图:
    下载地址是http://csuboy.5d6d.com/forum-20-1.html(最新版本就在置顶贴中)
    我用过的,效果不错才给大家推荐的,大家快刷刷看吧,他们一直是免费的,官方也说了一直免费让大家使用,不像有的是要钱的!平均2秒钟让你的校内网人气涨一个,刷校内网人气 刷的很快
      

  13.   

    重载 :* 只能通过参数类型,参数数目,参数顺序进行重载
    * 不能由访问权限,返回类型,抛出的异常来判断
    =============================================
    覆盖 :* 覆盖的方法的标志必须要和被覆盖方法的标志完全匹配,才能达到覆盖的效果
    * 覆盖的返回值必须和被覆盖的方法的返回值一致
    * 覆盖的方法所抛出的异常必须和被覆盖方法所抛出异常一致,或是其子类
    * 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖 什么情况下不能实现覆盖?
    1 子类方法的访问修饰符可见性不能低于父类方法的。
     public void print(int i)
       {
           System.out.println("parent");
       }
      void print(int i)  //这个是编译异常
        {
            System.out.println("children");
        }
    2,参数的类型必须一致,否则只是子类的一个新方法
      public void print(long i)
       {
           System.out.println("parent");
       }
       public  void print(int i)
       {
            System.out.println("children");
        }
       
       Parent p=new Children();
         p.print(4);   //打印 parent3,子类方法抛出的异常需要是父类方法的子类
      

  14.   

    我问下,MultiCalc calculator = new MultiCalc(); 实例化的时候不是执行public void calculate() { value -= 3; } 
    所以第一步value不是等于-3吗?然后在执行public void calculate(int multiplier) { 
    4. calculate(); 
    5. super.calculate(); 
    6. value *=multiplier; 
    7. } 
    里的。
    请高手解释下
      

  15.   

    子类的value根本就没定义,怎么可以默认为 0 呢???!!!题目错误编译不通过