static关键字修饰
-
类变量 :类变量.静态变量
-
类方法 : 类名称.类方法
-
类成员不能直接访问非类成员
原因:因为在内存中先有静态内容,后有非静态内容
-
静态方法中不能使用this关键字
原因:this表示当前对象,通过谁调用谁的方法,谁就是对象,而static 表示这个类,不属于任何对象,
-
静态代码块
静态代码块只执行一次,静态内容总是优先非静态,所以静态代码块比构造方法先执行,
static关键字修饰成员代码实例
static 关键字修饰成员变量
package java_myStudent;
public class Student {
// 成员变量
private String name;
private int age;
// 如果一个成员变量使用了static关键字,那个这个变量不在属于对象自己,而属于所有类。多个对象共享一份数据
static String room; //所在教师
// 无参的构造方法
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;
}
}
package java_myStudent;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Student one = new Student("郭靖",19);
Student two = new Student("黄蓉",20);
one.room = "101教室";
System.out.println("姓名:" + one.getName() + ",年龄" + one.getAge() + ",所在教室" + one.room);
System.out.println("姓名:" + two.getName() + ",年龄" + two.getAge() + ",所在教室" + two.room);
}
}
姓名:郭靖,年龄19,所在教室101教室
姓名:黄蓉,年龄20,所在教室101教室你可以发现,只给one.room赋值了,对two.room并没赋值,在打印输出结果时,也可以输出101教师,说明,room成员变量共享了
static关键字修饰成员方法
package java_myStudent;
public class MyClass {
public void method(){
System.out.println("这是一种普通的成员方法");
}
public static void methodStatic(){
System.out.println("这是一个静态方法");
}
}
package java_myStudent;
import java.util.Scanner;
/*
* 一旦使用static修饰成员方法,那么这成为了静态方法,静态方法不属于对象,而属于类
* 如果没有static,必须首先创建对象,然后通过对象才可以使用他,
* 如果有static关键字,那么既可以通过对象来调用,也可以通过类名来调用
* */
public class test {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.method();
obj.methodStatic(); //正确,但不推荐
MyClass.methodStatic(); //正确,并推荐
}
}
这是一种普通的成员方法
这是一个静态方法
这是一个静态方法
无论是成员变量,还是成员方法,如果有了static,都推荐使用类名称直接来调用,
静态变量:类名称.静态变量
静态方法:类名称.静态方法();
注意:
静态不能直接访问非静态
原因:因为在内存中是先有的静态内容,后有非静态内容,
静态方法中不能使用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象,而static正好代表这个对象,这样他们就矛盾了。
static内存图
静态代码块
静态代码块格式:
/*
特点:静态代码块只执行唯一的一次,
静态内容总是优先于非静态,所以静态代码块比构造方法先执行
用来一次性的对静态成员变量进行赋值
*/
public class 类名称{
static{
//静态代码块内容
}
}
package java_myStudent;
public class MyClass {
static {
System.out.println("执行了静态代码块!");
}
public MyClass() {
System.out.println("执行了构造方法!!");
}
}
package java_myStudent;
public class test {
public static void main(String[] args) {
MyClass obj1 = new MyClass();
System.out.println("==============");
MyClass obj2 = new MyClass();
}
}
执行了静态代码块!
执行了构造方法!!
====================
执行了构造方法!!