博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java编程思想学习笔记——初始化与清理
阅读量:6910 次
发布时间:2019-06-27

本文共 2527 字,大约阅读时间需要 8 分钟。

初始化

构造器保证初始化

构造器采用与类相同的名称。

默认构造器(default constructor):不接受任何参数的构造器,也叫无参构造器。

构造器也能带有形式参数,就能在初始化对象时提供实际参数。

class Foo{ Foo(){    System.out.println("Foo's no-arg Constructor Foo()"); } Foo(int i){     System.out.println("Foo's arg Constructor Foo ("+i+")"); }}public class ConstructorDemo {  public static void main(String[] args) {    new Foo();    new Foo(1);  }}

方法重载(Method Overloading)

定义:方法名不同而形式参数不同,适用于构造器和其它方法。

区分重载方法:每个重载的方法都必须有一个独一无二的参数类型列表。

涉及基本类型的重载:基本类型从一个较小的类型自动提升到一个较大的类型。

以返回值区分重载方法:行不通,如下所示:

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

Java无法判断该调用哪个f()方法。

默认构造器

默认构造器没有形式参数,作用是创建一个默认对象。若类中没有构造器,则编译器会自动创建一个默认构造器。

没有提供构造器->编译器认为需要一个构造器,我给你制造一个。

已经有了构造器->编译器认为已写了构造器,你知道你在做什么,你是刻意省略默认构造器的。

this关键字

class Banana{  void peel(int i){     System.out.println(this.toString()+" "+i);  }}public class BananaPeel {    public static void main(String[] args) {      Banana a = new Banana(),            b = new Banana();      System.out.println("a:"+a.toString()+"\nb:"+b.toString());      a.peel(1);      b.peel(2);  }}

结果输出:

a:Banana@610455d6b:Banana@511d50c0Banana@610455d6 1Banana@511d50c0 2

同一个类的两个对象,调用类的同一方法,是如何知道是被哪个对象调用的呢?

为了能用简便,面向对象的语法来编写代码——即发送消息给对象,编译器做了一些幕后工作,它暗自把“所操作对象的引用”作为

第一个参数传递给peel()。所以a,b调用的两个方法就变成了这样:

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

从结果输出也能看出来编译器将所操作对象的引用传递给了peel()方法。

this关键字用于在方法内部获得对当前对象的引用。表示对"调用方法的那个对象"的引用。

this的用法和其他对象引用没有不同。

注意:在方法内部调用同一个类的另一个方法不必使用this,直接调用即可。

public class ThisDemo {   int i = 0;   ThisDemo increment(){       i++;       //返回对当前对象的引用       return this;   }   void print(){       System.out.println("i="+i);   }public static void main(String[] args) {    ThisDemo thisDemo = new ThisDemo();    thisDemo.increment().increment().increment().increment().print();}

构造器中调用构造器

一个类中有多个构造器,为避免重复代码,可能在一个构造器中调用另一个构造器。使用this关键字调用其他构造器。

除构造器之外,编译器禁止在其他任何方法中调用构造器。

static的含义

static(静态)方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来可以。

static方法的主要用途:可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。(很像全局方法,但是在Java中禁止使用全局方法,但在类中置入static方法就可以访问其他static方法和static域)

由于不存在this,所以静态方法不是通过"向对象发送消息"的方式来完成的。

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

Java有垃圾回收器负责回收无用对象占据的内存资源。但有特殊情况:假定对象(并非使用new)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块特殊的内存。

针对上述特殊情况,Java允许在类中定义一个名为finalize()方法,在下一次垃圾回收动作发生时,才会真正回收对象占用的内存

  1. 对象可能不被垃圾回收
  2. 垃圾回收并不等于"析构"

在不再需要某个对象之前,如果必须执行某些动作,必须得自己去做。Java中并未提供"析构函数"或相似的概念。自己动手创建一个执行清理工作的普通方法来做类似的清理工作。

finalize()的用途

  1. 垃圾回收只与内存有关

无论是垃圾回收还是终结,都不保证一定会发生。如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去

执行垃圾回收以恢复内存的。

垃圾回收器如何工作

当垃圾回收器工作时,一面回收空间,一面使堆中的对象紧凑排列。堆指针就能很容易移动到更靠近传送带的开始处,尽量避免了

页面错误。

原文地址:http://www.cnblogs.com/JohnTsai/p/4585850.html
你可能感兴趣的文章
Android开发中Chronometer的用法
查看>>
转json出现的死循环问题--SSH
查看>>
使用GDB和GEF进行调试
查看>>
cloudstack 安装 install for ubuntu
查看>>
poj 2155 Matrix
查看>>
HDU 1203 I NEED A OFFER! 简单DP
查看>>
BZOJ3233 [AHOI2013] 找硬币
查看>>
前端学PHP之正则表达式基础语法
查看>>
基于heartbeat的单播方式实现tomcat高可用
查看>>
Lombok注解@Getter @Setter详解
查看>>
记录一下两个比较常用的md5加密算法
查看>>
python基础===包的导入和__init__.py的介绍
查看>>
Redis 安装和配置
查看>>
记录OPENGL学习中遇到的问题
查看>>
网页的布局方式
查看>>
[BZOJ2127]happiness
查看>>
Catalan数的通项公式(母函数推导)
查看>>
hdu1520(树状dp)
查看>>
activiti学习--13:组任务分配方式3--使用类
查看>>
JVisualVM出现: “Local Applications Cannot Be Detected”
查看>>