• SCJP_104——题目分析(1)


    1.
    1) public class ReturnIt{
    2) returnType methodA(byte x, double y){
    3) return (short)x/y*2;
    4) }
    5) }
    what is valid returnType for methodA in line 2?

    这一题考的是Java中的类型转换

    在这里,自需要看第(3)据代码就行了。分析以下这一行代码

    (short)x / y * 2

    这一行代码对 x 进行类型转换,将 byte 类型的 x 转换成 short 类型,进行了类型提升。

    y 是 double 类型,2 是字面值,在 Java 中整型的字面值默认为 int 类型,所以这里的 2 为 int 类型。

    这一行代码中,double 类型是最高的数据类型,根据类型自动提升原则,上面的这一行代码的返回值类型为 double。

    所以正确答案为:double


    2.
    1) class Super{
    2) public float getNum(){return 3.0f;}
    3) }
    4)
    5) public class Sub extends Super{
    6)
    7) }
    which method, placed at line 6, will cause a compiler error?
    A. public float getNum(){return 4.0f;}
    B. public void getNum(){}
    C. public void getNum(double d){}
    D. public double getNum(float d){return 4.0d;}

    这一题考的是Java中的方法重载(overload)方法重写(override)的区别。

    所谓方法重载

      1、方法名相同

      2、参数列表不同。(包括参数个数不同、参数类型不同、参数顺序不同)

      但是,注意:方法重载与方法返回值类型无关,只要满足了1和2两个条件,就是方法重载。而且,访问控制符也不会影响方法重载。

    所谓方法重写

      1、方法名相同

      2、参数列表相同

      3、方法返回值相同

      方法体可以一样,也可以不一样。比如:

    class Super
    {
        public float getNum()
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        @Override
        public float getNum()
        {
            return 3.0f;
        }
    }

      但是,注意

      1、子类重写父类的方法,那么子类方法的访问控制符的权限范围只能比父类的大或者平级,不能比父类方法的访问权限小。

      2、父类的私有方法不能被子类覆盖,比如

    class Super
    {
        private float getNum()
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        private float getNum()    // 这样不算是方法重写
        {
            return 3.0f;
        }
    }

      3、子类重写方法抛出的异常,不能比父类抛出的异常要多,也就是说子类重写方法抛出的异常的范围不能大于父类的方法,但是可以是同级别的。

    class Super
    {
        public float getNum() throws IOException, FileNotFoundException  
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        @Override
        public float getNum() throws IOException, UnknownHostException    // 这样写是可以的
        {
            ServerSocket socket = new ServerSocket(1234);
            return 0;
        }
    }
    class Super
    {
        public float getNum() throws IOException, FileNotFoundException  
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        @Override
        public float getNum() throws IOException, Exception    // 这样写是错误的
        {
            ServerSocket socket = new ServerSocket(1234);
            return 0;
        }
    }
    class Super
    {
        public float getNum() throws IOException, FileNotFoundException  
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        @Override
        public float getNum() throws Exception    // 这样写也是错误的
        {
            ServerSocket socket = new ServerSocket(1234);
            return 0;
        }
    }

      4、父类的方法不能被子类覆盖为静态方法。也不能父类为静态方法,而子类却没有覆盖为静态方法。自有父类的方法是静态的,而子类覆盖的时候也是静态的,这昂才算是正确的方法重写。

    class Super
    {
        public float getNum()
        {
            return 3.0f;
        }
    }
    
    public class Sub extends Super
    {
        public static float getNum()    // 这是错的
        {
            return 0.0f;
        }
    }

      5、父类的私有(private)方法不能被子类覆盖。这是因为由于 private 关键字决定的,用 private 修饰的属性或者方法,只能被本类访问。

      6、父类的抽象方法可以被子类通过两种途径覆盖(即实现和覆盖)  // TODO 不理解,先放着

      7、父类的非抽象方法可以被覆盖为抽象方法            // TODO 不理解,先放着

    所以正确答案为:C

  • 相关阅读:
    误加all_load引起的程序报错
    ConstraintLayout 约束布局
    前端判断是否APP客户端打开触屏,实现跳转APP原生组件交互之遐想
    TP5 多条件whereOr查询
    json手动解析详解
    Centos python 2.6 升级到 2.7
    js中click重复执行
    使用 Python 实现实用小工具
    使用 Python 编写密码爆破工具
    使用Python进行无线网络攻击
  • 原文地址:https://www.cnblogs.com/owenbeta/p/3702127.html
Copyright © 2020-2023  润新知