SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Initialization & Cleanup
Agenda
•   概述
•   构造器命名 & 默认构造器
•   含参数构造器
•   this关键字
•   RE - static关键字
•   垃圾回收 - 引用计数&内存泄露
•   垃圾回收 - finalize方法
•   垃圾回收 - System.gc()
•   static块
•   non-static块
•   变长参数
•   枚举类型
概述
• 初始化和清理是仸何编程语言中都需要处
  理的两个问题, 正确的初始化保证了对象能
  够被使用, 而清理则确保了不被使用的对象
  被回收, 与之相关的内存/文件操作符等系统
  资源也会释放;
• 在Java中, 对象的初始化沿用了C++中的构造
  器(Constructor)方式, 并且引入了垃圾回收
  (Garbage Collect)机制来实现对象的回收.
构造器的命名
                      &默认构造器
• Java中构造器(constructor)的命名与类名相同, 可以有多
  个构造器(重载), 只是这些构造器的参数不同; 示例:
Class Rock {
   Rock() {
        System.out.println(“This is Rock”);
   }
}
• 无参构造器在java被称为默认构造器(default constructor),
  如果一个类没有定义任何构造器, 则会自动引入一个默
  认构造器.
• 构造器的命名不遵循”方法的第一个字母小写”的编码风
  格;
• 示例: demo/Demo1.java
带参数构造器
• Java中构造器与方法一样也可以指定形参.
  示例:
class Rock {
    Rock (int i) {
         System.out.print("Rock " + i + " ");
    }
}

• 示例: demo/Demo2.java
this关键字
•   访问某个对象上的属性或方法时, Java会默认传入该对象的引用; 可以使用
    this关键字访问该对象的引用, this可以理解为”当前对象”. 示例:
Class Demo {
    int String name = “Bosh”;
    private void sayHello() {
             System.out.println(name); // 等价于this.name
    }
    public void say() {
             /**比如Demo demo = new Demo(); demo.say();
              **this即表示demo **/
             sayHello(); // 等价于this.sayHello()
    }
}
•   可以看到this关键字并不是必须的, 但是在某些特殊的情况下必须使用该
    关键字, 比如:
public void setName(String name) {
    this.name = name; // name是对象的属性, 这里使用输入的参数进行赋值
}
•   this指向的是对象, 不能使用在static方法中, 因为调用static方法不需要创建
    对象.
•   示例: demo/Demo4.java
this关键字
                                              构造器调用
•   this关键字可以用于调用另一个构造器, 这样的好处在于避免了重复代码, 符合DRY原则.
    示例:
Flower(int petals) { // 构造器1
      petalCount = petals;
      print("Constructor w/ int arg only, petalCount= " + petalCount);
}
Flower(String ss) {         // 构造器2
      print("Constructor w/ String arg only, s = " + ss);
      s = ss;
}
Flower(String s, int petals) {             // 构造器3
      this(petals);                       // 调用构造器1
      print("String & int args");
}
Flower() {
      this("hi", 47);                    // 调用构造器3
      print("default constructor (no args)");
}
•   this构造器的调用必须是构造器方法体中的第一条语句, 并且只能有一次
    this调用, 否则会爆出编译错误;
•   示例: demo/Demo5.java
RE - static关键字
• static可以理解为non-this, 因为不需要创建
  对象; 在static方法中不能调用non-static方法,
  反之在non-static方法中则可以调用static方
  法;
• static被认为是non-OOP的, 如果你的设计中
  出现了过多的static那么应该重新思考你的
  设计了.
垃圾回收
            引用计数 & 内存泄露
• Java中的垃圾回收(GC)是基于引用计数机制的, 所谓引用计数是指Java
    会自动计算指向所有对象的引用的个数, 如果某个对象的引用计数为0,
    那么该对象将在JVM下一次的GC操作中被释放;
• Java中的内存泄露(Memory Leak)不同于C++, 后者是指没有调用对象的
    destructor方法导致不再被使用对象的内存没有被释放; Java的内存泄
    露是指对象仍然是可访问的(引用计数大于0), 但是不会被使用. 示例:
Vector v=new Vector(10);
for (int i=1;i<100; i++) {
    Object o=new Object();
    v.add(o);
    o=null; // 虽然o不再指向Object对象, 但v然保存了这些对象的引
      // 用如果v不再被使用那么这些Object对象就造成了内存泄露
}
Solution:
设置v=null; 可以避免这里的内存泄露问题
垃圾回收
          finalize方法
• finalize方法定义在Object类中, 子类可以覆
  盖该方法实现资源的释放, 该方法在对象被
  垃圾回收(GC)之前被调用;
