JAVA_DAY06(static/javadoc/静态代码块/对象初始化/单例模式)

1.static关键字

static country="CN"

特点:
static定义的变量不在堆内存中,节省内存空间
可用于修饰成员(成员变量,成员函数)
除了被对象调用共享,还可被类名调用
优先于对象而存在
随着类的加载而加载,随着类的消失而消失,说明其生命周期最长

class Person{
    String name;//成员变量,实例变量
    static String country = "CN";//静态的成员变量,类变量
}

实例变量与类变量区别:
①存放位置
类变量随着类的加载而存在于方法区
实例变量随着对象的建立二存在于堆内存
②生命周期
类变量生命周期最长,与类同步
实例变量与对象同步
使用注意事项
①静态方法只能访问静态成员,非静态方法不限
②静态方法不可以定义this,super关键字(因其优先于对象存在 )

2.方法区/共享区/数据区

包含static变量 方法

3.主函数

可以重载,只有main(String [] args)可以被jvm识别
jvm调用主函数时,传入的是new String[0];

4.静态的应用:工具类

当编译ToolDemo文件时,系统会自动编译文件中调用的其他类文件
当工具类class文件不在当前文件夹时,需设定路径
此种情况下,虚拟机只会将myclass作为当前文件夹,无视其他文件夹

set classpath=c:\myclass

加分号后,首选当前文件夹,寻找不到才去myclass

set classpath=.;c:\myclass

上述为Windows下操作方法
若为Linux系统环境,编译命令为

javac -classpath .:/home/myclass ArrayToolDemo.java

此时编译成功,执行命令为
java ArrayToolDemo
此时会报错:

Exception in thread "main" java.lang.NoClassDefFoundError: ArrayTool

因为执行命令时也要将所有路径包含进去,即

java -classpath .:/home/myclass ArrayToolDemo

注意Windows系统是分号为分隔符,而Linux系统为冒号

5.java帮助文档制作

只有public类或方法才会被文档化
/**
这是一个可以对数组进行操作的工具类,该类中提供了获取最值,排序等功能。
@author Anderson
@version “1.8.0_131”
*/
/**
取最大值及其坐标,考虑数组仅有一个元素的情况
@param arr 接收一个int类型的数组
@return result 返回一个int类型数组,数组第一位存放最大值,第二位存放最大值坐标
*/

javadoc -d apidoc -encoding UTF-8 -charset UTF-8 -author -version ArrayTool.java

-d apidoc 表示文件存储路径,不存在会自动创建
-encoding UTF-8 -charset UTF-8 为了防止中文乱码
-author -version 加上的话会显示作者和版本号,默认不显示

6.静态代码块

静态代码块随着类的加载而加载,优先于main函数运行
且值执行一次,用于给类初始化

7.构造函数

一个类中默认有一个空参数的构造函数,其权限与所属类一致
若类被public修饰,则默认的构造函数也被public修饰
若在代码块中定义了构造函数,则不为默认空参构造函数

8.对象的初始化过程

代码块优先级为:静态代码块>main函数>默认初始化>构造代码块>构造函数初始化
对象初始化顺序:

  • 默认初始化
    如name age等属性,缺省值为null 0
  • 构造代码块初始化
    没有加static关键字,仅有{},每次创建对象时都会被调用
  • 构造函数初始化
Person p=new Person("zhangsan",20);

该语句的执行过程为:

  • 因为用到了Person.class,所以会先找到Person.class文件并加载到内存中
  • 若类中有静态代码块,进行类的初始化
  • 上述为只与类有关的过程,接下来与对象有关
  • 在堆内存中开辟空间,分配内存地址
  • 在堆内存中建立对象的特有属性,进行默认初始化(如name age等,均为默认值null )
  • 对属性进行显式初始化(如代码为int age=2,在这一步才将age赋值为2)
  • 对对象进行构造代码块初始化
  • 对对象对应的构造函数进行初始化
  • 将内存地址赋给栈内存中的p变量

9.单例设计模式

定义:解决一个类在内存中只存在一个对象的问题

为了保证对象的唯一

  1. 为了避免其他程序过多建立该类对象,首先禁止其他程序建立该类对象(构造函数私有化)
  2. 为了让其他程序可以访问到该类对象,在本类中自定义一个对象(在类中创建一个本类对象)
  3. 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(提供一个方法可以获取到该对象)

    具体实现代码如下:

/*
饿汉式 方便安全
先初始化对象
Single类一进入内存,就已经创建好了对象
*/
class Single{
    private Single(){}
    private static Single s=new Single();
    public static Single getInstance(){
        return s;
    }
}

class SingleDemo{
    Single s1=Single.getInstance();
    Single s2=Single.getInstance();
    s1.setNum(23);//此时s2的num也为23
}

/*
懒汉式 有安全隐患
对象被方法调用是才进行初始化,也叫做对象的延时加载
当Single类进内存,对象还不存在,只有调用了getInstance方法,才建立对象
class Single{
    private Single(){}
    private static Single s=null;
    public static Single getInstance(){
        if(s==null){
            /*
            -->A 可能有A B 均为调用该类,而CPU执行时卡在这里
            -->B 此时B执行也卡在这里,又轮到A执行然后B执行,创建了两    
            个对象
            */
            s=new Single();
            return s;
        }
    }
}

你可能感兴趣的:(java,学习笔记)