一,static
1.1 static修饰成员变量 ---- 静态成员变量
与其他成员变量不同:
1. 静态成员变量属于类本身,也就是说,该变量是所有该类的对象共享的
2. 静态成员变量被单独存储在方法区中
3. 静态成员变量可以通过类名访问,也可以通过对象访问(最好用类名访问)
4. 静态成员变量的生命周期伴随类的一生
class Student{
public static String classes;
public int age;
public String name;
}
public class Test {
public static void main(String[] args) {
Student.classes = "一年级三班";//通过类名访问
Student student1 = new Student();
Student student2 = new Student();
System.out.println(student1.classes);
student1.classes = "二年级三班";//通过对象访问
//因为classes是类的属性,因此student2也中的classes发生改变
System.out.println(student2.classes);
}
}
1.2static修饰成员方法 ---- 静态成员方法
与静态成员变量相似:
1. 静态成员方法属于类的本身
2. 静态成员方法可以通过类名访问,也可以通过对象访问(最好用类名访问)
3. 静态成员方法只能访问静态成员变量
class Student{
public static String classes;
public int age;
public String name;
public static void get(){
Student.classes = "3班";
/**
* this.age = 10 ❌
*/
}
}
4. 静态成员方法只能调用静态成员方法,因为静态成员方法属于类本身,因此不需要通过对象来进行访问,也就不需要实例化,就没有 类名+this 这一参数,所以只能调用静态的。
class Student{
public static String classes;
public static void set1(){
System.out.println("2222");
}
public void set(){
System.out.println("1111");
}
public static void get(){
/**
* set(); ❌
*/
Student.set1();
}
}
5. 静态成员变量无法重写,也就无法实现多态
二,代码块
2.1普通代码块---不常用
定义在方法中的代码块:
public class Test {
public static void main(String[] args) {
{
System.out.println("12345");
}
}
}
2.2构造代码块
又叫实例代码块,定义在类中,一般用于初始化实例成员变量:
class Student{
public static String classes;
public int age;
public String name;
{
this.age = 10;
this.name = "123";
Student.classes = "111";
}
}
2.3静态代码块
用static定义的代码块,定义在类中,一般用于初始化静态成员变量,不能定义实例化成员变量:
class Student{
public static String classes;
public int age;
public String name;
static {
/**
* this.age = 10 ❌
*/
Student.classes = "111";
}
}
三,new一个对象的过程中,代码块和构造方法的执行顺序
给出如下代码,看看能否说出执行结果:
class Person{
public String name;
public int age;
//静态代码块
static {
System.out.println("3");
}
//实例代码块
{
System.out.println("2");
}
//构造方法
Person(){
System.out.println("1");
}
}
public class A {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
}
}
1. new一个对象的时,优先执行静态代码块,且只执行一次,再之后new同一个类时,不会再次执行,如果一个类中有多个静态代码块,那么按照从上到下的顺序执行。
2. 接下来执行实例代码块,如果一个类中有多个实例代码块,那么按照从上到下的顺序执行。
3. 最后执行构造方法。