java基础--笔记7

来源:互联网 发布:spark大数据分析 pdf 编辑:程序博客网 时间:2024/06/04 19:29

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

     }
}
0 0