1.static 成员(静态成员)
1.1 静态成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共
享的。
static特点:
1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
1.2 静态成员方法
被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。
静态成员一般是通过静态方法来访问的。
静态方法特性
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
public static String getClassRoom(){
System.out.println(this);
return classRoom;
}
// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom(){
age += 1;
return classRoom;
}
// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age
public static String getClassRoom(){
doClass();
return classRoom;
}
// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()
比特就业
2.静态成员变量初始化
* 10.1: 直接赋值初始化 public static String classRoom = "java107";
* 10.2: 默认初始化 public static String classRoom;
* 10.3: 通过构建方法初始化get(),set()
class Date {
public static int year;
public static int month;
public int day;
public void setDate(Date this, int year, int month, int day){
this.day = day;
}
// getMonth()方法进行初始化静态成员变量moth值
public static int getMonth() {
return month;
}
// setMonth()方法进行获取初始化之后的成员变量moth的值
public static void setMonth(int month) {
Date.month = month;
}
}
public class test {
public static void main(String[] args) {
Date date = new Date();
Date.setMonth(1);
}
}
* 10.4: 在构造对象的时候,可以在构造方法中进行赋值 (不建议这样)
* 10.5:通过代码块进行赋值:普通代码块() 构造块 静态块 实例代码块 同步代码块
2.1 代码块概念以及分类
分类:
1.普通代码块
public class Main{
public static void main(String[] args) {
{ //直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
// 执行结果
x1 = 10
x2 = 100
2.构造代码块
定义:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
作用:初始化非静态的数据成员
特点:只有在创建对象的时候才会被调用
class Date {
public static int year;
public static int month;
public int day;
{
// 构造代码块
year = 2021;
month = 2022;
System.out.println("非静态代码块/实例代码块/构造代码块! ->初始化非静态的数据成员");
}
}
public class test {
public static void main(String[] args) {
}
}
3.静态代码块
定义:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量
作用:初始化静态数据的成员,提前准备数据
特点:1.只要类被加载,就要执行静态代码块,再main方法中,不管创建多少个类对象,以及调用多少次类方法,静态类代码块只被调用一次
2.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
class Date {
public static int year;
public static int month;
public int day;
{
// 构造代码块
year = 2021;
month = 2022;
System.out.println("非静态代码块/实例代码块/构造代码块! ->初始化非静态的数据成员");
}
static {
// 静态代码块:初始化静态数据的成员/提前准备一些数据
// 只要类被加载,就要执行静态代码块,再main方法中,不管创建多少个类对象,
// 以及调用多少次类方法,静态类代码块只被调用一次
System.out.println("静态代码块");
}
}
public class test {
public static void main(String[] args) {
}
}
4.同步代码块
此处等学完多线程再进行补充
2.2 不同代码块执行的顺序
class Date {
public static int year;
public static int month;
public int day;
{
// 构造代码块
year = 2021;
month = 2022;
System.out.println("非静态代码块/实例代码块/构造代码块! ->初始化非静态的数据成员");
}
static {
System.out.println("静态代码块");
}
public Date(int day) {
this.day = day;
System.out.println("含有参数的构造方法");
}
public Date(){
System.out.println("不含有参数的构造方法");
}
public static int getMonth() {
return month;
}
public static void setMonth(int month) {
Date.month = month;
}
public void show(){
{
System.out.println("普通代码块");
}
System.out.println(year+" "+ month);
}
}
public class test {
public static void main(String[] args) {
Date date = new Date();
date.show();
Date.setMonth(1);
System.out.println(Date.getMonth());
}
}
综上:
1.如果都是非静态的,看定义的顺序,如果是非静态和构造代码块放在一起的先执行非静态代码块
2.有静态代码块:先执行静态代码块,再执行非静态代码块,再执行构造方法。