您的位置:首页 > 编程语言 > Java开发

JAVA编程思想学习总结:第五章——初始化与清理

2015-03-24 20:56 357 查看
/*此总结的主要内容是我在学习JAVA过程中,认为需要记忆的知识点。并结合之前自己学习C++及javascript的相关知识,注明JAVA在一些情况下与这两门语言的相同及不同之处。*/

(1)方法重载

JAVA区分重载方法的方式有:(1)参数个数。(2)参数类型。(3)参数顺序。(注意:返回值并不能作为函数重载的区分方式)

在重载过程中,基本类型能从一个较小类型自动提升到一个较大的类型。整型常数值会被当作int值处理,所以会调用接受int型参数的重载方法。char型如果无法找到恰好接受char参数的方法,就会直接提升至int型。对于其它类型的参数,如果存在多个类型大于该参数类型的重载函数,会为其匹配提升类型最小的重载函数。比如一个short型参数,有三个重载函数分别接受int型,float型,double型参数,会为其匹配接受int型的重载函数,而不是直接提升到float和double型。

public class initialize {
boolean Boolean;//默认初始化为false
static int a;
static int b;
static{//在第一次创立对象或者第一次调用静态成员时初始化一次
a=0;
b=1;
System.out.print("a and b initialized.a="+a+",b="+b+"\n");
}
int c;
int d;
int e=4;
{
System.out.print("Boolean initialized"+Boolean+"\n");
System.out.print("c and d not initialized.c="+c+",d="+d+"\n");
System.out.print("e initialized e="+e+"\n");
c=2;
d=3;
System.out.print("c and d initialized.c="+c+",d="+d+"\n");
}
initialize(){
e=5;
System.out.print(" constructor e initialized e="+e+"\n");
}
static public void printfF(){
System.out.print("static f is initialized?f="+f+"\n");
}
static int f;//静态数据成员在静态方法调用前先一步被初始化,与其定义位置无关。
public static void main(String[] args){
initialize.printfF();
new initialize();
}

}


输出为:

a and b initialized.a=0,b=1

static f is initialized?f=0

Boolean initializedfalse

c and d not initialized.c=0,d=0

e initialized e=4

c and d initialized.c=2,d=3

constructor e initialized e=5

(2)对象构造器及初始化

当一个对象没有定义构造器时,编译器会创建一个默认构造器,。如果对象已经定义了构造器时,编译器不会再自动创建默认构造器,在创建对象时,一定要调用其定义的构造器,否则编译器报错。

对象中没有被初始化的数据成员会进行自动的初始化,数值型的参数赋值为0,布尔型参数赋值为false,对象的引用赋值为null

如果不想java对数据成员默认初始化,又不使用自定义的构造器初始化,可以有定义类成员变量的地方为其赋值进行初始化。甚至调用方法来提供初值,该方法可以带参数,但参数必须是已经被初始化的(使用这种方法须注意参数初始化顺序,使用未初始化的参数程序报错)

使用自定义的构造器进行初使化并不能阻止自动初始化的进行,自动初始化在构造器调用之前发生。

静态初始化只有在必要时刻才会进行——第一个该类对象创建或者第一次访问静态数据的时候才会被初始化,之后静态对象不会再次被初始化。还可以通过static静态块对多个 静态数据同时初始化。

初始化的顺序是先静态对象(只有当该对象中的静态数据还未被初始化时才会发生),而后是非静态对象。

java中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。它与static静态块很类似,除了没有static 关键字。实例初始化子句是在构造器之前执行,这样可以保证无论调用 了哪个显式构造器,某些操作都会发生。

数组初始化由一对花括号{ }括起来的值组成。(JS使用[ ]来完成)。

(3)this关键字

this关键字在方法内部使用并指用该方法本身。

只有需要明确指出对当前对象的引用时,才需要ths关键字。如(1)返回当前对象的引用,即以return this作为返回值。(实现对方法的链式调用需要用到这种方式)(JQuery中链式调用也是通过返回对象本身来实现的)(2)将当前对象作为参数传递给其它函数。(3)解决对象中的方法使用的参数与对象中的数据成员同名的问题。(4)使用this在构造函数中调用其它构造函数。该构造器调用必需置于最起始处,否则编译器报错。示例如下:

public class Flower {
int petalcount=0;
String s="initial value";
Flower(String s,int petalcount){
this(petalcount);
this.s=s;
System.out.print("Second constructor  String s:"+s+"\n");
}
Flower(int petalcount){
this.petalcount=petalcount;
System.out.print("Constructor only patalCount:"+petalcount+"\n");
}
Flower(String s){
this.s=s;
System.out.print("Constructor only String s:"+s+"\n");
}

Flower(){
this("hi",520);
System.out.print("default constructor (no args)\n");
}
public static void main(String[] args){
Flower x=new Flower();
}
}
输出为Constructor w/ int arg only ,petalCount47

String & int args

default constructor (no args)

petalCount =47 s=hi

(4)static的含义与用法

static方法就是没有this的方法。在static方法内部不能调用非静态方法(其实可以将对象的引用作为参数传到静态方法中使用非静态方法或成员,但这样做偏离了静态方法的初衷)。可以通过类名调用静态方法。它很像全局方法(当然实际中还是有很多不同。)

(5)清理:终结处理和垃圾回收

虽然记下了很多内容,但感觉对对JAVA的内存回收完全没有了解的样子,我需要抽时间进一步的了解内存的回收机制。
Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象战用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正占用的内存。所以要是打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
在C++中,对象一定会被销毁,而java里的对象却并非总是被垃圾回收,换句话说:
1、对象可能不被垃圾回收
2、垃圾回收并不等于析构。
3、垃圾回收只与内在有关。
也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()),它们也必须同内存及其回收有关。

(6)可变参数列表

java中通过如下方式定义方法产生可变的参数列表,可变参数列表中可以使用任何类型的参数。重载方法中也可以使用可变参数列表,但是最好要么只在其中一个版本中使用,要么压根不使用。
public class Newvarargs{
static void printArray(Object... args){
System.out.print(args.getClass());
System.out.print(args.length);
for(Object obj:args)  System.out.print(obj+"");
}
}

(7)枚举类型

使用enum关键字可以定义枚举类型。在创建enum时,编译器会自动添加一些有用的特性。它会创建toString()方法,以便显示某个enum实例的名字。编译器还会创建ordinal()方法,用来表示某个特定enum常量的声明顺序。以及static values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组。

enum Spiciness{
NOT,MILD,MEDIUM,HOT,FLAMING
}
public class enumstudy {
public static void main(String[] args){
Spiciness howHot=Spiciness.MILD;
System.out.print(howHot+"\n");
for(Spiciness s:Spiciness.values()){
System.out.println(s+",ordinal"+s.ordinal());
}
}
}


输出值
MILD

NOT,ordinal0

MILD,ordinal1

MEDIUM,ordinal2

HOT,ordinal3

FLAMING,ordinal4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: