Java中关于垃圾收集和抽象类

标签: Java
12人阅读 评论(0) 收藏 举报
分类:

创建对象会占据内存,如果程序执行流程中已无法再使用某个对象,该对象就只是徒耗内存的垃圾。对于不再有用的对象,JVM有垃圾收集( Garbage Collection,GC)机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。那么,哪些会被JVM认定为垃圾对象?简单地说,执行流程中,无法通过变量参考的对象,就是GC认定的垃圾对象
执行流程具体来说就是线程( Thread)如main()程序进入点开始之后的主线程也就是主流程。事实上,关于垃圾收集本身就很复杂,不同的需求也会有不同垃圾收集算法,只需要知道基本概念即可,细节就交给JVM处理。
假设有一个类:

public class Some{
    Some next;
}

若是从程序进入点开始,有段程序代码如下撰写:

Some some1=new Some();
Some some2=new Some();
Some some1=some2;

执行到第二行时,主线程可以通过参考名称所参考到的对象。执行到第三行时,是将some2参考的对象给some1参考。原先some1参考的对象不再被任何名称参考,通过主线程也不再能参考到该对象,这个对象就是内存中的垃圾了,GC会自动出这些垃圾并予以回收
GC的基本概念就是这样,但可以加以变化。如果有段程序是这样:

Some some =new Some();
some.next =new Some();
some=null;

此时还没有对象是垃圾。由于从主流程开始,可以通过some参考至中间的对象,而some.next可以参考至最后边的对象,目前没有必要回收任何对象。执行成第三行后。由于从主流程开始,无法通过some参考至中间对象,也就无法再通过中间对象的next参考至后边对象,所以两个对象都是垃圾。同样的道理,下面程序代码中,somes参考至null,数组参考到的对象全部都会被回收。

Some[] somes={new Some(),new Some(),new Some()};
somes=null

回收的对象包括了数组对象本身,以及三个索引所参考的三个对象。如果是形同孤岛的对象,例如

 Some some = new Some();
 some.next=new Some ();
 some.next.nextnew Some();
 some.next.next.next=some;
 some=null:

执行到第五行这个时候形成孤岛的三个对象,将全部被GC给处理掉。—->GC在进行回收对象前,会调用对象的 finalize()方法,这是 object上就定义的方法。如果在对象被回收前,有些事情想做,可以重新定义 finalize()方法,不过要注意的是何时启动GC,要视所采用的GC算法而定,也就是 finalize()被调用的时机是无法确定的。在 Effective Java书中也建议,避免使用 finalize()方法。
再看抽象类
撰写程序常有些看似不合理但又非得完成的需求。举个例子来说,现在开发一个猜数字游戏,会随机产生0-9的数字,用输入的数字与随机产生的数字相比,如果相同就显示“猜中了”,如果不同就继续让用户输入数字,直到猜中为止。

package hello;

import java.util.*;

public class GuessNum {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int num=(int) (Math.random()*10);
        int guess;
        do {
            System.out.println("输入数字:");
            guess=scan.nextInt();
        }while(guess==num);
        System.out.println("bingo");
    }
}

以上面的例子来说,取得用户输入、显示结果的环境未定,你就无法用上面的程序完成工作。在团队合作、多个部门开发程序时,有许多时候,你不能只是等另一个部门将程序操作出来,有些需求无法决定,却要撰写出程序。
有些不合理的需求,本身确实不合理,但看似不合理的需求,其实可以通过设计 Design()来解决。就像你负责的这部分还是可以先操作。例如:

public void go() {
        int num=(int) (Math.random()*10);
        int guess;
        do {
            System.out.println("输入数字:");
            guess=nextInt();
        }while(guess==num);
        println("bingo");
    }
    public void println(String text) {
        print(text+"\n");
    }
    public abstract int nextInt();
    public abstract void print(String text);

