Java 编程高级基础
static 类变量(静态变量)
static 修饰的属性被这个类的所有成员共享
static 修饰的方法能被这个类的所有成员所调用
使用场景:当方法中不涉及到任何和对象相关的成员,则可以设计为静态方法
简单的说,就是不想创建实例,但是也想调用方法时用!(如工具类,把这些static类当工具使用! )
**例:**Math类,调用Π,直接Math.PI就行了
Static Detail
类方法中无 **this ** 的参数
类方法中不能出现关于有类的东西!
口诀:静态方法只能访问静态成员,普通成员方法,既可以访问非静态成员,也可以访问静态成员。

关于main方法
public static void main(String [] args){//这是一个名为args的String字符串数组!
for(int i =0;i<args.length;i++){
System.out.println(args[i]);
}
}
类如以下:
public static void main(int [] a){//这是一个名为a的int数组!
for(int i =0;i<args.length;i++){
System.out.println(args[i]);
}
}
main方法是谁在执行?——Java虚拟机
当运行main方法时,如果想给args传进去一个参数,怎么传呢?——在命令行中 java 程序名 [参数1 参数2 参数3]
代码块{ }(又称初始化块)
code block = 代码 块
代码块属于类中的成员(是类中的一部分),类似于方法,但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
1.修饰符只有static或缺省
2.代码分为两类,用static修饰的是静态代码块,没有的是普通代码块
3.代码块中可以写任意逻辑语句(输入、输出、方法调用、循环、判断等)
4.最后的 ; 可以写 也可以不写
⚠ : 代码块 - > 构造器 先执行代码块再执行构造器
codeblock Detail
1.static代码块也叫静态代码块,作用是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就会执行一次。如果是普通代码块,每创建一个对象,就会执行一次
static修饰的代码块,只会在加载的时候输出一次!
例如 DD dd1 = new DD(); DD dd2 = new DD(); 对应的static代码块只会输出一次
类什么时候被加载?
1.new AA();//创建一个对象时
2.创建子类实例对象时,父类也会被加载
3.使用类的静态成员时(静态属性、静态方法)//所在类及其父类会加载
⚠ 普通的代码块:(和类加载没关系!只有创建对象时才会被调用)
1.在创建对象实例时,会被隐式的调用
2.被创建一次就调用一次
3.如果只是使用类的静态成员,普通代码块并不会执行。
小结 :static代码块是类加载时执行,只会执行一次;普通代码块是在创建对象时调用的,创建一次调用一次。
创建一个对象时,在一个类调用的顺序是(重难点)
- 先static:按顺序
- 后缺省:按顺序
- 构造器
关于继承状态下的代码块
class AAA {
static {
System.out.println("A的static");
}
{
System.out.println("AAAAA的普通");
}
public AAA(){
System.out.println("AAAAA的构造器");
}
}
class BBB extends AAA {
static {
System.out.println("B的static");
}
{
System.out.println("BBBBB的普通");
}
public BBB(){
System.out.println("BBBBBB的构造器");
}
}
此时 new BB();
输出如下:
A的static 顺序如下:!!!
B的static 顺序就是父类静态->子类静态->父类普通->父类构造器->子类普通->子类构造器
AAAAA的普通
AAAAA的构造器
BBBBB的普通
BBBBBB的构造器
构造器(){
//隐藏了以下内容
super();
普通代码块及普通属性;
自己的内容
}
code block Test
static 代码块只会执行一次!

同为static就看先后顺序
