同一个类中,访问其类成员,可以省略类名不写
static:叫静态,可以修饰成员变量,成员方法。
成员变量按照有无static修饰,分为两种:
类变量:有static修饰,属于类;在计算机中只有一份,会被类的所有对象共享;
类名.类变量
实例变量(对象的变量):无static修饰,属于每个对象,每个对象都会一份;
实例变量只能通过对象访问
创建一个学生类:
cpp
public class student {
static String name;//类变量
int age;//实例变量(对象变量)
}
进行操作:
cpp
public class test1 {
public static void main(String[] args) {
//1:类变量的用法
//类名.类变量
student.name="hhh";
//对象名.类变量
student s1=new student();
s1.name="xxx";
student s2=new student();
s2.name="aaa";
类变量在计算机中只有一份
System.out.println(s1.name);//aaa
System.out.println(student.name);//aaa
}
}
类变量的应用场景:
在开发中,如果某个数据只需要一份,且希望能够被共享,则该数据可以定义类变量记住。
成员方法:
类方法:有static修饰的成员方法,属于类。
实例方法:无static修饰的成员方法,属于对象。
类方法的使用场景:
用来做工具类。
工具类就是一些类方法,每个方法都是用来完成一个功能的。
这是我写了一个生成任意数验证码的工具类:
cpp
public class myutil {
private myutil() {
}//别人不能创建对象
public static String createCode(int n)
{
String tmp="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWSYZ1234567890";
String code="";
Random ra=new Random();
for (int i = 0; i < n; i++) {
int index=ra.nextInt(tmp.length());
code+=tmp.charAt(index);
}
return code;
}
}
类方法不用生成对象占用内存。
static的注意事项:
1 类方法可以直接访问类成员(变量和方法),不可****以直接访问实例成员;
2 实例方法可以直接访问类成员,也可以直接访问实例成员;
3 类方法中不可以出现this关键字,但是实例方法中可以出现this;
代码块:
静态代码块:
格式:static {}
特点:类加载会自动执行,由于类只会加载一次,所以静态代码块只会加载一次1;
作用:完成类的初始化,例如:对类变量的初始化赋值
使用:
定义了一个学生类:
cpp
public class student {
public static int number=10;
static//静态代码块
{
System.out.println("静态代码块执行");
}
}
使用:
cpp
public class test {
public static void main(String[] args) {
System.out.println(student.number);
/*静态代码块执行
10*/
System.out.println(student.number);
//10;
}
}
可以发现静态代码块只执行了一次
实例代码块:
格式:{}
特点:每次创建对象时 ,执行实例代码块,并在构造器前执行
作用:和构造器一样,都是用来完成对象的初始化的。例如:对实例对象进行初始化赋值
单例设计模式:
确保类只有以一个对象;
写法:
- 把类的构造器私有化
- 定义一个类变量记住类的一个对象
- 定义一个类方法,返回对象
创建一个类:
cpp
public class sin {
//1:私有化无参构造器
private sin()
{
}
//2:定义一个类变量记住类的一个对象
private static sin a=new sin();
//定义一个类方法,返回对象
public static sin getsin()
{
return a;
}
}
操作:
cpp
public class test {
public static void main(String[] args) {
//只能通过sin.getsin获取对象,且此对象是static静态的,只有一份,所以是单例模式
//sin a=new sin()//error:'sin()' has private access
//可见不能通过无参构造器创建对象
sin a1 = sin.getsin();
sin a2 = sin.getsin();
System.out.println(a1);
System.out.println(a2);
//结果:
/*com.he.static3.sin@2f4d3709
com.he.static3.sin@2f4d3709*/
}
}
上面这个单例设计模式叫饿汉式单例:返回对象时,对象已经创建好
懒汉式单例设计模式:
写法:
- 把类的构造器私有化
- 定义一个类变量,用于存储对象
- 提供一个类方法,保证返回的是同一个对象
cpp
public class lan {
private lan(){
}
//2定义一个类变量,先不初始化,用于存储对象。
private static lan b;
//3提供一个类方法,保证返回的是同一个对象
public static lan getlan()
{
if(b==null)
{
b=new lan();
}
return b;
}
}