第五章 初始化和清理

本文深入探讨了Java编程的基础概念,包括构造器、初始化、方法重载、默认构造器、this关键字、清理机制、成员初始化、数组初始化、枚举类型等高级特性。文章详细解释了每个概念的应用场景及其实现细节,旨在帮助开发者更好地理解和运用Java语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.1 用构造器确保初始化

初始化和清理,是程序错误的源头。

构造函数 constructor 无返回值,跟类同名。

Dog d = new Dog(); new表达式返回了新对象的引用

5.2 方法重载

方法名相同,形参不同,构成不同的函数。

[1]   参数类型不同 f(inta) 与 f(double b)不同

[2]   参数不同类型顺序不同 f(int a,double b) f(doubleb,int a),但尽量不用

[3]  以返回值区分重载方法是不可行的

对于基本类型传参,f(int a)传double类型必须显示转换。如果反过来,会自动提升数据类型f(double b),可传入int short各种。char直接提升为int。

5.3 默认构造器

如果你的类没有写构造器,编译器会自动帮你创建一个默认的构造器 无参数的。

如果你定义了一个构造器,且有参数的。编译器不会再给你创建无参数的构造器。

5.4 this关键字

同一个类型对象a,b调用一个方法,如何知道是哪个调用的,this指针,在方法内部,表示“调用方法的那个对象”的引用。

只有当需要明确指出当前对象的引用时,才需要使用this关键字。

this 完成在构造器中调用构造器

FlowerThis(int petals,String s){

       this(petals);

       //! this(s);一个构造函数中不能调用两次

       this.s=s;//this的用法,形参和字段变量同名时

}

FlowerThis(){ 

this(5,"String");

}

static 方法,就是没有this的方法。static方法中不能调用非静态方法,反之可以。static类似于全局函数。

在使用static方法时,由于不存在this,所以不是通过“向对象发送消息”的方式来完成的。?

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

垃圾回收器,只释放那些经由new分配的内存,其他的内存不会处理。

java允许在类中定义一个finalize()方法,原理,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用内存。

垃圾回收本身也是有开销的。

finalize()真正用途:使用了创建对象之外的方式为对象分配了存储空间。使用本地方法(在java代码中调用非java代码的方式)的情况。

无论是垃圾回收,还是finalize都不保证一定会发生。要想进行除释放空间之外的清理工作,需要明确调用某个恰当的java方法。

finalize的另一个用途:终结条件验证。如果某个对象要被清理掉了,它该处于一个安全状态。

System.gc() 用于强制进行终结动作。但是finalize不总会被调用,例如书上的例子。

垃圾回收器如何工作,有待于进一步看。但垃圾回收器提高了对象的创建速度。

5.6 成员初始化

所有变量在使用之前要保证初始化,否则会报错。

但在类的数据成员,即字段,会默认初始化一个值,int=0,Dogd;引用获得值为null。

每次赋初值,保证了程序的正常运行,但牺牲了灵活性。

5.7构造器初始化

可以通过构造器初始化

初始化顺序:一个类中的字段,在创建对象时,先初始化字段的值,在调用构造函数,无论字段在构造函数之前还是之后定义。

静态数据初始化:无论创建多少个对象,静态数据都只占一份存储区域。static关键字不能应用于局部变量,因为它只能作用于域。

静态初始化只有在必要时刻才会进行。到第一个对象被创建或者第一次静态访问时,才会被初始化,之后不会被初始化第二次

初始化的顺序,先静态对象,然后是非静态对象。

显示的静态初始化:允许为静态变量,组成特殊的静态块。

public class Spoon{

       staticint ;

       static{  i=47; }

}

这段代码只执行一次(当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时【即便从未生成过那个类的对象】。)

5.8 数组初始化

数组定义:

int[] a = {1,2,};//逗号可要可不要

int[] a = new int[10];

String[] s = new String[]{“a”,”b”}

int[] a1 =a; //赋值引用

Other[] os = new Other[10]; 对象数组定义

Arrays.toString(a),将数组转换成可打印版本,a的输出为: [1,2]

可变参数列表

static void printArgs(Object[] args){} 可以传入任意个数,但是必须要printArgs(newObject[]{1,….  });

static void f(int a,String... trailing){} ,可以不用显式的写数组语法,编译器会自动填充数组。f(1,“a”,“b”);

可变参数列表,在重载时容易出现问题,可以增加一个非可变参数来解决,或者重载时不要用可变参数。

5.9 枚举类型

public enum Money{//类似于一个类

              ONE,TWO,FIVE,TEN,TWENTY,FIFTY,HUNDRED

       }//里边用大写

Money m = Money.ONE; //定义数据类型

for(Money n : Money.values()){

           System.out.println(n+"  ordinal:"+n.ordinal());

}

staticvalues(),按照enum常量的声明顺序,产生由这些常量值构成的数组。

ordinal返回某个特定enum的声明顺序,从0开始。

enum与switch一起使用,较为方便。

 

垃圾回收器极大的简化了编程工作,而且处理内存也安全,但是确实增加了运行时的开销,java解释器也非常慢,所以到底这种开销造成何种影响很难断定。但随着时间发展,java性能在不断提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值