zoukankan      html  css  js  c++  java
  • scjp考试准备

    题一,如下代码的执行结果:

    class Person{ 
        String name = "No name"; 
        public Person(String nm){name = nm;} 
    } 
    
    class Employee extends Person{ 
        String empID = "0000"; 
        public Employee(String id){empID = id;} 
    } 
    
    class EmployeeTest{ 
        public static void main(String[] args){ 
            Employee e = new Employee("4321"); 
            System.out.println(e.empID); 
        } 
    }

    题二,如下代码的执行结果:

    class Atom{ 
        Atom(){System.out.print("atom ");} 
    } 
    class Rock extends Atom{ 
        Rock(String type){System.out.print(type);} 
    } 
    public class Mountain extends Rock{ 
        Mountain(){ 
            super("granite "); 
            new Rock("granite "); 
        } 
        public static void main(String[] a){new Mountain();} 
    }

    题三,对如下代码执行哪些调整,可以使Sub类正常执行:

    1.  class Super{ 
    2.   private int a; 
    3.   protected Super(int a){this.a = a;} 
    4.  } 
    ...  
    11.  class Sub extends Super{ 
    12.   public Sub(int a){super(a);} 
    13.   public Sub(){this.a = 5;} 
    14.  }

    调整选项:

    A.  Change line 2 to: 
         public int a; 
    B.  Change line 2 to: 
         protected int a; 
    C.  Change line 13 to: 
         public Sub(){this(5);} 
    D.  Change line 13 to: 
         public Sub(){super(5);} 
    E.  Change line 13 to: 
         public Sub(){super(a);}

    这两道题考察的重点是类的继承,考点是父类构造器的调用。

    关于父类构造器的调用需要注意以下几点:

    1. 子类不会获得父类的构造器;
    2. 在一个构造器中调用另一个重载的构造器可以使用this调用,在子类构造器中调用父类构造器可以使用super调用;
    3. 使用super调用父类构造器必须出现在子类构造器执行体的第一行;
    4. 不管是否使用super调用父类构造器,子类构造器总会调用父类构造器,调用形式有如下三种:
      • 子类构造器使用super显式调用父类构造器;
      • 子类构造器使用this调用重载的构造器,重载的构造器调用父类构造器;
      • 若子类构造器执行体中没有super调用,也没有this调用,系统将会在执行子类构造器前隐式调用父类的无参数构造器。
    5. 当调用子类构造器初始化子类对象时,父类构造器总会在子类构造器前执行。以此向上类推,创建任何java对象,最先执行的总是Object类的构造器;
    6. 如果没有为一个类提供自定义构造器,系统会默认为这个类提供一个无参数构造器;反之,若已经为这个类提供了自定义构造器,系统将不会为这个类提供隐式无参构造器。

    题目分析:题一中Person类没有无参数构造器,子类Employee的构造器中也没有使用super调用Person类中已定义的构造器,那么子类将无法找到无参数的Person类构造器,无法编译。

    附上题一编译结果:

    image

    根据以上的第五条可以推断出题二的执行结果。

    题二执行结果:

    image

    对于题三,先分析所给的代码,着重关注Sub类的第二个构造器,这个构造器需要隐式调用父类的无参构造器。父类没有提供无参构造器。因此需要为父类Super添加一个无参构造器,或调整Sub类的第二个构造器,使之调用Super类的有参数的构造器。答案中CD正确,E中调用的父类成员变量a的作用域错误。

  • 相关阅读:
    构建之法阅读笔记2
    2020.2.10
    2020.2.9
    2020.2.8
    2020.2.7
    2020.2.6
    2020.2.5
    学习进度——第十三周
    PHPStorm+XAMPP开发php项目
    第一阶段成果建议
  • 原文地址:https://www.cnblogs.com/amunote/p/3810273.html
Copyright © 2011-2022 走看看