创建对象
v 要获得一个类的对象需要两步:
§ 你必须声明该类类型的一个变量,这个变量没有定义一个对象。实际上,它只是一个能够引用对象的简单变量。
§ 该声明要创建一个对象的实际的物理拷贝,并把对于该对象的引用赋给该变量。
对象的声明
v 声明通过 “类名 变量名;” 语句实现
声明时,对象为空(即null); 此时对象不能使用; 如使用将报 NullPointerException 类型的错误;
分配内存
分配内存通过 关键字 ”new+类的构造方法();” 语句实现
v 分配内存是为对象分配实体(变量)的过程;分配几个及分配什么变量由创建的类的成员变量决定;
v 如成员变量在类中没有初始化,则在为对象分配变量(创建对象)后用默认值自动初始化; 布尔型默认false; 整型默认0;浮点型默认0.0; 类类型默认null;
对象的使用
v 对象不仅拥有属于自己的属性,还拥有创建它的类中方法;
v 对象可以通过运算符“.”访问自己的属性,调用自己的方法;
v 引用传递与值传递
参数传递
v 当方法被调用时,如有参数,参数须要实例化(初始化);即参数是具体的值;
v 在java中,参数为基本数据类型时为值传递; 为类类型是引用传递;
类变量与实例变量的区别
v 对象是通过类来创建的; 因此创建对象时需先加载相应的类; 而一个类可以(通过new+构造方法) 创建多个对象,每个对象都有属于自己的实体(变量);
v 区别:
§ 类变量在类加载时分配内存的;实例变量在创建对象时分配内存的; 类变量在程序退出时释放内存;对象不存在实例变量就不存在了
§ 类变量被所有对象共享,即同一类的所有对象共享此类的类变量; 实例变量为每个对象独有; 操作自己的实例变量而不会影响其它对象
§ 类变量一般通过类名来调用;
§ 类变量static来声明
类方法与实例方法的区别
v 类加载时,类方法被分配入口地址; 实例方法是在第一个对象创建时被分配入口地址
v 类方法一般通过类名来调用
v 在类方法中不能使用 this 关键字;因为this代表当前对象; 类方法是在类加载时就存在而此时对象还不存在
垃圾回收(garbage collection)
v 内存释放
Java使用自动的处理重新分配内存的方法:垃圾回收:当一个对象的引用不存在,则该对象被认为是不再需要的,它所占有的内存会被释放掉。
v 如果想强制垃圾回收,可以调用
System.gc();
finalize()方法
v 主要用来释放非java资源,例如文件句柄或window字体字符
v 方法原型:
protected void finalize(){
//finalization code here
}
v 当对象被释放时,将自动调用对象的finalize()方法
静态块特点
v 静态块特点
§ 静态块(静态块中的所有java语句) 在类被加载时执行;
§ 静态块一般只执行一次。
对象块:类被实例化的时候执行,在构造方法之前执行。
要点补充:
1:参数传递的值传递与引用传递
A:值传递:基本数据类型传递都是值传递
B:引用传递(地址传递):对象数据类型都是引用传递。
2:类变量与成员变量(实例变量,对象变量)
类变量:通过类名调用,类变量被所有的实例共享。
finalstatic int MAX = 20; //Java中定义常量
对象变量:通过对象调用(对象必须new出来)。
3:类方法与成员方法(实例方法,对象方法)
类方法:通过类名调用,在类方法中不能使用this关键字。因为this代表当前代表。
成员方法:通过对象调用(对象必须new出来)。
4:
构造方法
销毁方法(finalize)
销毁方法是在对象被销毁的时候进行调用的。
当一个对象在堆区没有一个明确的引用指向它的时候,Java虚拟机认为该对象是无用的。
垃圾回收器是用于回收堆区分配的对象。 垃圾回收器只会回收3次的
的内存。垃圾回收器是虚拟机自动调用的。(堆区内存不够的情况下调用)
但是可以通过System.gc()来强制运行垃圾回收器。
5:static静态块与对象块
寻找main方法--->加载类--->加载类的静态块代码(只初始化一次)
--->加载类的静态方法和静态变量(只初始化一次)---->对象块方法
--->对象的构造方法--->调用对象的方法--->执行对象的销毁方法。
====静态快
java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++中的static,都是最先初始化好的。
所以注意:
a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生,
至于非静态块是存在每一个类中,除了带有static块以外,它最先执行,(在构造函数前)
在二种情况下我们不得不用this这个关键字.
1.我们想通过构造方法将外部传入的参数赋值给成员变量,而构造方法的形式参数与类成员的变量名相同,这时就需要this这个关键字来区别局部变量与类变量;
2.构造方法是在产生对象时被自动调用的,我们不能在程序中像调用其他方法一样去调用构造方法但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法.
==========
finalize方法是Object类的一个方法,任何一个类都从Object那继承了这个方法。此方法只是在系统回收垃圾时才去调用的,
但不是所有的垃圾都被回收所以并不是每个对象的的finalize方法都被调用;
================
构造方法不同于一般方法的特征有3点:
1.它具有与类名一样的名称
2.它不含有返回值
3.它不能用return语句返回一个值
还有一点要注意的就是:它没有返回值但也没有void;如果有void那它就不再是构造方法了.
------------
--------------
构造方法就像是类这个皇帝派出的一个钦差大臣一样,它只是帮皇帝办事,但在外界看来他就代表了皇帝,所以构造方法也就和类一样的名子。皇帝只有一个但钦差可有几个。