⭐️前言⭐️
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
📍内容导读📍
- Java之static成员与代码块
- 1.static成员
- 🍅1.1 static修饰成员变量
- 🍅1.2 static修饰成员方法
- 🍅1.3 static成员变量初始化
- 2. 代码块
- 🍅2.1 代码块概念及分类
- 🍅2.2 代码块示例
Java之static成员与代码块
1.static成员
🍅1.1 static修饰成员变量
假设学生类中有姓名、分数、年龄、班级等属性,但这两个同学都在同一个班级里。
在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。
class Student {
String name;
double score;
int age;
static String classes="1";
public Student(String name, double score, int age) {
this.name = name;
this.score = score;
this.age = age;
}
}
public class Demo1 {
public static void main(String[] args) {
Student s1=new Student("小明",88.0,18);
Student s2=new Student("小红",89.2,19);
}
}
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
🍅1.2 static修饰成员方法
class Student {
//......
public static void staticFunc() {
System.out.println("这是一个静态方法!");
}
}
public class Demo1 {
public static void main(String[] args) {
Student.staticFunc();
}
}
//这是一个静态方法!
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
- 不能直接在静态方法中访问任何非静态成员(可以通过实例化对象或者传参的方式获取非静态成员属性)
🍅1.3 static成员变量初始化
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
- 就地初始化
就地初始化指的是:在定义时直接给出初始值
class Student {
String name;
double score;
int age;
static String classes="1";
//.....
}
- 静态代码块初始化
那什么是代码块呢?继续往后看 😃
2. 代码块
🍅2.1 代码块概念及分类
使用 {}
定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
- 本地代码块
- 实例代码块
- 静态代码块
- 同步代码块(后续讲解多线程部分再谈)
🍅2.2 代码块示例
class Student {
String name;
double score;
int age;
static String classes="1";
public Student(String name, double score, int age) {
this.name = name;
this.score = score;
this.age = age;
System.out.println("构造方法!");
}
static {
classes="2";
System.out.println("静态代码块!");
}
{
this.age=20;
System.out.println("实例代码块!");
}
}
public class Demo1 {
public static void main(String[] args) {
Student s1=new Student("小明",91.2,19);
System.out.println("===================");
Student s2=new Student("小王",90,19);
{
System.out.println("本地代码块!");
}
}
}
//
静态代码块!
实例代码块!
构造方法!
===================
实例代码块!
构造方法!
本地代码块!
本地代码块:定义在方法中的代码块(比较少用)
实例代码块:定义在类中的代码块(不加修饰符)。一般用于初始化实例成员变量。
静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
注意事项:
- 先执行静态的【加载了类就会被执行】
如果有多个静态的,看定义顺序,按顺序执行
如果没有实例化对象,那么只会执行静态的
class Student {
String name;
double score;
int age;
static String classes="1";
public Student(String name, double score, int age) {
this.name = name;
this.score = score;
this.age = age;
System.out.println("构造方法!");
}
static {
classes="2";
System.out.println("静态代码块!");
}
{
this.age=20;
System.out.println("实例代码块!");
}
}
public class Demo1 {
public static void main(String[] args) {
System.out.println(Student.classes);
}
}
//
静态代码块!
2
静态的只会执行一次
- 再执行实例的数据【有多个实例的话要看定义的顺序】
- 最后执行构造函数