目录
1、什么是static关键字?
它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
2、static的使用和定义格式
静态成员变量是在成员变量前面加上static修饰符,静态成员方法是在成员方法前面加上static修饰符。
静态变量:
static int num2 = 20;
静态方法:
public static void function2(){
System.out.println("function2");
}
3、静态成员的访问特点
3.1、代码演示
public class Student {
int num1=10;
static int num2=20;
/*总结: 非静态成员可以访问静态和非静态成员
* 静态成员可以访问静态成员,但不能访问非静态成员
* */
public void show(){
//非静态成员方法可以访问静态成员方法
funcation2();
//非静态成员方法可以访问非静态成员方法
funcation();
//非静态成员方法可以访问非静态成员变量
System.out.println(num1);
System.out.println(this.num1);
//非静态成员方法可以访问静态成员变量
System.out.println(num2);
}
public static void show2(){
//静态方法可以访问静态成员变量
System.out.println(num2);
//静态方法可以访问静态成员方法
funcation2();
/*
静态中是没有this关键字的 静态是随着类的加载而加载的,this是随着对象的
创建而存在的类比对象先存在
*/
//System.out.println(this.num2);
//静态方法不可以访问非静态成员变量
//System.out.println(num1);
// 静态方法不可以访问非静态成员方法
//funcation();
}
public void funcation(){
System.out.println("funcation...");
}
public static void funcation2(){
System.out.println("funcation2....");
}
}
3.2、 this为什么不能访问静态成员
在静态方法中是没有this关键字的,静态随着类的加载而加载,this是随着对象的创建而存在的。类比对象先存在。
3.3、 特点总结
1、静态成员只能访问静态成员,非静态成员可以访问静态和非静态成员。
2、静态方法中,不能使用this关键字。
4、静态成员调用格式
可以通过类名.静态变量名或类名.静态方法名的形式调用。
4.1、代码演示
public class Student {
//非静态成员变量
int num1=10;
//静态成员变量
static int num2=20;
//非静态成员方法
public void method1(){
System.out.println("非静态成员方法");
}
//静态成员方法
public static void method2(){
System.out.println("静态成员方法");
}
}
public class StudentDemo {
public static void show(){
Student s=new Student();
//非静态变量只能通过创建对象进行调用
System.out.println(s.num1);
//静态变量也能通过变量调用,但是不推荐
System.out.println(s.num2);
//静态变量可以直接通过类名.变量名调用
System.out.println(Student.num2);
//静态方法可以直接通过类名.方法名调用
Student.method2();
//非静态方法只能通过对象名.方法名调用
s.method1();
}
public static void main(String[] args) {
show();
}
}
5、静态的内存位置
小结:
1、静态存储于一块固定的内存区域(静态区),所以,可以直接被类名调用
2、是随着类的加载而加载的,且只加载一次。
3、它优先于对象存在,所以,可以被所有对象共享。
6、静态变量和成员变量的区别***
1、所属不同:静态属于类,所以也称类变量。成员变量属于对象,所以也称实例变量(对象变量)。
2、内存中的位置不同:静态存储在方法区的静态区。成员变量存储在堆内存中。
3、生命周期不同:静态变量随着类的加载而加载,随着类的消失而消失。成员变量随着对象的创建而创建,随着对象的消失而消失。
4、调用不同:静态变量可以通过类名的调用,也可以通过对象的调用。成员变量只能通过对象的调用。
7、静态代码块
7.1、什么是静态代码块?
定义在成员位置,使用static修饰的代码块{}。静态代码块的作用主要是给类变量进行初始化赋值。
7.2、静态代码块的格式
public class ClassName{
static {
// 执行语句
}
}
7.3、代码演示
public class Game {
static String name;
static String type;
//静态代码块 随着类的创建而创建 随着类的消失而消失。 并且只加载一次
static {
name="原神";
type="第三人称";
System.out.println("游戏名:"+name+" 类型: "+type);
}
//构造代码块 随着对象的创建而存在,随着对象的消失而消失。
{
System.out.println("我是构造代码块");
}
}
public class GameTest {
public static void main(String[] args) {
//静态代码块是优于构造代码块的 因为类先于对象存在
Game game=new Game();
}
}