2.3Java关键字static

1.静态static:用于修饰成员(成员变量和成员函数)
2.特点:

1.static是一个修饰符,用于修饰成员
2.static修饰的成员被所有的对象共享
3.static是优先于对象存在的,因为static的成员随着类的加载就已经存在了。
4.static修饰的成员多了一种调用方式,就可以直接被类名调用。类名.静态成员。
5.static修饰的数据是共享的数据,对象中存储的是特有的数据。
class Person
{
     static String country = "CN"; //对象的共享数据,节省空间,在对象之前就存在。程序运行加载类时就存在。
     //静态修饰的成员,可以被对象调用,也可以被 " 类名. " 调用。
     String name;    //对象特有的数据

    void show()
    {
        System.out.println(Person.country + " : " + this.name);   //注意country前面省略的是Person.
        //就是静态前面省略的是类名,非静态前面省略的是this.
    }
}

class Test
{
    public static void main(String[] args)
    {
        Person p = new Person();
        p.name = "小强";
        p.show();

        System.out.println(Person.country);   //country可以被 " 类名. " 调用
        System.out.println(p.country);     //country被对象调用

    }
}

3.成员变量和静态变量的区别:
String name; //成员变量(实例变量)
static String country = “CN”; //静态变量

成员变量:也叫实例变量,就是对象中的变量。
静态变量:也就类变量,可以用类调用。和类类型变量区别(Person p)。

区别:
1.两个变量的生命周期不同:
    成员变量随着对象的创建而存在,随着对象的被回收而释放。
    静态变量随着类的加载而存在,随着类的消失而消失。
2.调用方式不同:
    成员变量只能被对象调用。
    静态变量可以被对象调用(但不建议),还可以被类名调用。
3.别名不同:
    成员变量,也称为实例变量。
    静态变量,也称为类变量。
4.数据的存储位置不同。
    成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
    静态变量数据存储在方法区(共享区,数据区)的静态区里,所以也叫对象的共享数据。

4.注意:

1.静态方法只能访问静态成员(即不能访问对象的成员,因为对像还不存在)(非静态既可以访问静态,又可以访问非静态)
2.静态方法中不可以使用this,super关键字(因为对象还不存在)
3.主函数是静态的

5.关于主函数是静态的:

class StaticDemo
{
    int num = 4; //成员变量,实例变量,是对象特有的
    public static void main(String[] args)
    {
        StaticsDemo s = new StaticDemo();  //创建对象来调用
        s.show();   //直接调用的话,成员必须都设置成静态的,但是这样就共享了,不合理。
        //new StaticDemo().show();
    }
    void show()   //成员方法,对象所特有的
    {
        System.out.println(this.num); //this可省
    }
}

主函数的功能:就是在主函数中创建对象,去调用其他的函数功能。
(把功能都封装在函数中,把函数都封装在类中)

6.main函数解析:
public static void main(String[] args)

主函数特殊之处:

1.格式是固定的,只认这个,如果有同名main的函数,但是参数不同,也是可以的,就是main的重载而已。
2.被jvm所识别和调用

public:因为权限必须最大
static:不需要对象,直接用主函数所属类名调用即可(如:命令:java staticDemo(省略.main),也说明主函数所在的类名在权限为public时必须和文件名一致,这样可以通过文件名找到类名,才能调用主函数)
void: 主函数没有具体的返回值,返回空类型即可。
main:函数名,不是关键字,只是一个jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。args(arguments参数的意思)是唯一可变的。

调用有的形参的函数必须传相对应的实参。所以
虚拟机调用主函数时也传了值:new String[0]

命令传值: java Test haha hehe xixi  
class Test
{
    public static void main(String[] args)   //new String[0],只是提供一个入口,有需要的时候可以传。字符串数据是通用的。
    {
        System.out.println(args);  // [Ljava.lang.String;@5fd1358f
        System.out.println(args.length);   // 0
        for(String x : args)
             System.out.println(x);   // 没有值
        System.out.println(args[0]);  //数组越界异常,应为args数组没有元素

    }
}

7.static内存图解:
例子:

class Person
{
    private String name;
    private int age;
    static String country = "CN";

    Person(String name, int age)
    {
        this name = name;
        this age = age;
    }

    void show()
    {
        System.out.println(Person.country + ":" + this.name + ":" + this.age);
    }

    static void method()
    {
        System.out.println(Person.country);
    }
}

class StaticDemo
{
    public static void main(String[] args)
    {
        Person.method();

        Person p = new Person("java",20);
        p.show();
    }
}

static内存分析

8.static开发什么时候用:

1.静态变量:
    当分析对象中所具备的成员变量的值都是相同的。这时这个成员就可以被静态修饰。
    只要数据在对象都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。

    (如果是相同的数据,对象不需要修改,只需要使用即可,不需要存在对象中,则定义成静态的。)

2.静态函数:
    函数是否用静态修饰,就参考一点,就是该函数功能是否访问到对象中的特有数据。

    (简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
    如果不需要,就应该将该功能定义成静态的。也可以定义非静态,但是非静态需要被对象调用,而仅创建对象调用非静态的没有访问特有数据的方法,该对象的创建是没有意义的。对象就是封装特有数据存在的。)

9.静态代码块:用的不多
static int num;
static //对类初始化
{
num = 10;
… //进行相应操作
}
作用:满足静态的一切特点,包括随着类的加载而加载。
1.但是它是随着类的加载而执行。而且只执行一次。
2.用于给类初始化。(有的类是全是静态的成员,不需要对象,不能用构造函数初始化)
3.静态代码块也优先于mian函数执行。

10.构造代码块:在类中定义的代码块
{
}
是给所有对象进行初始化,每new一个对象运行一次。具备对象初始化的通用性。

构造函数:
给对应的对象进行初始化。具备对象初始化的针对性。

局部代码块:在方法中定义的代码块,限定局部变量的生命周期。
执行顺序:静态代码块,父类构造函数,构造代码块,构造函数。
发布了36 篇原创文章 · 获赞 0 · 访问量 4578
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章