首页 > 代码库 > static关键字

static关键字

static关键字

1.static关键字的特点

a:随着类的加载而加载

    b:优先于对象存在 (还没创建对象)

    c:被类的所有对象共享(定义为静态的依据)

        如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。

    d:可以通过类名调用

其实它本身也可以通过对象名调用。推荐使用类名调用

Person.country = "日本";

静态修饰的内容一般我们称其为:与类相关的,类成员,静态变量叫类变量,静态方法叫类方法.静态的内存存在于方法区类做标记的静态区

2.static的注意事项

    a:在静态方法中是没有this关键字的

        静态比对象先存在。类加载时还没创建对象

    b:静态方法只能访问静态的成员变量和静态的成员方法

        静态方法:

            * 成员变量:只能访问静态变量

            * 成员方法:只能访问静态成员方法

        非静态方法:

            * 成员变量:可以是静态的,也可以是非静态的

            * 成员方法:可以访问静态的成员方法,也可以访问非静态的成员方法。

一句话静态只能访问静态。静态的只能访问静态的,因为在类加载的加载的,访问时已经存在了(不能访问不存在的).而非静态的,必须创建对象才能访问.

 

例:

class Demo {

        int num1 = 10;    

    public static void print() {        //静态的成员方法

            System.out.println(num1);

//报错 无法从静态上下文中引用非静态 变量 num1

            System.out.println(num2);

        }

    }

 

3.static关键字案例文字内存图

class bj07_9 {

    public static void main(String[] args) {

        Person p1 = new Person();

        p1.name = "苍老师";

        p1.country = "日本";

        p1.speak();

        System.out.println("Hello World!");

 

        Person p2 = new Person();

        p2.name = "吉泽明步";

        p2.country = "日本";

        p2.speak();

    }

}

class Person {

    String name;

    static String country;

    public void speak() {

        System.out.println(name + "..." + country);

    }

}

从含有主方法的类开始

编译运行---bj07_9.class加载进方法区(方法区分成两块,静态区和非静态区,static修饰的同时被加载进方法区)

主方法进栈,遇到    Person p1 = new Person();,Person.clas要加载进方法区,(方法区分成两块,静态区有String country(默认初始化值是null);非静态区:成员变量和成员方法)

在栈里Person p1声明一个Person类型引用p1

new Person(),在堆内存中创建对象,有自己的地址值,里面有String name属性,默认初始化值是null.堆里没有String country,对象是通过类创建出来的因此能找到静态区的String country.

构造方法进栈,对对象中的属性赋值,构造方法弹栈

将对象的地址值赋值给

对象创建完后,遇到p1.name = "苍老师";通过p1地址值找到name,改变name的值为"苍老师"

P1.country = "日本";地址值找到对象后,对象通过字节码文件找到静态区中的country并赋值

执行p1.Speak,方法进栈,this谁来调用就记住谁,通过地址找到,执行完弹栈.

......

    加了静态后,赋值一次就可以共享了.

4.工具类中使用静态

public class Arraytool {

    //如果一个类中所有的方法都是静态的,可以再多做一步,私有构造方法.

    //私有构造方法在说明书中不会体现

    private Arraytool() {}//目的是不让其他类创建本类对象,直接用类名.调用即可.

// 1,获取最大值

    public static int getMax(int[] arr){

        int max = arr[0];        //记录第一个元素

        for (int i = 1;i < arr.length ;i++ ) {    

            if (max < arr[i]) {    

                max = arr[i];    

            }

        }

        return max;        //最大值返回

    }

//2,数组的遍历

    public static void print(int[] arr) {

        for (int i = 0;i <= arr.length - 1 ;i++ ) {                        System.out.print(arr[i] + " ");

        }

    }

    // 3,数组的反转操作

    public static void revArray(int[] arr) {

        for (int i = 0;i < arr.length / 2 ;i++ ) {                        int temp = arr[i];

            arr[i] = arr[arr.length - 1 - i];

            arr[arr.length - 1 - i] = temp;

        }

    }

}

//非静态方法需要创建对象才能访问

//定义成静态的就不用去创建对象了

class bj07_14_Arraytool {

    public static void main(String[] args) {

        //创建对象,就可以用里面方法了

        int[] arr = {33,11,22,33,66,55,44};

        Arraytool.print(arr);//直接类名.就可以了

    }

}

static关键字