static关键字深入理解

版权声明:文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除或授权事宜,如果有误,请联系作者更改,谢谢,本人微信:void666666 https://blog.csdn.net/wt520it/article/details/82802505
本博客记录只为了个人学习(我记得这篇很早都写了,但是可能当时可能有其他的原因,没发布吧)

1、static变量

按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:
a).语法上的区别:

前边加static的是静态变量,不加static的是实例变量

b).作用的区别:

VM加载类的时候,会给static分配一个地址,可以通过类名直接访问 非static:每创建一个实例,就给他分配一次内存

c).静态的好处:
实现资源共享
访问数据比较方便

2、静态方法

静态方法的好处就是不用生成类的实例就能直接调用,只要通过类名就可以访问,不需要耗费资源反复创建对象,因为在程序第一次加载的时候就已经在内存中了,直到程序结束该内存才会释放。如果不是static修饰的成员在使用完之后该内存就会被回收,所以说static要慎用,根据实际情况而定

3.static修饰类

一般静态内部类可以用static修饰(java内部类分为四种:常规内部类、静态内部类、局部内部类、匿名内部类)。只能访问外部类的static成员,不能直接访问外部类的实例变量与实例方法。

4、static代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次,所以说static块可以用来优化程序性能。
static方法块和static方法的区别:
静态代码块是自动执行的;

静态方法是被调用的时候才执行的.

静态方法:如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们就可以使用静态方法,具体实现是在方法前面加上static,如下:

public static void method(){}

在使用静态方法的时候需要注意一下几个方面:

在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。(备注:静态变量是属于整个类的变量而不是属于某个对象的)

静态方法不能以任何方式引用thissuper关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。

--------------------------------华丽的分界线(面试)------------------------------------

package com.com.aaa.test;

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

运行结果如下:
在这里插入图片描述

package com.com.aaa.test;

public class Test {
    Person person = new Person("Test");
    static{
        System.out.println("test static");
    }

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

    public static void main(String[] args) {
        new MyClass();
    }
}

class Person{
    static{
        System.out.println("person static");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}


class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass static");
    }

    public MyClass() {
        System.out.println("myclass constructor");
    }
}

运行结果如下:
在这里插入图片描述


public class Test {
     
    static{
        System.out.println("test static 1");
    }
    public static void main(String[] args) {
         
    }
     
    static{
        System.out.println("test static 2");
    }
}

运行结果如下:
在这里插入图片描述

在这里要说明一下,虽然main方法里边没有要运行的方法,但是静态代码块还是执行了。还是那句话,只要有入口,静态代码块会首先执行的。

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除或授权事宜
如果有误,请联系作者更改,谢谢,本人微信:void666666

猜你喜欢

转载自blog.csdn.net/wt520it/article/details/82802505