主函数:是一个特殊的函数。作为程序的入口,可以被jvm调用。
主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了
void:主函数没有具体的返回值。
main:不是关键字。但是是一个特殊的单词,可以被jvm识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是个字符串,字符串类型的数组。
主函数是固定格式的:jvm识别。只有args可以改,其他的不能改。
jvm在调用主函数时,传入的是new String[0];
什么时候使用静态?
要从两方面下手,因为静态修饰的内容有成员变量和函数。
什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在与堆内存中。
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),该功能可以定义成静态的。
静态的应用:
每一个应用程序都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
将方法都静态后,,可以方便使用,,但是该类还是可以被其他程序建立使用的。为了更为严谨,强制让该类不能建立对象,可以通过将构造函数私有化完成。
静态变量和成员变量区别:
1,初始化时间不同
静态变量在类加载的时候就会被初始化。成员变量会在对象创建的时候在堆内存中进行初始化
2,在内存中位置不同
静态变量在方法区的静态区中,而成员变量在堆内存中。
3,它们的生命周期异同
静态变量会在类加载的时候进入静态区,并且初始化,在程序结束的时候,才消失。
成员变量会在对象创建时产生,在对象被垃圾回收器回收后消失。
4,调用方式不同
如果静态变量权限足够大,可以通过类名直接调用
成员变量只能通过对象去调用
文档说明书的制作
类要是public。不然无法制作
静态代码块:
格式:static
{
静态代码块的执行语句;
}
特点:随着类的加载而执行,只执行一次,优先于主函数执行
给类进行初始化(给类中所有静态变量进行初始化)在静态变量显示初始化之后执行。
静态代码块的应用场景:类不需要创建对象,但需要初始化,这时可以将部分代码存储到静态代码块中
Person p = new Person("zhangdan",20);
这句话执行的操作:
1,因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
2,执行该类中的ststic代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性,并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址赋值给栈内存中的p变量。
构造代码块:
构造代码块,位于类的成员位置上
{
}
作用:给所有对象进行初始化,对象一建立就运行。而且优先于构造函数运行。
和构造函数v造代码块是给所有对象进行统一初始化。
而构造函数是给对应对象(调用它的那个函数)进行初始化。
构造代码块中定义的是不同对象共性的初始化内容。
局部代码块 在方法内
{
i= 3;
}
可以控制i变量的生命周期,运行完,这个代码,i就从内存消失了,下面的程序就加载不到了。
对象的初始化过程:
1、首先会加载StaticCode.class文件。加载的过程中,构造函数,一般函数,普通的成员变量,都会加载到方法区中的StaticCode所在的那里class文件的区域中。而所有的静态都会被加载到方法区的静态区中。
2、所有的静态变量加载完成之后,开始对所有的静态变量进行显示的初始化。
3、静态变量显示初始化结束之后,静态代码块开始执行。
4、静态代码块执行完成之后,类的加载结束。
5、开始在堆中创建StaticCode对象。
6、对象中的所有成员变量默认初始化
7、构造函数压栈
7.1 隐式的super找父类进行初始化(后期学习)
7.2 成员变量显示初始化
7.3构造代码块执行
7.4 构造函数里面的代码执行
8、对象在堆中创建完成,把内存地址赋值给sc引用变量。
设计模式:在日常生活中总结出来的一套行之有效的解决问题的方案。
java中有23中设计模式。
单例(原子)设计模式:
单例的书写步骤
1,私有构造函数
2,创建本类对象,并且私有这个引用变量
3,对外提供访问本类对象的方法,这个方法一定要静态。权限足够大。
单例:保证只有一个实例(只有一个对象)
class Single 饿汉式
{
//私有构造函数
private Single()
{
}
//创建本类对象
private static final Single instance = new Single();
//对外提供访问本类对象的方法
public static Single getInstance() //对调用者可控
{
return instance;
}
}
*/
// 延时加载 懒汉式
class Single
{
// 私有构造函数
private Single(){}
//创建本类的引用
private static Single instance = null;
// 对外提供访问本类对象的方法
public static Single getInstance()
{
if( instance == null ) //这里存在线程的安全问题。
{
instance = new Single();
}
return instance;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single s = Single.getInstance();
Single s2 = Single.getInstance();
// Single s = Single.instance;
// Single s2 = Single.instance;
System.out.println("s="+s);
System.out.println("s2="+s2);
}
}