这个类的定义不完整, print()、 printn()与 nextint()都是抽象方法,因为还没决定在哪个环境执行猜数字游戏,所以如何显示输出、取得用户输入(System.out.println、Scanner scan=new Scanner(System.in);)就不能操作。可以先操作的是猜数字的流程,虽然是抽象方法,但在go()方法中,还是可以调用。如果终于还是在文本模式下执行猜数字游戏,你就再撰写 ConsoleGame类,继承抽象类 GuessGame,操作当中的抽象方法即可:

public class ConsoleGame extends GuessGame{
    private Scanner scan=new Scanner(System.in);
    @Override
    public void println(String text) {
        System.out.println(text);
    }

    @Override
    public void print(String text) {
        System.out.println(text);
    }

    @Override
    public int nextInt() {
        return scan.nextInt();
    }
}

之后只要创建ConsoleGame实例,执行go()方法就可以了

ConsoleGame game=new ConsoleGame();
game.go();
查看评论

什么是垃圾收集

【考题题干】关于垃圾收集的哪些叙述是对的? A.垃圾收集将检查并释放不再使用的内存。 B.垃圾收集允许程序开发者明确指定并立即释放该内存。 C.程序开发者必须自己创建一个线程进行内存释放的工作。...
  • sanqima
  • sanqima
  • 2014-05-12 15:58:15
  • 2031

关于抽象类和接口的易错概念选择题(JAVA基础)

1.以下方法错误的是(A D) A 覆盖方法包括成员方法的覆盖和成员变量的覆盖 B 成员方法的覆盖是多态的一种表现形式 C 子类可以调用父类中被覆盖的方法 D 任何方法都可以被覆盖 分析:在...
  • hetao_780160455
  • hetao_780160455
  • 2017-03-28 15:11:17
  • 1191

java知识点总结:接口和抽象类

1、接口 位于抽象层次的最顶层,代表具有某种特性的类型; 类似于一种协议,属性和方法都是公开的,接口中生命的属性默认final static 和 方法 public abstract 面向接口编...
  • StivenGang
  • StivenGang
  • 2015-03-26 22:12:45
  • 465

Java中垃圾收集的方法

标记—清除:这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题:1.效率不高,标记和清除的效率都很低;2.会产生大量...
  • polisa
  • polisa
  • 2017-10-27 22:27:48
  • 62

详细解析Java中抽象类和接口的区别

  • 2009年03月22日 13:54
  • 9KB
  • 下载

java-面向对象编程-抽象类

我们在上一章中介绍了什么是接口,也说到了接口就是一组抽象的数据模型,可以理解为一组协议。但实际上,在面向对象的概念中,有一个知识点是极容易被人与接口混淆的,人们往往会误解为这两者是同一个概念。但不幸的...
  • dengminghli
  • dengminghli
  • 2017-04-04 15:12:40
  • 985

JAVA中接口和抽象类的区别?

原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实...
  • u010355144
  • u010355144
  • 2015-04-08 18:04:19
  • 751

java垃圾收集方法

Java内存区域中,其中程序计数器、虚拟机栈、本地方法栈s
  • guo_net
  • guo_net
  • 2014-09-10 15:40:12
  • 866

关于动物的抽象类

package abs; abstract class Animal { abstract void cry(); abstract void getAnimalName(); } ...
  • Glee_one
  • Glee_one
  • 2017-11-05 10:34:26
  • 84

京东2017实习生招聘试题 下列关于抽象类说法错误的是

京东2017实习生招聘 Java方向 [多选]下列关于抽象类说法错误的是 A 有抽象方法一定有抽象类 B 抽象类必须由抽象方法 C 抽象类没有构造方法 D 抽象类可...
  • xhyxxx
  • xhyxxx
  • 2017-04-11 20:43:23
  • 566
    个人资料
    持之以恒
    等级:
    访问量: 1253
    积分: 286
    排名: 27万+
    文章分类
    文章存档
    最新评论