static的介绍
static的意思式静态的,共享的,被static修饰的变量和方法,不在属于直接属于对象,而是直接属于类,会被通过这个类创建的对象所共享。
静态变量
静态变量的介绍
静态变量式类中被static修饰的变量,它定义在类中方法外,静态变量的定义方式如下
修饰符 static 数据类型 变量名
调用方法:类名.变量名
静态变量的的第有两个:1.随着类的加载而加载,随着类的消亡而消亡。2.静态变量都只加载一次。
实例变量,局部变量,静态变量区别
代码中的位置
局部变量:类中的方法内部或声明
实例变量:类中方法外
静态变量:类中方法外
默认值
局部变量:没有默认值
实例变量:有默认值
静态变量:有默认值
内存中的位置:
局部变量:栈内存中
实例变量:堆内存中
静态变量:堆内存中 ==>方法区 ==>静态方法区
代码中的作用域
局部变量:方法中
实例变量:所属类中(静态方法和静态代码除外)
静态变量:所属的类中
内存中的生命周期
局部变量:随着方法的加载而加载,随着方法的出栈而消失
实例变量:随着对象的创建而加载,随着对象的消失而消失
静态变量:随着类的加载而加载,随着类的消失而消失
使用静态变量对学生学号进行自动分配实例:
public class demo02try {
public static void main(String[] args) {
demo02number s1=new demo02number("李四",19);
demo02number s2=new demo02number("张三",18);
demo02number s3=new demo02number("王五",20);
System.out.println("姓名:"+s1.getName()+" "+"年龄"+s1.getAge()+" "+"学号"+s1.getId());
System.out.println("姓名:"+s2.getName()+" "+"年龄"+s2.getAge()+" "+"学号"+s2.getId());
System.out.println("姓名:"+s3.getName()+" "+"年龄"+s3.getAge()+" "+"学号"+s3.getId());
}
}
public class demo02number {
private String name;
private int age;
private int id;
private static int number=21002000;
public demo02number(String name, int age) {
this.name = name;
this.age = age;
}
public demo02number(){
}
{
this.id=number++;//初始化分配学号,number值累加
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getId() {
return id;
}
}
静态方法
静态方法与静态变量相似,又是用static进行修饰。使用静态方法时,不需要创建对象,直接通过类名进行调用。静态方法定义格式:
修饰符 static 返回值类型 方法名(){}
静态方法的注意事项
1.在静态方法或静态代码块中不能使用实例成员(成员:变量或方法)
实例方法调用实例方法(正确)
实例方法调用静态方法(正确)
静态方法调用实例方法(正确)
静态方法调用静态方法(错误)
2.在静态方法或静态代码块中不能使用this关键字和super关键字 。
3.静态方法虽然可以被这个类创建的所有对象所共享,可以通过实例名调用静态方法,但这样不推荐使用。
用静态方法对数组进行变量输出实例:
public class demo02try {
public static void main(String[] args) {
demo02number.prints(1,2,3,4,5,6,7,8);
}
}
public class demo02number {
public static void prints(int ...s){
System.out.print("[");
for (int i = 0; i < s.length; i++) {
if(i==s.length-1){
System.out.println(s[i]+"]");
}else {
System.out.print(s[i]+",");
}
}
}
}
静态代码块
静态代码块
位置:类中,方法外
格式: static{ }
特点和注意事项:
1.随着类的加载而加载,而且只加载唯一一次
2.静态代码块优先于构造器代码块执行,静态代码块随着类的加载而加载
3.在静态代码块中不能使用this 作用: 优先初始化一些变量
单例设计模式
单例设计模式是创建唯一实例的解决思路
设计模式和框架的区别
设计模式:解决某一种问题的特地思路
框架:半成品项目
实现单例设计模式的步骤
1.针对创建唯一对象的类,私有化构造器
2.在这个类中创建唯一的对象,并用静态进行修饰
3.针对创建的唯一对象进行封装的思想,只提供对外获取方式,不提供赋值方式
单例创建模式的分类
立即加载(饿汉式) 1.针对创建唯一对象的类,私有化构造器 2.在这个类中创建唯一的对象,并用静态进行修饰 3.针对创建的唯一对象进行封装的思想,只提供对外获取方式,不提供赋值方式
延迟加载(懒汉式) 1.针对创建唯一对象的类,私有化构造器 2.在这个类中定义唯一的对象,并用静态进行修饰 3.针对创建的唯一对象进行封装的思想,只提供对外获取方式(当第一次获取的时候创建 唯一的对象),不提供赋值方式
单例设计模式实现模板:
public class demo04try {
public static void main(String[] args) {
System.out.println(demo04.getDe());
System.out.println(demo04.getDe());
}
}
public class demo04 {
//private static demo04 de=new demo04();//在这个类中创建唯一的对象,并用静态进行修饰
static demo04 de;
private demo04(){//针对创建唯一对象的类,私有化构造器
}
//饿汉式
/*public static demo04 getDe(){
return de;
}*/
//懒汉式
public static demo04 getDe(){
if(de==null){
de=new demo04();
}
return de;
}
}