《Java编程思想》05.初始化与清理

  • 编程代价高昂的主因:不安全的编程方式
  • C++引入构造器(constructor),对象被创建时自动调用的特殊方法
  • Java也采用构造器,同时引入垃圾回收器

构造器确保初始化

  • 通过构造器,确保每个对象在被操作之前都能得到初始化
  • 构造器为什么要与类的名称相同?
    • 任何名字都可能与类的某个成员名称相冲突
    • 需要让编译器知道该调用哪个方法来初始化这个对象(调用构造器是编译器的责任
    • 实质上也就是沿用了C++的解决方法
  • 因此在编码风格(方法首字母小写)的角度上来看,构造器的命名是个例外
  • Java中,初始化与创建捆绑

方法重载

方法的重载能够减少语言的冗余性,倘若没有方法的重载,构造器也就难以实现,我们需要与编译器之间约定构造器方法的名称,让编译器知道调用哪个方法,由编码者来命名的话,便会有很多不同的名称,如果采用匹配的方案来实现的话,比如:类名为Car,将自己写的构造器命名为CarOne(),用类似匹配Car*的方式,如果写的方法一多,也就难免重复,带来诸多麻烦。总之:构造器是强制重载方法的另一个原因

重载方法的区分

  • 独一无二参数类型列表

    • 个数不同
    • 顺序不同 - 一般不这么做<-代码难以维护
    • 类型不同

以返回值类型区分重载方法

void f(){}
int f(){return 1;}

能否区分调用方法依赖于用户调用的情况:

int x = f();    //能够区分
f();            //无法区分  (为了副作用而调用)

根据方法的返回值来区分重载方法是行不通的

默认构造器

如果没有定义构造器,编译器会自动创建一个默认的构造器(“无参构造器”)

this关键字

class Banana { void peel(int i){/*...*/} }

public class test {

    public static void main(String[] args) {
        Banana a = new Banana();
        Banana b = new Banana();
        a.peel(1);
        b.peel(2);
    }
}

上述代码,peel()如何知道被a还是b调用?

编译器将“所操作对象的引用”作为第一个参数传递给peel()

所以实际上是:

Banana.peel(a, 1);
Banana.peel(b, 2);

这个引用是编译器引入的,为了能够在方法的内部获得当前对象的引用,设立专门的关键字:this

构造器中调用构造器

class Banana {
    private String name;
    private double price;

    Banana(double price){
        this.price = price;
    }

    Banana(String name, double price){
        this(price);
        this.name = name;
    }

    public void info(){
        System.out.println("name:" + name + ";price:" + price);
    }
}
  • 无法调用两个 <- 构造器必须置于最起始处

static的含义

  • 没有this的方法
  • static方法内不能调用非静态方法
  • 没有创建任何对象的前提下能调用static方法(仅通过类本身)
class Tool {
    public static void sayHi(){
        System.out.println("hello.");
    }
}
public class test {
    public static void main(String[] args) {
        Tool.sayHi();   //仅通过Tool类本身调用,而不是由Tool创建的对象
    }
}
/* Output:
hello.
*/

清理:终结处理和垃圾回收

  • Java里的对象并非总是被垃圾回收

    • 对象可能不被垃圾回收
    • 垃圾回收不等于“析构”
    • 垃圾回收只与内存有关

    垃圾回收->回收程序不再使用的内存

Native Method 本地方法

垃圾回收器如何工作

  • 在堆上分配对象的代价十分高昂
  • Java的垃圾回收器能够提高对象的创建速度 -> 因此Java从分配空间的速度可以和其他语言从堆栈上分配空间的速度相媲美

一些垃圾回收机制:

  1. 引用计数

简单、慢

每个对象 一个 引用计数器,当有引用连接至对象,引用计数加1;垃圾回收器在含有全部对象的列表上遍历,发现某个对象的引用计数=0,就释放其空间

  1. 更快的模式

依据:任何“活”的对象 ---能追溯到---> 在堆栈或静态存储区之中的引用,在此区域遍历所有引用 ---能找到---> 所有的“活”的对象

如何处理找到的“活”的对象

  • 停止-复制

    先暂停程序的运行,将所有“活”的对象复制到另一个堆(旧地址需要映射到新地址)

缺点:效率低,耗空间

  • 标记-清扫

    找到活对象->标记,全部标记工作完成,清理开始,没有标记的对象被释放,重新整理剩下的对象(由于剩下的堆空间是不连续的)

在只产生少量垃圾的情况下,它的速度很快

原文地址:https://www.cnblogs.com/hhhqqq/p/12588151.html

时间: 2024-11-14 08:25:38

《Java编程思想》05.初始化与清理的相关文章

Java编程思想(二) —— 初始化与清理

(一)操作符一章的int类型数据溢出的问题在Java7的版本中仍然存在,而且溢出的结果千奇百怪. public class Hello { public static void main(String[] args) { int i = Integer.MAX_VALUE; System.out.println(i); System.out.println(i*4); System.out.println(i*5); } } 结果分别为2147483647,-4,2147483643. 当应用中

《java编程思想》 初始化与清理

1.初始化与清理的重要性: 1.许多C程序的错误都源于程序员忘记初始化变量,特别是使用程序库时,如果不知道如何初始化库的构件更容易出错 2.当使用完一个元素时,这个元素就不会有什么影响了,所以很容易就会忘记,但是这个元素占用的资源一直存在,如果资源一直得不到释放,就会造成资源(内存)耗尽 2.构造器确保初始化: 在java中,通过提供构造器,可以确保每个对象都会得到初始化.创建对象时,如果类对象有构造器,java就会在操作对象之前自动调用相应的构造器,从而保证了初始化进行. 3.static的含

Java 编程思想 第五章 ----初始化与清理(1)

从今天开始每天一小时的java 编程思想的阅读和编码,其实就是把书上的代码抄下来. 5.5 清理:终结处理和垃圾回收 初始化和清理工作同等重要,但是清理工作却被常常忘记,但是在使用对象之后,对对象弃之不顾的做法并不是很安全.Java有自己的垃圾回收器负责回收无用的对象占据的内存资源.但也有特殊情况:假定你的内存区域不是用new获得的,这是无法用垃圾回收器释放所以java中允许在类中定义一个名为 finalize()的方法.       工作原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首

《 Java 编程思想》CH05 初始化与清理

< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相同的名称. 由于构造器的名称必须与类名完全相同,所以"每个方法首字母小写"的风格在这里不适用. 构造器方法可以有参数,这样可以在初始化对象时提供实际参数. 不接受任何参数的构造器叫做"默认构造器". 构造器一种特殊类型的方法,它没有返回值 方法重载 因为可以要用多种方式

《Java编程思想》学习01:普通类的初始化加载顺序分析

<Java编程思想>学习01:普通类的初始化加载顺序分析 本文根据控制变量法,分析普通类(没有extends,implement)初始化的加载顺序: 参考<Java编程思想>第五章 源码 StaticClass1类 package com.tyj.study.thinkinjava; /* * *@Description: *@Author:TYJ *@Date: create in 2019/7/9 17:22 */ public class StaticClass1 { { S

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概

java编程思想第4、5章细节总结

和上次的一样,只是总结下看这本书学习到的新观点或者重点,简单并且提高效率. 第四章   控制执行流程 1.java中不允许一个数字当做布尔值来使用,而在C或者C++中可以 2.java中唯一用到逗号的地方就是for循环的控制表达式 3.for循环可以定义多个变量,但是这些变量必须要有相投的类型 4.要熟练使用for--each循环 5.break退出整个循环,continue退出当前循环 6.switch的case后面一定要跟上break'语句(有一次出bug就是因为粗心没有加上break) 第

JAVA编程思想(1) - 一切都是对象

-"如果我们说另一种不用的语言,那么我们就会发觉一个有些不同的世界" 1. 用引用操纵对象 每种编程语言都有自己的数据处理方式.有些时候,程序员必须时刻留意准备处理的是什么类型.您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)? 所有的这一切在JAVA里都得到了简化.在JAVA里一切都被视为对象,尽管是一切都被看成对象,但操纵的标识符实际上是一个"引用"而已,简单来说是:对象好比"电视",我们拥有的引用是&q

java编程思想 第二章

这篇时间较之前篇章时间靠后,是由于,某一天晚上看完Java编程思想文献之后来不及做笔记了. 以下笔记基本为转载,不是原创 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个“引用”,遥控器(引用)操纵

Java编程思想(第4版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一