Java基础之static关键字

定义

static表示静态,是Java中的一个修饰符,可以修饰成员方法、成员变量。

Static修饰的代码属于类。

为什么设置【共享】

让类可以直接去调用某些方法、某些程序,因此方便类去使用自己的方法和变量。

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

如果方法和变量属于非静态的方法,他们只有在对象当中才会被分配空间,那么也就是只有对象才能调用。

因此可以用类名直接调用,比如A.run,A.flay,可以不用创建对象就使用。

当然也可以被对象调用,被对象共享

Static修饰成员变量【静态变量】

特点:

被该类所有对象共享

调用方式:

类名调用(推荐)

对象名调用

静态变量出现顺序

随着类的加载而加载,先于对象出现

package exercise1;

public class Person {
    public String name = "张三";

    public static String address = "保定";

    public String toString() {
        return name+" "+address;

    }
}
package exercise1;

public class Persontest {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        p1.name="didi";
        p1.address="beijing";

        p2.name="dada";
        p2.address="shanghai";

        System.out.println(p1.toString());
        System.out.println(p2.toString());
    }
}

 

为所有对象所共享,也会被后面的覆盖。

Static修饰成员方法【静态方法】

特点

多用在测试类和工具类中
Javabean类中很少会用

调用方式

类名调用(推荐)

对象名调用

静态方法的可与不可

  1. 静态方法只能访问静态变量和静态方法
  2. 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
  3. 静态方法中没有this关键字

总而言之:

静态方法中,只能访问静态。
非静态方法可以访问所有。
静态方法中没有this关键字

如何让方法被main方法调用

在非静态方法上加入static关键字
在main方法当中创建对象,让对象调用该非静态方法

静态方法能够直接被main方法使用。非静态方法不能被被main方法使用

package exercise1;

public class Person {
    public String name = "张三";

    public static String address = "保定";

    public String toString() {
        return name+" "+address;

    }
}

修饰代码块

执行顺序练习1

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

package exercise1;

public class Test extends Base {
    static {
        System.out.println("test static");
    }

    public Test() {
        System.out.println("test constructor");
    }

    public static void main(String[] args) {
        new Test();
    }
}
class Base {
    static {
        System.out.println("base static");
    }
    public Base() {
                        System.out.println("base constructor");


                    }
                }

输出:

base static
test static
base constructor
test constructor

Process finished with exit code 0

执行顺序

  1. 程序执行先找main方法启动程序

  2. 首先先去扫描test类,发现TEst类有父类Base,发现base类没有父类。

  3. 将base.class加载进方法区,此时base类当中的static代码块执行

  4. 将Test.class加载进方法区,此时Test类在static代码块执行

  5. main方法入栈---->执行new Test():去创建Test类的对象

创建子类对象之前先创建父类对象,所以先执行Base()构造器,在执行Test()构造器:

执行顺序2

package exercise1;

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("---");

        }
    }

 输出

11
====+++
22
====---

*扫描--------->加载(编译)----------->运行

  1. main方法在哪里我们就先去扫描那个类----》首先去扫描Test类,发现没有父类,也没有Static修饰的代码,那么编译Test类,并且将main方法入栈
  2. 执行new Demo(”----");在执行之前扫描Dem类,发现没有父类,所以编译Demo类,在编译的过程中static代码块按顺序优先执行
  3. 首先输出的是11
  4. 执行public static Demo dem0=new Demo("+++");此时会涉及到调用Demo构造方法,所以输出====+++
  5. 输出22
  6. 编译完毕,回到main方法当中继续执行new Dem0("----"):现在可以创建对象了!!也就是进行到了运行阶段
  7. 通过调佣构造器创建对象:===---

Java只有值的传递

局部变量和静态常量

package exercise1;

public class A {
    private static int a;

    public static void main(String[] args) {

        modify(a);
        System.out.println(a);
        System.out.println(a);
    }
        public static void modify ( int a){
            a=a++;
        }
}

package exercise1;

public class A {
    private int a;

    public static void main(String[] args) {
        A a1 = new A();
        modify(a1.a);
        System.out.println(a1.a);
    }

        public static int modify ( int a){
            return a++;
        }
}

输出:0 

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值