static关键字
静态方法的使用多出现在工具类中,使用时会有需对的小细节需要注意,理解的基础上编程会规避很多小坑。
概述
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
定义和使用格式
类
static修饰的类只能为内部类,普通类无法用static关键字修饰。static修饰的内部类相当于一个普通的类,
访问方式为 new 外部类名.内部类().方法名()调用非静态方法。
如果内部类中的方法为静态方法直接 内部类名.方法名()
public class StaticInClassnClass {
public static class InnerClass{
public static int iStatic;
public int iNomal ;
void nomalMethod(){
System.out.println(iStatic);
System.out.println(iNomal);
System.out.println("============= 我是一个内部类'InnerClass的正常方法' =============");
}
static void staticMethod(){
System.out.println(iStatic);
System.out.println("============= 我是一个内部类'InnerClass的静态方法' =============");
}
}
}
public static void main(String[] args) {
new InnerClass().iNomal = 10;
InnerClass.iStatic = 20;
new StaticInClassnClass.InnerClass().nomalMethod();
InnerClass.staticMethod();
}
方法
static修饰静态方法的访问方式为 可以通过类.方法名直接调用
静态方法中调用的方法只能是静态方法 调用的变量只能为静态变量
静态方法中不能使用this关键字
public class test2{
public static void stest(){
System.out.println("============= 我是一个内部类方法 =============");
}
}
test2.stest();
代码块:
局部代码块
定义:
方法中的{}
作用:
限定变量声明周期,及早释放 提高内存利用率
构造代码块
定义:
类中方法外的{}, 先于类的构造方法执行 且执行次数和对象创建次数相同
作用:
多个构造方法中存在相同代码 可以使用构造代码块
静态代码块
定义:
类中方法外的static{}, 随着类的字节码文件加载而加载,并且只执行一次
作用:
类加载时进行初始化
注意 定义的static变量和静态代码块的位置;
public class test{
static {
System.out.println("类中静态代码块");
}
}
变量
静态变量和实例变量的区别
static修饰的变量为静态变量,静态变量在内存中只有一份存储空间,静态变量不属于某个实例对象,被一个类中的所有对象所共享,属于类,所以也叫类变量,可以直接通过类名来引用。
实例变量属于某个固定对象所私有,实例变量的使用必须先创建一个类的实例,然后通过这个实例来引用使用。
public class Person {
int age = 10;
static int age1 =11;
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.age=11;
person.age1 = 12;
Person person1 = new Person();
System.out.println(person.age);
System.out.println(person.age1);
System.out.println(person1.age);
System.out.println(person1.age1);
}
}
结果为 11换行 12 换行 10 换行 12换行
混合示例:
静态变量和静态块的加载都是在类加载器加载完成以后加载到一块固定内存区,按代码编写的顺序依次加载。
package com.youngchan.ClassReview.StaticClass;
public class Father {
static int i = 10;//先加载
{
System.out.println("这是父类构造代码块");
}
static {
System.out.println("static 静态成员变量 i的值为:"+i);
System.out.println("初始化父类的静态块...");
}//后加载
public Father() {
System.out.println("初始化父类的构造方法...");
}
public static void speak(){
System.out.println("静态方法...");
}
public void speak1(){
System.out.println("普通方法...");
}
}
package com.youngchan.ClassReview.StaticClass;
public class Son extends Father {
{
System.out.println("这是子类构造代码块");
}
static {
System.out.println("初始化子类静态块...");
}
public Son(){
System.out.println("初始化子类构造方法...");
}
}
package com.youngchan.ClassReview.StaticClass;
public class StaticReview {
public static void main(String[] args) {
// 静态代码块 和静态成员变量 只执行一次 可以打开注释位置查看 打印
// System.out.println(Father.i);
// Father. speak();
Father a = new Son();
a.speak1();
}
}
输出结果:
static 静态成员变量 i的值为:10
初始化父类的静态块...
初始化子类静态块...
这是父类构造代码块
初始化父类的构造方法...
这是子类构造代码块
初始化子类构造方法...
普通方法...
此处注意静态变量的定义和引用 引用的位置必须在调用前