static的用法

参考
https://www.cnblogs.com/a8457013/p/8078826.html
https://www.cnblogs.com/lh-cml/archive/2019/07/12/11176930.html

1、被static修饰

  • 静态变量
    • static修饰的变量是静态变量,也叫类变量
    • 类变量随着类的加载加载,即使此类还未new过对象,这个类变量也存在,而且仅一份
    • 由类创建的所有对象都可以共用这个变量
  • 实例变量
    • 实例变量类new了一个对象之后才有的
    • 每个对象自己的那一份
  • 静态方法
    • 用static修饰的方法叫静态方法,也叫类方法
    • 当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static
    • 用static修饰的方法可以用类名直接调用,不用一定要先实例化一个对象然后才可以调用
    • 随着类的加载加载,就算没有new一个对象,类方法还是存在且仅存在一份
  • 方法调用静态/非静态的变量和方法
    • 静态的方法不可以调用非静态的变量非静态的方法
    • 非静态方法可以调用静态的变量和方法
    • 原因:调用static方法的时候,不需要创建对象,而使用非static字段的时候,需要创建对象
  • 静态类
    • 普通类是不允许声明为静态的,只有内部类才可以
    • 被static修饰的内部类可以直接作为一个普通类来使用而不需实例一个外部类
    • 当一个内部类 没有使用static修饰的时候,是不能直接使用内部类创建对象,须要先使用外部类对象点new内部类对象,即(外部类对象.new 内部类())
public class OuterClass {
    public static class InnerClass{
        InnerClass(){
            System.out.println("============= 我是一个内部类'InnerClass' =============");
        }
    }
}


public class TestStaticClass {
    public static void main(String[] args) {
        // 不需要new一个InnerClass
        new OuterClass.InnerClass();
    }
}

如果没有用static修饰InterClass,则只能按如下方式调用:需要先new 一个外部类实例

package inner_class;

public class OuterClass {
    public class InnerClass{
        InnerClass(){
            System.out.println("============= 我是一个内部类'InnerClass' =============");
        }
    }
}

public class TestStaticClass {
    public static void main(String[] args) {
        // OutClass需要先生成一个实例,然后再new一个InnerClass();
        OuterClass oc = new OuterClass();
        oc.new InnerClass();
    }
}

2、static关键字加载顺序问题

静态变量静态块的加载都是在类加载器加载完成以后加载到一块固定内存区,按代码编写的顺序依次加载。

public class Father {
    static int i = 10;//先加载
    static {
        System.out.println("初始化父类的静态块...");
    }//后加载
    public Father() {
        System.out.println("初始化父类的构造方法...");
    }
    public static  void  speak(){
        System.out.println("静态方法...");
    }
    public void speak1(){
        System.out.println("普通方法...");
    }
}

public class A extends  Father {
    static {
        System.out.println("初始化子类静态块...");
    }
    public A(){
        System.out.println("初始化子类构造方法...");
    }
    public static void main(String[] args) {
        System.out.println(Father.i);
        Father a = new A();
        a.speak1();
    }
}

输出结果:

初始化父类的静态块...
初始化子类静态块...
10
初始化父类的构造方法...
初始化子类构造方法...
普通方法...
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值