JAVA基础(static关键字)

目录

static修饰的代码属于类,定义的变量存储在方法区的静态常量池中

二、java为什么设计static关键字?

因为要方便去使用自己的方法和变量  

三、static关键字的使用

(1) static使用示例:

public class A {
    public static String name = "admin";

    public static void run(){
        System.out.println("跑得很快");
    }

    public static void flay(){
        System.out.println("飞得很高");
    }
}
public class Test{
    public static void main(String[] args) {
        //假设我们的方法和变量上面没有static关键字
        A a = new A();
        a.run();
        a.flay();
        a.name = "sss";//那么该类当中的方法只能由对象调用

        //如果有static关键字,我们能直接被类调用
        A.name = "xxx";
        A.run();
        A.flay();
    }
}

画图进行分析代码的运行逻辑:

可以看出,static变量修饰的方法变量是单独存储在方法区的静态常量池中,而不需要创建对象将其加载在堆内存中存储,因此借用static关键字可以不创建对象就直接使用类去调用其本身的方法变量。


(2) static修饰方法、变量、代码块

static修饰变量:static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();

        a1.address = "上海";
        a1.name = "张三";
        a2.address = "天津";
        a2.name = "李四";

        System.out.println(a1);
        System.out.println(a2);
    }
}

class A {
    //static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享
    public static String name = "admin";
    public String address = "北京";

    @Override
    public String toString() {
        return "A{" +
                "address='" + address + '\'' +
                "name='" + name + '\'' +
                '}';
    }
}

static修饰方法:非静态方法可以调用静态方法,静态方法则不能调用非静态方法

 

从图中可以看出,静态方法a()如果想要调用非静态方法b()会报错,而非静态方法b()调用静态方法a()则不会报错

注:如果一个方法想在main方法中被调用,有以下两种方法:

        1、在非静态方法上加入static关键字,直接通过其所在类进行调用

         2、在main方法当中创建对象,让对象调用该非静态方法

static修饰代码块:在main方法之前运行,目的是优化程序

​​​​​​​public class Demo{

    public Demo(String aa){
        System.out.println("==="+aa);
    }
    static {
        System.out.println("11");
    }
    public static Demo demo = new Demo("+++");
    static {
        System.out.println("22");
    }
}

class Test{
    public static void main(String[] args) {
        Demo demo = new Demo("---");
    }
}

分析其加载过程如下:

扫描————————>加载(编译)————————>运行

1、main方法在哪里就先去扫描哪个类---->首先去扫描main方法所在的Test类,发现其没有父类,也没有static修饰的代码,那么编译Test类,并且将main方法入栈

2、执行new Demo("---"); 在执行之前先扫描Demo类,发现没有父类,所以编译Demo类,在编译的过程中static代码块按顺序优先执行

3、首先输出的是11

4、执行 public static Demo demo = new Demo("+++"); 此时会涉及到调用Demo构造方法,所以输出 ===+++

5、输出22

6、编译完毕,回到main方法当中继续执行new Demo("---"); 现在可以创建对象了,也就是进行到了运行阶段

7、通过调用构造器创建对象: ===---

最终得到运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值