Java编程思想学习笔记——初始化与清理
初始化
构造器保证初始化
构造器采用与类相同的名称。
默认构造器(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@610455d6
b:Banana@511d50c0
Banana@610455d6 1
Banana@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()方法,在下一次垃圾回收动作发生时,才会真正回收对象占用的内存
- 对象可能不被垃圾回收
- 垃圾回收并不等于"析构"
在不再需要某个对象之前,如果必须执行某些动作,必须得自己去做。Java中并未提供"析构函数"或相似的概念。自己动手创建一个执行清理工作的普通方法来做类似的清理工作。
finalize()的用途
- 垃圾回收只与内存有关
无论是垃圾回收还是终结,都不保证一定会发生。如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去
执行垃圾回收以恢复内存的。
垃圾回收器如何工作
当垃圾回收器工作时,一面回收空间,一面使堆中的对象紧凑排列。堆指针就能很容易移动到更靠近传送带的开始处,尽量避免了
页面错误。
Java编程思想学习笔记——初始化与清理的更多相关文章
- Java编程思想学习笔记——初始化与清理(二)
成员初始化 Java尽力保证:所有变量在使用前都能得到适当的初始化. 方法的局部变量:未初始化,编译错误. void f(){ int i; // System.out.println(i);//编译 ...
- Java编程思想学习(三) 初始化与清理
1. 每个重载的方法都必须有独一无二的参数类型列表.(参数顺序的不同也足以区分两个方法,但不建议这样做,会使代码难以维护.) 2. 方法重载时,如果可以重载的方法间只是参数类型不同,传入的数据类型(实 ...
- 《 Java 编程思想》CH05 初始化与清理
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- Java编程思想 学习笔记11
十一.持有对象 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...
- Java编程思想 学习笔记1
一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...
- Java编程思想学习笔记——类型信息
前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...
- Java编程思想学习笔记——一切都是对象
前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...
随机推荐
- UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
一.综述 现在很多的应用都会在多种平台上发布,所以很多程序猿们都开始使用Hybrid App的设计模式.就是在app上嵌入网页,只要写一份网页代码,就可以跑在不同的系统上.在iOS中,app多是通过W ...
- 中文字符通过URL转给PHP处理,导致中文乱码的解决办法!
在JS中 var content = encodeURI(encodeURI('中文字符')); 在PHP服务端接收 header("Content-type: text/html; cha ...
- THEOS的第一个TWeak的成功创建
THEOS的第一个TWeak的成功创建html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMi ...
- Java中ArrayList实现原理
简述: ArrayList可以理解为动态数组,与Java中的数组相比,它的容量能动态增长.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组中,因此最好能给出数组大小的预 ...
- vs2010中TargetName与链接器输出名不一致
当出现解决方案生成正确,但是无法执行.exe文件,即系统无法找到指定文件时,提示有:MSB8012: TargetName(,,,) 与 Linker 的 OutputFile 属性(,,,)不匹配. ...
- 开源网站访问统计系统Piwik
http://www.piwik.cn/ http://www.piwik.org/ Piwik 是一套基于 Php+MySQL 技术构建,能够与 Google Analytics 相媲美的开源网站访 ...
- Linux高频命令精讲(三)
[教程主题]:2.Linux高频命令精讲 [2.1]Linux的运行方式 图形运行方式 - 本地使用KDE/Gnome集成环境 - 运行X Server远程使用图形环境 命令行(字符运行)方式 - 本 ...
- 【Python】 linecache模块读取文件
[linecache] 过往在读取文件的时候,我们通常使用的是这种模式: with open('file.txt','r') as f: line = f.readline() while line: ...
- 微信小程序——template的使用方法
今天需要做一个[我的订单]页面,订单有几种状态,觉得把订单列表封装成一个模板更好.下面讲一下,如何用小程序自带的template构建一个模板. 1.构建订单列表模板页,命名为 [order.wxml] ...
- 4、QT分析之调试跟踪系统
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002004518944/ 在我们前面的分析中,经常看到qWarning()和qDe ...