【Java基础】static关键字
一、static修饰成员变量
定义一个学生类,其中grade使用static修饰
public class Student { private String name; private int age; static String grade;//所在班级 public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
创建Student对象,且只对其中一个对象的grade赋值,此时第二个对象的grade会自动赋值
/* 一旦使用static关键字,那么这个变量不再属于对象自己,而是属于所在的类 即多个对象共享同一份数据 */ public class Demo01StaticField { public static void main(String[] args) { Student one = new Student("郭靖",19); //只对one的属性进行赋值 one.grade = "三年二班"; System.out.println("姓名:" + one.getName() + " 年龄:" + one.getAge() + " 班级:" + one.grade); Student two = new Student("黄蓉",18); System.out.println("姓名:" + two.getName() + " 年龄:" + two.getAge() + " 班级:" + two.grade);//two的属性值此时也会自动赋值 } }
二、static修饰成员方法
public class MyClass { int num;//成员变量 static int numStatic;//静态变量 //成员方法 public void method(){ System.out.println("这是一个普通的成员方法"); //成员方法可以直接使用成员变量 System.out.println(num); //成员方法可以直接使用静态变量 System.out.println(numStatic); } //静态方法 public static void methodStatic(){ System.out.println("这是一个静态方法"); //静态方法可以直接使用静态变量 System.out.println(numStatic); //静态方法不能直接使用成员变量 //System.out.println(num); } }
/* 一旦使用static修饰成员方法,那么此方法就成为了静态方法; 静态方法不属于对象,而是属于类的 如果没有static关键字,必须首先创建对象,通过对象才能使用该方法 如有有static关键字,那么不需要创建对象,直接通过类名称来使用该方法 注意事项: 1、静态不能直接访问非静态 原因:内存中是 先有 静态内容,后有 非静态内容 2、静态方法中不能用this */ public class Demo02StaticMethod { public static void main(String[] args) { //创建Myclass对象 MyClass obj = new MyClass(); //通过对象调用成员方法 obj.method(); //调用静态方法,可以通过对象名调用(不推荐),也可以通过类名来调用 obj.methodStatic();//正确,但不推荐 MyClass.methodStatic();//推荐写法 //对于本类当中的静态方法,可以省略类名称 myMethod(); Demo02StaticMethod.myMethod(); } public static void myMethod(){ System.out.println("这是一个本类中的静态方法"); } }
三、静态代码块
/* public class 类名称{ static{ 代码块内容 } } 特点: 执行唯一的一次; 静态内容总是优先于非静态 典型用途:用来一次性地对静态变量进行赋值 */
示例:
public class Person { static { System.out.println("静态代码块执行啦"); } public Person(){ System.out.println("构造方法执行啦"); } }
public class Demo03Static { public static void main(String[] args) { Person one = new Person(); Person two = new Person(); } }
执行结果:
静态代码块执行啦
构造方法执行啦
构造方法执行啦
根据执行结果可以说明:1、静态代码块优先执行;2、静态初始化块只在类加载时执行一次,所以当再次创建对象 two 时并未执行静态初始化块。
万丈高楼平地起。