静态成员
静态数据成员是属于类的,并且为这个类所有对象共享,只占一块内存空间、
随着类的加载而先创建出来,然后对象才被创建出来。
一般是通过类名去访问去访问、修改,不推荐,(因为如果用对象去访问,结果可能被覆盖,后续可能混淆,找不出问题。)
private static String library;
School.library="栋梁图书馆"; (School是对象 s1是library School.library是静态变量)
School s1=new School("第一中学:",3000);
public class School{
//成员属性
private String name; //学校名字
private int num; //学生人数
private static String library; //图书馆名字 //私有
}
静态方法
可以使用类名调用(推荐),也可以使用对象调用
public static void test(){
}
静态方法和普通方法的区别
1.静态方法只能访问静态成员变量
2.非静态方法能访问静态成员变量,也能访问非静态成员变量
3.静态方法没有this关键字
//成员方法get,set
public static String getLibrary(){
return library;
}
public static void setLibrary(String library){
//静态方法中没有this关键字
School.library=library;
}
尽量不要在构造器中操作静态成员变量
// 全参构造器
public School(String name,int num){
this.name=name;
this.num=num;
//this.library=library; 不可以
//School.library="你好图书馆";
}
静态代码块
代码块
在java中用{}括起来的代码叫代码块,
分类:1.局部代码块
位置:类的方法中定义的
{
语句体;
}
作用:限定变量的生命周期,尽早释放,遇到}时释放,提高内存效率
2.构造代码块
位置:类中 方法外
{
语句体;
}
作用:可以把构造方法中,相同的代码提取到这里,提高代码的复用性
特点:构造方法执行前会执行他
系统默认的构造方法执行前会执行他
3. 静态代码块
位置:类中 方法外
static {
语句体;
}
作用:可以在类加载时 给静态成员变量赋值
特点:类加载的时候会执行,只执行1次
不能访问普通成员变量
静态代码块和构造代码块都有时,静态代码先执行
静态代码块和我们显示的声明静态变量谁在前面谁先执行
(举例)全部代码
public class School{
//成员属性
private String name; //学校名字
private int num; //学生人数
private static String library; //图书馆名字 //私有
// public static String library; //公有
static{
System.out.println("静态代码块执行");
library="栋梁图书馆2";
}
//成员方法get,set
public static String getLibrary(){
return library;
}
public static void setLibrary(String library){
//静态方法中没有this关键字
School.library=library;
}
//构造器
//无参构造器
public School(){
}
//全参构造器
// public School(String name,int num,String library){
// this.name=name;
// this.num=num;
// this.library=library;
// 全参构造器
public School(String name,int num){
this.name=name;
this.num=num;
//this.library=library; 不可以
//School.library="你好图书馆";
}
public void show(){
System.out.println("学校名称:"+name+"学生数量"+num+"图书馆名称:"+School.library);
}
}
public class TestSchool{
// main
public static void main(String[] args){
// School.library = "栋梁图书馆";
School.setLibrary("栋梁图书馆");
System.out.println("School.getLibrary():"+School.getLibrary());
// 创建一个学校的对象
School s1 = new School("第一中学",3000);
s1.show();
// s1.setLibrary("第一中学图书馆");
School s2 = new School("秀峰中学",2500);
s2.show();
// School s3 = new School("娄江中学",1800);
// s3.show();
// s3.library = "启强图书馆";
// System.out.println("s3.library:"+s3.library);
}
}
运行结果
静态代码块执行
School.getLibrary():栋梁图书馆
学校名称:第一中学学生数量3000图书馆名称:栋梁图书馆
学校名称:秀峰中学学生数量2500图书馆名称:栋梁图书馆