• 数组继承的意义


    1 简述JVM垃圾回收机制

    参考答案

    垃圾回收机制是Java提供的自动释放内存空间的机制。

    垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程,用于回收没有被引用的对象。

    2 Java程序是否会出现内存泄露

    参考答案

    会出现内存泄漏。

    一般来说内存泄漏有两种情况。一是在堆中分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉;另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。

    下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个List中,如果我们仅仅释放引用本身,那么List仍然引用该对象,所以这个对象对GC来说是不可回收的。代码如下所示:

     
    1.     List list=new ArrayList(10);
    2.     for (int i=1;i<100; i++)
    3.     {
    4.         Object o=new Object();
    5.         list.add(o);
    6.         o=null;    
    7.     }

    此时,所有的Object对象都没有被释放,因为变量list引用这些对象。

    3 JVM如何管理内存,分成几个部分?分别有什么用途?说出下面代码的内存实现原理:

     
    1. Foo foo = new Foo();
    2. foo.f();

    参考答案

    JVM内存分为“堆”、“栈”和“方法区”三个区域,分别用于存储不同的数据。

    堆内存用于存储使用new关键字所创建的对象;栈内存用于存储程序运行时在方法中声明的所有的局部变量;方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。

    1. Foo foo = new Foo();
    2. foo.f();

    以上代码的内存实现原理为:

    1.Foo类首先被装载到JVM的方法区,其中包括类的信息,包括方法和构造等。

    2.在栈内存中分配引用变量foo。

    3.在堆内存中按照Foo类型信息分配实例变量内存空间;然后,将栈中引用foo指向foo对象堆内存的首地址。

    4.使用引用foo调用方法,根据foo引用的类型Foo调用f方法。

    4 指出下面代码的编译错误,并说明原因

     
    1. //哺乳动物
    2. public class Mammals {
    3. }
    4. //鸟类
    5. public class Birds {
    6. }
    7. //蝙蝠
    8. public class Bat extends Mammals,Birds{
    9. }

    参考答案

    以上代码在代码行“public class Bat extends Mammals,Birds{”出现编译错误,在Java中,一个类最多有一个直接父类。在上述代码中的Bat类,有两个直接父类Mammals和Birds,因此,此处出现编译错误。

    5 说出下面代码的输出结果,并解释原因

     
    1. public class Sub extends Base {
    2.     String color;
    3.     public Sub(double size, String name, String color) {
    4.         super(size, name);
    5.         this.color = color;
    6.     }
    7.     public static void main(String[] args) {
    8.         Sub s = new Sub(5.6, "测试对象", "红色");
    9.         System.out.println(s.size + "--" + s.name + "--" + s.color);
    10.     }
    11. }
    12. class Base {
    13.     double size;
    14.     String name;
    15.     public Base(double size, String name) {
    16.         this.size = size;
    17.         this.name = name;
    18.     }
    19. }

    参考答案

    上述代码的输出结果为:

     
    1. 5.6--测试对象--红色

    当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行。子类构造器调用父类构造器分如下几种情况。

    A,子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器。

    B,子类构造器执行的第一行代码使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表调用本类中的另一个构造器。执行本类中另一个构造器时即会调用父类构造器。

    C,子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

    本题属于上述中的第一种情况。在子类构造方法中使用代码super(size, name);调用父类构造方法,将属性size和name进行初始化,然后,再执行子类构造方法中的代码,对属性color进行初始化。因此,三个成员变量都被初始化成功,当输出三个成员变量时,结果即为传入的实参。

  • 相关阅读:
    一个强悍的强制删除文件的批处理
    禁止用户使用QQ聊天工具
    《项目经理指导手册》附录2项目经理面试题
    《项目经理指导手册》 附录1每日站会评价表
    《项目经理指导手册》调研篇
    《项目经理指导手册》前言
    《项目经理指导手册》 会议篇
    从Log4j2今天的漏洞说起.
    Asp.Net将Excel数据导入Sql Server数据库的的例子
    Winform窗体程序输入法全角问题
  • 原文地址:https://www.cnblogs.com/xyk1987/p/8329827.html
Copyright © 2020-2023  润新知