外贸企业网站,金湖县网站建设,wordpress本地从服务器,wordpress 优秀static也叫静态#xff0c;可以修饰成员变量、成员方法。
成员变量
按照有无static分为两种#xff1a;
类变量#xff1a;static修饰#xff0c;属于类#xff0c;与类一起加载一次#xff0c;在内存中只有一份#xff0c;会被类的全部对象共享实例变量#xff08;…static也叫静态可以修饰成员变量、成员方法。
成员变量
按照有无static分为两种
类变量static修饰属于类与类一起加载一次在内存中只有一份会被类的全部对象共享实例变量对象变量无static修饰属于每个对象的。
代码举例
//先创建一个学生类
public class Student {//类变量static String name;//实例变量对象变量int age;}//测试
public class Test {public static void main(String[] args) {//1、类变量的使用//类名.类变量Student.name袁华;//对象.类变量不推荐Student s1new Student();s1.name马冬梅;Student s2new Student();s1.name秋雅;System.out.println(s1.name); //输出秋雅System.out.println(Student.name); //输出秋雅//2、实例变量的使用属于每个对象的变量//对象、实例变量(不能通过类名.变量名访问)s1.age23;s2.age18;System.out.println(s1.age); //输出23System.out.println(s2.age); //输出18}
} 一开始先将Test.class加载到方法区然后main方法入栈运行到Student.name张三会将Student.class加载到方法区并检查是否有类变量如果有也会将类变量立即加载到堆内存中初始值为null然后赋值成 袁华 然后在堆内存中创建学生对象学生变量s1指向这个对象然后执行 s1.name“马冬梅” 会在s1指向的对象中去寻找这个变量如果没有这个变量则通过类的地址去寻找Student.class然后通过这个寻找到name并赋值成 “马冬梅” 同理s2的创建和修改和上面一样 最后s1和s2的name都指向同一个所以最后输出的名字都是“秋雅”。
下面再看实例变量age的变化
s1.age23会通过s1找到第一个学生对象将其变量age的值改为23同理s2也是如此 类变量的应用场景 在开发中如果某个数据只需要一份且希望能够被共享(访问、修改)则该数据可以定义成类变量来记住。例如一个类可以记住自己创建了多少个对象如下图 成员方法
按照有无static分为两种
类方法static修饰属于类实例方法无static修饰属于每个对象的。
代码举例
public class Student {double score;//类方法public static void printHelloWorld(){System.out.println(Hello World);}//实例方法public void printPass(){System.out.println(成绩(score60?及格了:没及格));}
}//测试
public class StaticTest {public static void main(String[] args) {//1、类方法的使用//类名.类方法Student.printHelloWorld();//对象.类方法不推荐Student s1new Student();s1.printHelloWorld();//2、实例方法的使用属于每个对象的方法//对象.实例方法(不能通过类名.方法名访问)s1.printPass();}
}
一开始先将Test.class加载到方法区然后main方法入栈运行到Student.printHelloWorld()会将Student.class加载到方法区然后通过学生类找到printHelloWorld()方法进行打印 然后在堆内存中创建学生对象学生变量s1指向这个对象然后执行 s1.printHelloWorld() 时会通过s1找到它指向的学生对象然后通过学会对象找到Student这个类通过这个类找到这个printHelloWorld()方法 。如图 实例方法也是如此但它会访问这个对象的一些变量所以不能通过类名调用(通过类名调用就不知道访问哪个对象的变量了)。
补充main方法也是类方法也是通过类名.main进行调用的
应用场景
类方法最常见的应用场景是做工具类提高了代码复用调用方便提高了开发效率
注意事项
1. 类方法中可以直接访问类成员不可以直接访问实例成员
public class Student {static String schoolname;//类变量double score;//实例变量//类方法public static void printHelloWorld(){//同一个类中访问类成员可以省略类名schoolname张三;printHelloWorld2();
// score12.0;//报错
// printPass();//报错}//类方法public static void printHelloWorld2(){System.out.println(Hello World);}//实例方法public void printPass(){System.out.println(成绩(score60?及格了:没及格));}
}
2. 实例方法中既可以直接访问类成员也可以直接方法实例成员
public class Student {static String schoolname;//类变量double score;//实例变量//类方法public static void printHelloWorld2(){System.out.println(Hello World);}//实例方法public void printPass(){schoolname李四;printHelloWorld2();printPass2();System.out.println(score);}//实例方法public void printPass2(){}
}
3. 实例方法中可以出现this关键字类方法中不可以出现this关键字
因为实例方法用this时会拿到这个对象而类方法拿不到对象
应用知识
1. 代码块
代码块是类的5大成分之一成员变量、构造器、方法、代码块、内部类。
代码块分为两种
静态代码块 格式static{}特点类加载时自动执行由于类只加载一次所以静态代码块也只会执行一次作用完成类的初始化例如对类变量的初始化赋值。 public class Student {static int number80;static{System.out.println(静态代码块执行了);}
}
//测试
public class StaticTest {public static void main(String[] args) {System.out.println(Student.number);}
}//输出静态代码块执行了
80 实例代码块 格式{}特点每次创建对象时执行实例代码块并在构造器前执行作用和构造器一样都是用来完成对象的初始化的。例如对实例变量进行初始化赋值
2. 单例模式
确保一个类只有一个对象
写法
把类的构造器私有定义一个类变量记住类的一个对象定义一个类方法返回对象 public class A {//2.定义一个类变量记住类的一个对象private static A anew A();//1.私有类的构造器private A() {}//3.定义一个类方法返回对象public static A getObject(){return a;}
} 实现方式
饿汉式单例拿到对象时对象早已经创建好了。上面便是。懒汉式单例拿到对象时才开始创建对象。 public class B {//1.类的构造器私有private B() {}//2.定义一个类变量用户存储这个类的一个对象private static B b;//3.定义一个类方法要保证第一次调用时才创建一个对象后面调用时都会用这同一个对象public static B getObject(){if(bnull){bnew B();}return b;}
}