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.单例设计模式
定义:解决一个类在内存中只存在一个对象的问题
为了保证对象的唯一
- 为了避免其他程序过多建立该类对象,首先禁止其他程序建立该类对象(构造函数私有化)
- 为了让其他程序可以访问到该类对象,在本类中自定义一个对象(在类中创建一个本类对象)
为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(提供一个方法可以获取到该对象)
具体实现代码如下:
/*
饿汉式 方便安全
先初始化对象
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;
}
}
}