Static关键字

1、什么是Static关键字

在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。

static修饰的变量静态变量

static修饰的方法静态方法

2、static的用途

static的用途大致可以分为两个方面

第一个方面是当static修饰属性,修饰变量的时候。这是的static可以帮助我们进行数据共享。如果一个成员变量被static所修饰了,那么这个变量就不再属于自己了,而是属于所在的类,所以我们在使用这个变量的时候可以多个对象共用这一个变量。

 第二个方面当static修饰方法的时候,一旦使用static修饰成员方法 那么这个方法就成为了静态方法。静态方法不属于对象,属于类。如果没有使用static关键字修饰的成员方法,需要调用成员方法,则需要先创建该类的对象,通过对象调用成员方法 。如果没有static关键字,需要先创建对象 然后通过对象名调用方法 ,如果有static关键字 就不需要创建对象,直接通过类名调用。

public class MyClass {
    int num;   //成员变量
    static int numStatic ;//静态变量

    //成员方法
    public void method(){
        System.out.println("这是我的成员方法!");
        //成员方法可以访问成员变量
        System.out.println(num);
        //成员方法可以访问静态变量
        System.out.println(numStatic);
    }
    //静态方法
    public static void methodStatic () {
        System.out.println("这是我的静态方法!");
        //成员方法不可以访问成员变量
        //System.out.println(num);
        //成员方法可以访问静态变量
        System.out.println(numStatic);

    }

}

public class Demo02MethodStatic {
    public static void main(String[] args) {
        //1.首先创建一个MyClass类的对象
        MyClass obj = new MyClass();
        //2.通过对象调用成员方法
        obj.method();
        //3.对于静态方法而言 可以通过对象名调用 也可以直接通过类名称直接调用
        //obj.methodStatic(); //正确 不推荐 这种写法会被javac翻译成"类名称.静态方法名"
        MyClass.methodStatic();
        System.out.println("===========");
        //4.对于本类当中的静态方法 可以省略类名称 直接调用
        myMethod();
        //Demo02MethodStatic.myMethod(); //完全等效
    }
    public static  void myMethod(){
        System.out.println("这是本类中的静态方法!");
    }
}

3、static静态代码块

构造方法用于对象的初始化。静态初始化块,用于类的初始化操作。在静态初始化块中不能直接访问非staic成员。

那静态代码块的作用的是什么呢?

静态初始化块的作用就是:提升程序性能

为什么说静态初始化块能提升程序性能,代码示例如下:

public class Person {
    static {
        System.out.println("我只被执行一次!");
    }
}
public class Demo04Static {
    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println("========");
        Person p2 = new Person();
    }
}

我们看到上面的代码中创建了两个对象,但是static所修饰的静态方法却只被执行了一次,这是因为静态代码块是在类被加载的时候执行的,相当于类的初始化,所以当我们用对象去访问他的时候,不管我们访问几次,他都只会在类被加载的时候被执行一次,那么这样我们就可以避免产生不必要的内存,从而提高程序的性能。

4.static关键字的误区

static关键字会改变类中成员的访问权限吗?

1、有些初学的朋友会将java中的static与C/C++中的static关键字的功能混淆了。在这里只需要记住一点:与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:
 


public class Person {

    public String name = "李四";

    private static String address = "中国";
}

 说明static关键字不能改变变量和方法的访问权限

2、能通过this访问静态成员变量吗?

public class Main {  
    static int value = 33;

    public static void main(String[] args) throws Exception{
        new Main().printValue();
    }

    private void printValue(){
        int value = 3;
        System.out.println(this.value);
    }
}

这段代码输出结果为:33

this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

3、static能作用于局部变量么?

static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值