1. 构造函数
构造函数的作用:可以用于给对象一个初始化。
当一个类中没有定义构造函数时,那么系统会默认给该类加一个空参数的构造函数。当自己定义了一个构造函数时,默认的构造函数就没有了。
2. 构造代码块
作用:给对象进行初始化
对象一建立就运行,而且优先级大于构造函数的执行。
构造代码块和构造函数的区别:
构造代码块是给所有的对象进行统一初始化的。而构造函数是给对应的对象初始化的。
构造代码块中定义的是不同对象共性的初始化内容。
3. static的特点
1.随着类的加载而加载。也就是说:静态会随着类的消失而消失,说明它的生命周期最长
2.优先于对象存在:明确一点:静态先存在,对象是后存在的。
3.被所有对象所共享
4.可以直接被类名所调用。
实例变量和类变量的区别:
1.存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2.生命周期
类变量生命周期长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1.静态方法只能直接访问静态成员。不能直接访问非静态成员,如果希望在静态方法中访问非静态变量,可以通过创建类的对象,然后通过对象间接的访问非静态变量.
非静态方法即可以访问静态也可以访问非静态。
2.静态方法中不可以定义this,super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this。
3.主函数是静态的。
静态的利和弊:
利处:对对象的共享数据进行单独空间的存储,节省空间,可以直接被类名调用。
弊端:生命周期过长。访问出现局限性。(静态虽好,只能访问静态)
4. 静态代码块
格式:static{ 静态代码块中的执行语句}
特点:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。而构造代码块随着对象的建立而执行,每建立一次对象就执行一次构造代码块。优先级:静态代码块>构造代码块(普通初始化块)>构造方法。
(静态代码块、构造代码块和构造方法的区别 参考: http://www.cnblogs.com/lezhifang/p/6646351.html)
person p=new person();这句话都做了什么事情?
1.因为new用到了person.class。所以会找到person.class文件并加载到内存中。
2.执行该类中的static代码块、如果有的话,给person.class类进行初始化。
3.在堆内存中开辟空间、分配内存空间。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.将内存进行对应构造函数初始化
8.将内存地址赋值给栈内存中的p
5. 设计模式 (参考: http://blog.csdn.net/u011296485/article/details/72074566)
设计模式:解决某一类问题最行之有效的方法。
单例设计模式:解决一个类在内存只存在一个对象。
想要保证对象的唯一:
1.为了避免其他程序过多建立该类对类对象。先禁止其他程序建立该类对象。
2.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
这三部怎代码中体现?
1.将构造函数私有化。
2.在类中创建一个本类对象。
3.提供一个方法可以获取到该对象。
对于事物该怎么描述还怎么描述。
当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。
/*
* 这个是先初始化对象
* 称为:饿汉式
* Single类一进内存,就已经创建好了对象。由于private static Single s=new Single();
*/
class Single{
private Single(){}
private static Single s=new Single();
public static Single getInstance(){
return s;
}
}
/*
* 对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式
* Single类进内存,对象还没有存在,只有调用getInstance方法,才建立对象。
*/
class Single1{
private Single1(){}
private static Single1 s=null;
/*
*此处可以加一个synchronized(同步),使只有一个线程可以进入该方法,避免错乱。
* 但是每次只有一个线程可以进入导致该方法效率低。
public static synchronized Single1 getInstance(){
if(s==null)
s=new Single1();
return s;
}
*/
/*以下方法更为高效*/
public static Single1 getInstance(){
if(s==null){
synchronized(Single1.class) {
if(s==null)
s=new Single1();
}
}
return s;
}
}