• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

static关键字

开发技术 开发技术 1周前 (07-20) 10次浏览

 1.static存在的意义

1.static可以创建独立于具体域对象的变量或者方法,这个方法或者变量不与包含它所对应的类的任何对象包含在一起。也就是说即使没有创建对象,也可以调用这个变量或者方法

2.static可以用来形成静态代码块来优化程序性能。static块可以存放在类的任何一个地方,当类进行加载时,会按照static块的顺序来进行加载,并且只会加载一次

3.static可以为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建对象。(一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象都有一个存储空间

2.static的特点

1.被static修饰的变量或者方法独立于该类的任何对象,可以理解成这些变量或者方法不属于任何一个实例对象,是被类中所有对象所共享。

2.在一个类第一次加载的时候,就会加载static修饰的部分,而且只在类第一次使用时加载并进行初始化。

3.static变量值在第一次加载的时候就分配了空间,以后创建对象时不会再进行重新分配空间,但是可以赋值。

4.被static修饰的变量或者方法是优先于对象的,也就是说,即使你没有创建对象,也可以调用static修饰的变量或者方法。

3.static的应用场景

3.1修饰成员变量

成员变量是可以被类中所有对象所共享的,当一个成员变量被static所修饰,那么这个变量就成了静态变量

静态变量和实例变量有点区别,首先没有被static修饰的成员变量叫做实例变量,实例变量属于这个类的实例对象,也就是说,可以通过创建对象来对它进行调用。两者之间的区别是,静态变量不属于任何实例对象,它是属于类的。在类加载的时候进行分配一次内存空间。实例变量是每次创建对象时,都会为成员变量分配内存空间。

3.2修饰成员方法

被static修饰的方法叫做静态方法,其实main方法就是一个静态方法。静态方法可以直接被调用,也就是类名.方法名()的方式。

3.3静态代码块

也就是在类中被static包裹的一部分代码,形如static{}

public class staticTest {
   public staticTest(){
       System.out.println("staticTest:构造器初始化");
   }
    {
        System.out.println("staticTest:初始化块");
    }
    static {
        System.out.println("staticTest:静态初始化块");
    }
}
class staticTest1 extends staticTest{
    public staticTest1(){
        System.out.println("staticTest1:构造器初始化");
    }
    {
        System.out.println("staticTest1:初始化块");
    }
    static {
        System.out.println("staticTest1:静态初始化块");
    }
}
class staticTest2 extends staticTest1{
    public staticTest2(){
        System.out.println("staticTest2:构造器初始化");
    }
    {
        System.out.println("staticTest2:初始化块");
    }
    static {
        System.out.println("staticTest2:静态初始化块");
    }
}
class staticTest3 extends staticTest2{
    public static void main(String[] args) {
        staticTest2 staticTest2 = new staticTest2();
        System.out.println("------");
        staticTest staticTest = new staticTest2();
    }
}
 

输出:

"C:Program FilesJetBrainsIntelliJ IDEA 2019.3.3jbrbinjava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.3libidea_rt.jar=65088:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.3bin" -Dfile.encoding=UTF-8 -classpath D:javajavase进阶.ideaoutproductionTest staticTest3
staticTest:静态初始化块
staticTest1:静态初始化块
staticTest2:静态初始化块
staticTest:初始化块
staticTest:构造器初始化
staticTest1:初始化块
staticTest1:构造器初始化
staticTest2:初始化块
staticTest2:构造器初始化
------
staticTest:初始化块
staticTest:构造器初始化
staticTest1:初始化块
staticTest1:构造器初始化
staticTest2:初始化块
staticTest2:构造器初始化

Process finished with exit code 0

static关键字

可以看出:静态代码块只初始化一次。

3.4静态内部类

1.静态内部类不可以访问外部类非静态成员。

2.静态内部类不需要创建外部类的对象就可以访问。

3.静态内部类可以有多种权限访问类型。

public class Myself {
    private static String name = "业平";
    private String sex = "男";

    //静态内部类可以为public修饰
    public static class Person{
        //静态内部类可以定义非静态变量
        private String address = "山东";

        private static String high = "180";

        //内部类公用成员
        public String age = "20";

        public void disPlay(){
            //不能访问外部类非静态成员
            //System.out.println(sex);

            //可以访问静态成员
            System.out.println(name);

            //访问本内部类成员
            System.out.println(address);
        }
    }
    public void play(){
        //外部类访问内部类非静态成员需要实例化
        Person person = new Person();
        person.disPlay();

        //System.out.println(high);
        //System.out.println(age);

        System.out.println(person.age);
        System.out.println(person.address);
    }

    public static void main(String[] args) {
        Myself myself = new Myself();
        myself.play();
    }
}

 

static关键字

 输出:

业平
山东
20
山东

 



程序员灯塔
转载请注明原文链接:static关键字
喜欢 (0)