• 但是尽量不要依赖finalize方法来实现对内存
  等资源的释放, GC会处理好这一切. 如果需
  要释放比如文件句柄, 数据库连接等资源则
  应当编写相应的方法.
垃圾回收
           System.gc()
• 可以调用System.gc()来提示JVM进行垃圾回
  收, 但是该调用不能保证GC操作被立即执行;
  建议是如果基于JVM内存调优需要永远不要
  调用此方法, 而应该从其他方面进行调优;
• Runtime.getRuntime().gc()调用等价于
  System.gc()
成员初始化
• 类成员的初始化区分于static成员和非static成员: 前
   者在该类被加载时初始化, 之后不会再次初始化; 后
   者在每次创建对象时(new)初始化;
• 对象成员的初始化分为两步:
1, 执行成员声明语句的初始化, eg:
private int i = 1; // 声明成员i, 在创建对象时首先执行初始化操作
注意: 在成员声明语句中可以不指定初始值, 将会使用默认值
进行初始化, 参考: demo/Demo6.java
2, 执行构造函数中的成员初始化操作, 在构造函数中可
   以对成员进行初始化
• 示例: demo/Demo7.java
• 示例: demo/Demo8.java
static块
• static块的执行时机与static成员的初始化相
  同, 都是在被加载时执行; 写法:
  static {
    ......
  }
• 示例: demo/Demo9.java
non-static块
• Java提供了非static块用于实现对非static成
  员的初始化, 写法: {......} ; 相比static块是没
  有static关键字.
• 示例: demo/Demo10.java
变长参数
• JDK5对方法的变长参数提供了支持, eg:
// 方法声明
void printArray(Object... args)
// 调用
printArray(47, 3.14F, 11.11);
printArray("one", "two", "three");
printArray(new A(), new A(), new A());
printArray((Object[])new Integer[]{ 1, 2, 3, 4 });
printArray(); // Empty list is OK
• 示例: demo/Demo11.java
变长参数
                       可选参数
• 可以看到, 变长参数是允许为空的, 这就为可
  选参数的实现提供了一种方式, eg:
void f(int required, String... trailing) // trailing可选
• 示例: demo/Demo12.java
枚举类型
                            Enumerated Type
•   JDK5引入了枚举类型用于定义枚举值, eg:
public enum Spiciness {
     NOT, MILD, MEDIUM, HOT, FLAMING
}
• 如何使用?
1, 赋值
Spiciness howHot = Spiciness.MEDIUM;
2, print
System.out.println(howHot); // 输出MEDIUM
3, 顺序
howHot.oridnal(); // 返回2, 从0开始
4, 使用在switch语句中
Spiciness degree ...;
switch(degree) {
     case NOT: System.out.println("not spicy at all."); break;
    ......
     default: System.out.println("maybe too hot.");
}
• 示例: demo/Demo13.java
END

Weitere ähnliche Inhalte

Was ist angesagt?

從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法yiditushe
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术hoopchina
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式Justin Lin
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Scala再探
Scala再探Scala再探
Scala再探afeihehe
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closureswang hongjiang
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1Sheng-Han Su
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
Javascript share
Javascript shareJavascript share
Javascript shareXu Mac
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 

Was ist angesagt? (20)

從模組到類別
從模組到類別從模組到類別
從模組到類別
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
Sun java
Sun javaSun java
Sun java
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Scala再探
Scala再探Scala再探
Scala再探
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
 
functional-scala
functional-scalafunctional-scala
functional-scala
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1
 
Jasmine2
Jasmine2Jasmine2
Jasmine2
 
進階主題
進階主題進階主題
進階主題
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
Node way
Node wayNode way
Node way
 
Javascript share
Javascript shareJavascript share
Javascript share
 
PHP
PHPPHP
PHP
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)
 

Andere mochten auch

