zoukankan      html  css  js  c++  java
  • java基础 -继承-练习集锦

    1.下面这段代码的输出结果是什么?

    ublic class Test {
        public static void main(String[] args)  {
            new Circle();
        }
    }
     
    class Draw {
         
        public Draw(String type) {
            System.out.println(type+" draw constructor");
        }
    }
     
    class Shape {
        private Draw draw = new Draw("shape");
         
        public Shape(){
            System.out.println("shape constructor");
        }
    }
     
    class Circle extends Shape {
        private Draw draw = new Draw("circle");
        public Circle() {
            System.out.println("circle constructor");
        }
    }
    

    这道题目主要考察的是类继承时构造器的调用顺序和初始化顺序。要记住一点:父类的构造器调用以及初始化过程一定在子类的前面。由于Circle类的父类是Shape类,所以Shape类先进行初始化,然后再执行Shape类的构造器。接着才是对子类Circle进行初始化,最后执行Circle的构造器。

    2.下面这段代码的输出结果是什么?

    public class Test {
        public static void main(String[] args)  {
            Shape shape = new Circle();
            System.out.println(shape.name);
            shape.printType();
            shape.printName();
        }
    }
     
    class Shape {
        public String name = "shape";
         
        public Shape(){
            System.out.println("shape constructor");
        }
         
        public void printType() {
            System.out.println("this is shape");
        }
         
        public static void printName() {
            System.out.println("shape");
        }
    }
     
    class Circle extends Shape {
        public String name = "circle";
         
        public Circle() {
            System.out.println("circle constructor");
        }
         
        public void printType() {
            System.out.println("this is circle");
        }
         
        public static void printName() {
            System.out.println("circle");
        }
    }
    

    这道题主要考察了隐藏和覆盖的区别

    覆盖只针对非静态方法(终态方法不能被继承,所以就存在覆盖一说了),而隐藏是针对成员变量和静态方法的。这2者之间的区别是:覆盖受RTTI(Runtime type identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。

    总结

    父类的构造器调用以及初始化过程一定在子类的前面
    初始化顺序 也是按照 ; 先对象成员初始化 --->普通对象代码块初始化 -->构造方法初始化

  • 相关阅读:
    无法将类型“XXX”隐式转换为“XXX[]”(Cannot implicitly convert type 'XXX' to 'XXX[]')
    VS2010验证时出错。HRESULT = '8000000A'
    Linux Command Tips
    RealVNC 使用手册
    PL/SQL Developer自动补全SQL技巧
    Install dnsutils(dig, nslookup, host) On iPhone
    asp.net压缩图片
    Discuz论坛密码加密方式详解
    三种SQL分页法效率分析
    Mysql数据库服务器配置文件/etc/my.cnf的详细配置
  • 原文地址:https://www.cnblogs.com/czy16/p/8947792.html
Copyright © 2011-2022 走看看