1 构造器
1)一旦创建一个对象(如 new Rock();),就会分配相应的存储空间,并调用构造器。
解释:(1)只有创建对象时,才会调用构造器;
(2)如果不是创建对象,只是创建句柄,那么不会调用构造器?
2 重载方法
重载方法的区分:每个重载方法都必须采取独一无二的自变量类型列表:
例子:
1)两个函数的参数顺序不一样:可以区分重载方法
如: static void print(String s, int i)
static void print(int i, String)
参数顺序不一样,可以区分
注意:这种重载不推荐,因为会产生难以维护的代码。
3主类型的重载
1)主类型:也即基本类型(如int ,long 等)
2)主类型重载时的注意事项:主类型能从一个较小的类型自动的转变为一个较大的类型
如果参数的类型比重载方法中参数的类型小,可以自动的转化为重载方法中参数的类型==>自动向大转换
但是如果参数的类型比重载方法中参数的类型大,必须手动显示转换为重载方法中的参数类型才可以,否则会出现编译错误。
例如
void print(char x);
void print(long x);
print(5);//5为int,自动转化为long,调用print(long x)
void print(long x);
print(5);//此时5为int,小于long,编译出错,应该写成:print( (long)5);
4 不能使用返回值来区分重载方法
5 关于默认构造器
1)如果没有定义构造器,编译器会自动帮我们实现一个默认构造器;
2)如果定义了一个构造器,编译器就不会帮我们事先默认构造器;
6 this指针
1)只能在方法内部使用;
2)常见使用点:(1)希望将句柄返回给当前对象;
(2)在构造器中调用构造器;
7 在构造器中使用this调用构造器
注意事项:
(1)尽管可用this指针调用一个构造器,但是不可调用两个!
(2)此外,在一个构造器中,使用this调用另外一个构造器时,this构造器调用必须是第一句话,也即第一件事是调用构造器,然后才能做其他事情。
例子:
Flower(int i) { print(i);}
Flower(String s {print(s);}
Flower(String s, int petals)
{
this(petals);//使用this调用重载方法Flower(int i)
//this(s);//尝试使用this调用重载方法Flower(int i),==>不允许,因为不能有两个this调用,只能有一个!
this.s = s;//this的另外一个用法
}
8 清除
1)垃圾收集器只知道释放那些由new分配的内存;
2)对于不是由new分配的内存,JAVA提供名为finalize()的方法来清除这些内存;
3)垃圾收集器只和内存有关:业绩垃圾回收期存在的唯一原因是为了回收程序不再使用的内存;
9 成员初始化
1)在一个方法中的局部变量,不会被自动初始化:
例如:
void f() {
int i ;
i++;
}
会出现编译错误,i没有初始化就使用!
2)但是如果类的数据成员为一个基本类型,会被自动初始化;
3)在一个类的内部定义一个对象句柄时,如果不将其初始化为新对象,那么这个句柄就会获得一个空值;
10 初始化
1)类定义中初始化:
JAVA中,可以在类内部定义变量的时候也为其赋值,达到初始化的目的;==> C++中不可以
==>这样做的一个弊端是:每个对象都会获得相同的初始化值;
2)构造器初始化:
clas Counter {
int i;
Counter() { i = 7;}
//i会首先初始化为0,然后初始化为7
3)初始化顺序:
(1)变量:在类中:初始化的顺序是由变量在类中的定义顺序决定的:即使变量定义大量遍布于方法定义的中间,这些变量任然会在任何方法调用之前初始化---甚至是在构造器调用之前;
(2)类的变量的初始化先于构造器调用;
(3)静态数据的初始化:(1)基本类型:自动获得标准基本类型的初始值
(2)指向对象的句柄:如果是新建一个对象,初始值为该对象;否则为空值(NULL)
(4)初始化数据:
首先为static,然后是非static对象;
static初始化只有在必要的时候才会进行:如果不创建对应的类的对象,那么永远都不会初始化static;
例如:一个名为Dog的类:
(4.1)类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class;
(4.2)找到Dog.class后(它会创建一个Class对象),它的所有static初始化模块都会运行
==>static初始化只发生一次,在Class对象首次载入的时候;
(4.3)创建一个new Dog()时,Dog对象的构造过程,会现在内存堆(heap)中为一个Dog对象分配足够多的存储空间;
(4.4)该存储空间会被清为0,将Dog中所有基本类型设为他们的默认值;
(4.5)进行字段定义时,发生的初始化,(按照字段定义的顺序,此时肯定就不包括static字段了)
(4.6)执行构造器;
(5)明确进行的静态初始化:static构建从句(也叫 静态块)
class Spoon {
static int i;
static { i = 47; }
...
}
==>和其他static初始化一样,该static静态块,仅执行一次==>首次生成该类的一个对象,或者首次访问属于该类的一个static成员(即便从未生成该类的对象)
注意:只要类的一个static成员第一次被访问,那么其他所有的static都会执行初始化。
>>>截止内容: 4.5 数组初始化