[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서startupkorea
 
1, linux intro
1, linux intro1, linux intro
1, linux introted-xu
 
13, io
13, io13, io
13, ioted-xu
 
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜Koki Kusano
 
How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box Eurosat
 
F-commerce to E-commerce conversion
F-commerce to E-commerce conversionF-commerce to E-commerce conversion
F-commerce to E-commerce conversionMoshiur Monty
 
CIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationCIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationGlobal Business Intel
 
10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube VideoMoshiur Monty
 
Vencomatic company introduction
Vencomatic company introductionVencomatic company introduction
Vencomatic company introductionnielsgeraerts
 

Andere mochten auch (10)

[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서[중소기업청]뚜따 회사소개서
[중소기업청]뚜따 회사소개서
 
1, linux intro
1, linux intro1, linux intro
1, linux intro
 
FDA
FDAFDA
FDA
 
13, io
13, io13, io
13, io
 
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
プレゼンはなぜ難しいのか〜学ぶための視点を整理しよう〜
 
How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box How to install Firmware on Eurosat P6 HD Set Top Box
How to install Firmware on Eurosat P6 HD Set Top Box
 
F-commerce to E-commerce conversion
F-commerce to E-commerce conversionF-commerce to E-commerce conversion
F-commerce to E-commerce conversion
 
CIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application TransformationCIO Event - Info vista - Application Transformation
CIO Event - Info vista - Application Transformation
 
10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video10 Factors of Ranking a YouTube Video
10 Factors of Ranking a YouTube Video
 
Vencomatic company introduction
Vencomatic company introductionVencomatic company introduction
Vencomatic company introduction
 

Ähnlich wie 5, initialization & cleanup

2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programmingted-xu
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档yiditushe
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-CTom Fan
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片ff1
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用FLASH开发者交流会
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]ReflectionArBing Xie
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL正中 周
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门Lucien Li
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
11, exceptions
11, exceptions11, exceptions
11, exceptionsted-xu
 

Ähnlich wie 5, initialization & cleanup (20)

2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-C
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL
 
线程与并发
线程与并发线程与并发
线程与并发
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
11, exceptions
11, exceptions11, exceptions
11, exceptions
 
Js培训
Js培训Js培训
Js培训
 

Mehr von ted-xu

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert systemted-xu
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashbackted-xu
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rmanted-xu
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rmanted-xu
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recoveryted-xu
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle securityted-xu
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storageted-xu
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networkingted-xu
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance managementted-xu
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a databaseted-xu
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuningted-xu
 
7, business event system
7, business event system7, business event system
7, business event systemted-xu
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneousted-xu
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activityted-xu
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & apited-xu
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebsted-xu
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflowted-xu
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow introted-xu
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & apited-xu
 

Mehr von ted-xu (20)

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rman
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle security
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storage
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 
7, business event system
7, business event system7, business event system
7, business event system
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneous
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activity
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & api
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebs
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflow
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow intro
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & api
 

5, initialization & cleanup

  • 2. Agenda • 概述 • 构造器命名 & 默认构造器 • 含参数构造器 • this关键字 • RE - static关键字 • 垃圾回收 - 引用计数&内存泄露 • 垃圾回收 - finalize方法 • 垃圾回收 - System.gc() • static块 • non-static块 • 变长参数 • 枚举类型
  • 3. 概述 • 初始化和清理是仸何编程语言中都需要处 理的两个问题, 正确的初始化保证了对象能 够被使用, 而清理则确保了不被使用的对象 被回收, 与之相关的内存/文件操作符等系统 资源也会释放; • 在Java中, 对象的初始化沿用了C++中的构造 器(Constructor)方式, 并且引入了垃圾回收 (Garbage Collect)机制来实现对象的回收.
  • 4. 构造器的命名 &默认构造器 • Java中构造器(constructor)的命名与类名相同, 可以有多 个构造器(重载), 只是这些构造器的参数不同; 示例: Class Rock { Rock() { System.out.println(“This is Rock”); } } • 无参构造器在java被称为默认构造器(default constructor), 如果一个类没有定义任何构造器, 则会自动引入一个默 认构造器. • 构造器的命名不遵循”方法的第一个字母小写”的编码风 格; • 示例: demo/Demo1.java
  • 5. 带参数构造器 • Java中构造器与方法一样也可以指定形参. 示例: class Rock { Rock (int i) { System.out.print("Rock " + i + " "); } } • 示例: demo/Demo2.java
  • 6. this关键字 • 访问某个对象上的属性或方法时, Java会默认传入该对象的引用; 可以使用 this关键字访问该对象的引用, this可以理解为”当前对象”. 示例: Class Demo { int String name = “Bosh”; private void sayHello() { System.out.println(name); // 等价于this.name } public void say() { /**比如Demo demo = new Demo(); demo.say(); **this即表示demo **/ sayHello(); // 等价于this.sayHello() } } • 可以看到this关键字并不是必须的, 但是在某些特殊的情况下必须使用该 关键字, 比如: public void setName(String name) { this.name = name; // name是对象的属性, 这里使用输入的参数进行赋值 } • this指向的是对象, 不能使用在static方法中, 因为调用static方法不需要创建 对象. • 示例: demo/Demo4.java
  • 7. this关键字 构造器调用 • this关键字可以用于调用另一个构造器, 这样的好处在于避免了重复代码, 符合DRY原则. 示例: Flower(int petals) { // 构造器1 petalCount = petals; print("Constructor w/ int arg only, petalCount= " + petalCount); } Flower(String ss) { // 构造器2 print("Constructor w/ String arg only, s = " + ss); s = ss; } Flower(String s, int petals) { // 构造器3 this(petals); // 调用构造器1 print("String & int args"); } Flower() { this("hi", 47); // 调用构造器3 print("default constructor (no args)"); } • this构造器的调用必须是构造器方法体中的第一条语句, 并且只能有一次 this调用, 否则会爆出编译错误; • 示例: demo/Demo5.java
  • 8. RE - static关键字 • static可以理解为non-this, 因为不需要创建 对象; 在static方法中不能调用non-static方法, 反之在non-static方法中则可以调用static方 法; • static被认为是non-OOP的, 如果你的设计中 出现了过多的static那么应该重新思考你的 设计了.
  • 9. 垃圾回收 引用计数 & 内存泄露 • Java中的垃圾回收(GC)是基于引用计数机制的, 所谓引用计数是指Java 会自动计算指向所有对象的引用的个数, 如果某个对象的引用计数为0, 那么该对象将在JVM下一次的GC操作中被释放; • Java中的内存泄露(Memory Leak)不同于C++, 后者是指没有调用对象的 destructor方法导致不再被使用对象的内存没有被释放; Java的内存泄 露是指对象仍然是可访问的(引用计数大于0), 但是不会被使用. 示例: Vector v=new Vector(10); for (int i=1;i<100; i++) { Object o=new Object(); v.add(o); o=null; // 虽然o不再指向Object对象, 但v然保存了这些对象的引 // 用如果v不再被使用那么这些Object对象就造成了内存泄露 } Solution: 设置v=null; 可以避免这里的内存泄露问题
  • 10. 垃圾回收 finalize方法 • finalize方法定义在Object类中, 子类可以覆 盖该方法实现资源的释放, 该方法在对象被 垃圾回收(GC)之前被调用; • 但是尽量不要依赖finalize方法来实现对内存 等资源的释放, GC会处理好这一切. 如果需 要释放比如文件句柄, 数据库连接等资源则 应当编写相应的方法.
  • 11. 垃圾回收 System.gc() • 可以调用System.gc()来提示JVM进行垃圾回 收, 但是该调用不能保证GC操作被立即执行; 建议是如果基于JVM内存调优需要永远不要 调用此方法, 而应该从其他方面进行调优; • Runtime.getRuntime().gc()调用等价于 System.gc()
  • 12. 成员初始化 • 类成员的初始化区分于static成员和非static成员: 前 者在该类被加载时初始化, 之后不会再次初始化; 后 者在每次创建对象时(new)初始化; • 对象成员的初始化分为两步: 1, 执行成员声明语句的初始化, eg: private int i = 1; // 声明成员i, 在创建对象时首先执行初始化操作 注意: 在成员声明语句中可以不指定初始值, 将会使用默认值 进行初始化, 参考: demo/Demo6.java 2, 执行构造函数中的成员初始化操作, 在构造函数中可 以对成员进行初始化 • 示例: demo/Demo7.java • 示例: demo/Demo8.java
  • 13. static块 • static块的执行时机与static成员的初始化相 同, 都是在被加载时执行; 写法: static { ...... } • 示例: demo/Demo9.java
  • 14. non-static块 • Java提供了非static块用于实现对非static成 员的初始化, 写法: {......} ; 相比static块是没 有static关键字. • 示例: demo/Demo10.java
  • 15. 变长参数 • JDK5对方法的变长参数提供了支持, eg: // 方法声明 void printArray(Object... args) // 调用 printArray(47, 3.14F, 11.11); printArray("one", "two", "three"); printArray(new A(), new A(), new A()); printArray((Object[])new Integer[]{ 1, 2, 3, 4 }); printArray(); // Empty list is OK • 示例: demo/Demo11.java
  • 16. 变长参数 可选参数 • 可以看到, 变长参数是允许为空的, 这就为可 选参数的实现提供了一种方式, eg: void f(int required, String... trailing) // trailing可选 • 示例: demo/Demo12.java
  • 17. 枚举类型 Enumerated Type • JDK5引入了枚举类型用于定义枚举值, eg: public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING } • 如何使用? 1, 赋值 Spiciness howHot = Spiciness.MEDIUM; 2, print System.out.println(howHot); // 输出MEDIUM 3, 顺序 howHot.oridnal(); // 返回2, 从0开始 4, 使用在switch语句中 Spiciness degree ...; switch(degree) { case NOT: System.out.println("not spicy at all."); break; ...... default: System.out.println("maybe too hot."); } • 示例: demo/Demo13.java
  • 18. END