主函数:是一个特殊的函数。作为程序的入口,可以被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); 
  

      } 
  
 }