学习内容:static关键字和静态代码块;main函数;javac制作帮助文档;对象的初始化过程;单例设计模式;
一、static关键字和静态代码块
1,静态的特点
1)静态是一个成员修饰符,他随着类的加载而加载,随着类的消亡而消亡。这也说明了静态的生命周期最长。
2)静态优先于对象存在。
3)静态可以直接被类名调用。
4)静态被所有的对象所共享。
2,类变量(静态变量)和实例变量(非静态成员变量)的区别。
类变量存放于方法区(数据区,共享区)中;实例变量存放于堆内存中。
类变量的生命周期最长,随着类的消亡而消亡。实例变量是随着对象的消亡而消亡。
3,什么时候定义静态?
这个问题从两个方面来说,因为静态是成员修饰符,既可以修饰变量,也可以修饰方法。一,对于静态成员变量,当变量被所有对象所共享时,不必每个对象在堆内存中开辟空间存储时。二,对于静态函数,当函数没有操纵对象的特有数据时,这时候定义静态函数
4,静态的利与弊:
利:静态修饰的成员可以被类的每个对象所共享,这样就避免了每个对象都开辟一个空间来存储成员,节省了内存空间。
弊:静态的产生后,出现了访问局限,因为静态只能访问静态成员,不能访问非静态成员。静态的生命周期最长。所以嘛,静态虽好,可不要贪杯呦!。
5,静态的使用注意事项
1)静态只能访问静态(因为静态先加载入内存,非静态成员未必已经随着对象的建立而出现),但是非静态既可以访问静态成员也可以访问非静态成员。
2)静态方法中不可以出现this,super关键字。因为静态优先于对象存在。
6,静态代码块
1)格式:
static
{
给类的初始化内容。
}
2)作用:给类进行初始化。
3)特点:
随着类的加载而执行,并且只执行一次(因为类加载内存只一次)。优先于主函数main执行。
二、主函数main
主函数main是一个程序的入口,他是被JVM识别并且调用的。
她的格式是固定的:public static void main(String[] args)
JVM调用主函数时,传入的是一个String类型的数组,所以当我们想要向主函数中传递参数时,可以这样做
java MainDemo(主函数所在的类) heima ni hao
三、通过javac制作API文档。
1,要同过javac制作API文档,类必须用public修饰;文档中是要被暴露的,所以被权限是private修饰的不可以被显示到文档中的 。构造函数如果也想放在文档中,那么也需要public权限修饰。
在使用javac命令是,根据后面跟的author version 等参数,可以从文档注释中提取出相关的内容。
2,对于类中默认构造函数的说明
当一个类中没有自定义构造函数时,系统会默认的给该类添加一个构造函数,这个默认的构造函数的权限是和所属类的权限一致的。如果类被public修饰,那么默认的构造函数也带public修饰。如果没有被public修饰,那么默认的构造函数,也没有public修饰。默认构造函数的权限是随着类的权限的变化而变化的。
四、对象的初始化过程
1,因为用到了new操作符创建对象,所以先会找到对应的字节码文件,然后加载到内存中
2,执行该类中的静态代码块(如果有的话),用于给该类进行初始化
3,开辟内存空间,分配内存地址
4,给对象的属性进行默认初始化
5,给对象的属性进行显式初始化
6,执行构造代码块中的内容
7,找到与之对应的构造函数,对其进行相应的初始化
8,将内存地址赋给占内存中的该类对象的引用。
五、单例设计模式
概述:单例设计模式就是要保证在内存中使用存在一个对象,这个对象时唯一的不变的。这时候,如果想要在内存中只存在一个对象,在其他类中不可以通过new关键字来创建新的对象,那么这个类的构造函数应该被private关键字修饰,并且提供一个方法,给外界提供一个使用该对象的方式,那么由于在类外面不可以创建对象,所以,这个提供对象的方法必须被静态修饰。单例设计模式分为两种:懒汉式和饿汉式。如下所示
1)懒汉式
代码体现:
class Single
{
private Single() //为保证对象的唯一,禁止再创建对象
{
}
private static Single single = new Single();//创建一个唯一存在的对象
public static Single getInstance()//提供访问这个唯一对象的方式
{
return single;
}
}
特点: 这种单例设计模式称为懒汉式。在调用getInstance()方法时,这唯一对象的就创建好了,直接拿到使用。这种思想是空间换时间-----对象早早的建立好存放好,来拿的时候直接拿走。
2)饿汉式
代码体现:
class Single
{
private Single()//构造函数私有,防止建立额外的对象
{
}
private static Single single = null;
public static Single getInstance()//对外提供访问这个唯一对象的方式
{
if(single == null )
{
synchronized()
{
if(single == null)
single = new Single();
}
}
return single;
}
}
特点:这种单例设计模式的特点是当通过对外提供的取得单例的方式获取对象时,先判断对象时候存在,如果不存在,那么就创建一个,否则直接使用已经存在的对象。但是,if(single == null )这句话容易出现并发操作,如果两个线程同时来取对象,判断条件为null,那么就会创建多个对象,所以当判断条件后,再使用一个同步代码块来实现线程的同步,再在里面使用if判断,来判断对象是否存在。这种使用双重if判断以及使用同步关键synchronized的方式可以稍微提高一下效率。 这种单例模式设计的思想是:时间换空间。当通过getInstance()来取对象时,才创建实例,这样可以节省空间,但是效率略低。