1 static关键字概述
2 静态static关键字修饰成员变量
2.1
- 定义一个学生类
public class Student {
private String name;
private int age;
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;
}
}
- 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
*/
public class Demo01StaticField {
public static void main(String[] args) {
Student one = new Student("郭靖",19);
one.room = "101教室";
System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room);//姓名:郭靖,年龄:19 101教室
Student two = new Student("黄蓉",16);
System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room);//姓名:黄蓉,年龄:16 101教室
//这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
}
}
2.1
- 定义类
public class Student {
private int id;//学号
private String name;//姓名
private int age;//年龄
static String room;//所在教室
private static int idCounter = 0;//学号计数器,每当new了一个新对象的时候,计数器++
public Student() {
//idCounter++;也可以写成下面的样子。
this.id = ++idCounter;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
this.id = ++idCounter;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
- 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
*/
public class Demo01StaticField {
public static void main(String[] args) {
Student one = new Student("郭靖",19);
one.room = "101教室";
System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room
+ ", 学号:" + one.getId());//姓名:郭靖,年龄:19 101教室, 学号:1
Student two = new Student("黄蓉",16);
System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room
+ ", 学号:" + two.getId());//姓名:黄蓉,年龄:16 101教室, 学号:2
//这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
}
}
3 静态static关键字修饰成员方法
3.1
- 定义类
public class MyClass {
public void method(){
System.out.println("这是一个成员方法");
}
//静态方法
public static void methodStatic(){
System.out.println("这是一个静态方法");
}
}
- 使用
/*
一旦使用了static修饰成员方法,那么就成为了静态方法。静态方法不属于对象而是属于类的。
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用
静态变量:类名称.静态变量
静态方法:类名称.静态方法()
*/
public class Demo02StaticMethod {
public static void main(String[] args) {
//1. 对于成员方法
MyClass obj = new MyClass();//首先创建对象
//然后才可以使用没有static关键字的内容
obj.method();//这是一个成员方法
//2. 对于静态方法,可以通过对象名进行调用,也可以直接通过类名称来调用
obj.methodStatic();//这是一个静态方法
MyClass.methodStatic();//这是一个静态方法
//3. 对于自己的方法
//对于本类当中的静态方法,可以神略类名,以下两种调用方法完全等效
myMethod();//自己的方法!
Demo02StaticMethod.myMethod();//自己的方法!
}
public static void myMethod(){
System.out.println("自己的方法!");
}
}
3.2 注意事项
/*
注意事项:
1. 静态不能直接访问非静态
原因:原因:因为在内存中是先有了静态内容,后有了非静态内容。“先人不知道后人,但是后人知道先人”
2. 静态方法当中不能用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。
*/
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);//报错
//静态方法中不能使用this关键字
System.out.println(this);//报错
}
}
4 静态static的内存图
依然用之前的学生类
public class Demo03StaticStudent {
public static void main(String[] args) {
//首先设置一下教室,这是静态的东西,应该通过类名称经行调用
Student.room = "101教室";
Student one = new Student("郭靖",20);
System.out.println("one的名字是:" + one.getName());//one的名字是:郭靖
System.out.println("one的年龄是:" + one.getAge());//one的年龄是:20
System.out.println("one的教室是:" + Student.room);//one的教室是:101教室
Student two = new Student("黄蓉",18);
System.out.println("two的名字是:" + two.getName());//two的名字是:黄蓉
System.out.println("two的年龄是:" + two.getAge());//two的年龄是:18
System.out.println("two的教室是:" + Student.room);//two的教室是:101教室
}
}
- 在方法区当中有一块独立的空间叫做静态区,专门用来存储静态static数据
- 由Student.room到Student类里去找room,再到静态区找到101教室
5 静态代码块
/*
静态代码块特点:当第一次使用到本类时,静态代码块执行唯一的一次。
静态内容总是优先于非静态,所以静态代码块比构造方法先执行.
静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值
*/
public class Demo04Static {
public static void main(String[] args) {
Person one = new Person();
//静态代码块执行了
//构造方法执行了!
Person two = new Person();
//构造方法执行了!
}
}
原文地址:https://www.cnblogs.com/deer-cen/p/12229115.html
时间: 2024-10-10 16:57:11