static country="CN"
特点:
static定义的变量不在堆内存中,节省内存空间
可用于修饰成员(成员变量,成员函数)
除了被对象调用共享,还可被类名调用
优先于对象而存在
随着类的加载而加载,随着类的消失而消失,说明其生命周期最长
class Person{
String name;//成员变量,实例变量
static String country = "CN";//静态的成员变量,类变量
}
实例变量与类变量区别:
①存放位置
类变量随着类的加载而存在于方法区
实例变量随着对象的建立二存在于堆内存
②生命周期
类变量生命周期最长,与类同步
实例变量与对象同步
使用注意事项
①静态方法只能访问静态成员,非静态方法不限
②静态方法不可以定义this,super关键字(因其优先于对象存在 )
包含static变量 方法
可以重载,只有main(String [] args)可以被jvm识别
jvm调用主函数时,传入的是new String[0];
当编译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系统为冒号
只有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 加上的话会显示作者和版本号,默认不显示
静态代码块随着类的加载而加载,优先于main函数运行
且值执行一次,用于给类初始化
一个类中默认有一个空参数的构造函数,其权限与所属类一致
若类被public修饰,则默认的构造函数也被public修饰
若在代码块中定义了构造函数,则不为默认空参构造函数
代码块优先级为:静态代码块>main函数>默认初始化>构造代码块>构造函数初始化
对象初始化顺序:
Person p=new Person("zhangsan",20);
该语句的执行过程为:
定义:解决一个类在内存中只存在一个对象的问题
为了保证对象的唯一
为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(提供一个方法可以获取到该对象)
具体实现代码如下:
/*
饿汉式 方便安全
先初始化对象
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;
}
}
}