Java学习笔记四:static关键字

1.static表示什么?

static表示“全局”或者“静态”的意思。在Java中没有全局变量的概念,static 可以简单的理解为全局的,独立的一个功能。

(1)当我们在使用 static 修饰成员变量或者成员方法的时候,通常会在Java内存中为这些变量或者方法指定了一块独立的区域(这块区域可能在栈中,也有可能在堆中)。

(2)如果静态的变量或方法在不出其作用域的情况下,其 引用句柄是不会发生改变的。

(3)这块区域是内存共享的,它的引用都指向同一个位置,就是说如果我们修改引用指向的的值,这个值就被改变了;当其他对象使用这个值时,就是修改后的值。

代码:

public class Lesson_02_Static
{
    public static int staticFiled = 0;
    public int notStaticFiled = 0;

    static
    {
        int staticBolckFiled = 0;
    }

    public Lesson_02_Static()
    {
        staticFiled++;
        notStaticFiled++;
    }

    public void print()
    {
        System.out.println("StaticFiled:" + staticFiled + ", NotStaticFiled:" + notStaticFiled);
    }

    public static void main(String[] args)
    {
        Lesson_02_Static ls1 = new Lesson_02_Static();
        ls1.print();

        Lesson_02_Static ls2 = new Lesson_02_Static();
        ls2.print();
    }
}

输出结果:

StaticFiled:1, NotStaticFiled:1
StaticFiled:2, NotStaticFiled:1

 

它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。

因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象

 

2.static使用场景?

1.修饰静态变量。如:

public static int staticFiled = 0;

说明:

静态变量:被static修饰的变量,在内存中只有一份,在加载类的过程中完成静态变量的内存分配,不会随着类的实例化和增加。

实例变量:被static修饰的变量,当实例化类时,可以在内存中存在多个拷贝。

 

2.静态方法。如:

public static void main(String[] args)
    {
        Lesson_02_Static ls1 = new Lesson_02_Static();
        ls1.print();

        Lesson_02_Static ls2 = new Lesson_02_Static();
        ls2.print();
    }

说明:

(1)静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法。

静态方法中调用非静态方法提示错误,编译不通过;

非静态方法可以调用静态方法。

(2)因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

 

3.静态块。如:

static
    {
        int staticBolckFiled = 0;
    }

说明:

静态块位置可以随意放置,初始化顺序时不会随着位置变化而变化。一般情况下,会放在成员变量结束,类方法的开始的地方,方便理解。

 

3.static初始化

(1)初始化顺序是从类的开始到结尾查找static块,并且比类自身构造函数要早。

class StaticInit
{
    public static int staticFiled = 0;
    public int notStaticFiled = 0;

    static
    {
        System.out.println("First Init");
    }

    public StaticInit()
    {
        System.out.println("structure Init");
    }

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

    static
    {
        System.out.println("Second Init");
    }
}

输出结果:

First Init
Second Init
structure Init

(2)static变量的初始化仅能一次

class StaticInt2
{
    T1 t1 = new T1(2);

    T1 t3 = new T1(4);

    T1 t2 = new T1(3);

    public StaticInt2()
    {
        System.out.println("t1: " + t1.t);
        System.out.println("t2: " + t2.t);
        System.out.println("t3: " + t3.t);
    }

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

class T1
{
    static int t = 1;

    T1(int b)
    {
        t = b;
    }
}

输出结果:

t1: 3
t2: 3
t3: 3

t的值在最后被设置为3,说明静态变量不会根据new 实例化而初始化(即不会在new时初始化值1).

说明:

在实际debug过程中,静态块中的方法先执行,然后在执行构造函数,最后执行成员变量的初始化。

总结:

static 指定的是一个固定的位置,在内存中只有一份;

在初始化时,优先执行static块。

时间: 2024-11-03 21:53:00

Java学习笔记四:static关键字的相关文章

面向对象三大特征之封装与static——(Java学习笔记四)

面向对象     编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一般,具体到抽象 三大特征: 封装 继承 多态 构造器:又叫构造方法(constructor),用于构造类的实例 格式:修饰符 类名(形参列表){ //语句 } 构造器的方法名与类名一致 通过new关键字调用 当没有定义构造方法时,系统会自定义一个无参构造函数 构造方法可以重载 作用:构造该类的对象,

java学习笔记之 static

java中的static 说明:这只是本人的学习java的个人心得与见解,分享出来,也算是自己的笔记.(本人小白,有错误的话望大神指出,不喜勿喷.-.-) 静态变量 – 在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量 – 静态变量被所有实例共享,可以使用“类名.变量名”的形式来访问 – static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错,下面的Demo是违反语法的. 1 public class Student{ 2 public v

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

C语言学习笔记(二) static关键字详细分析

C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字. 关键字static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量.随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数.为了避免引入新的关键字,所以仍使用st

java学习笔记四:static的几个角落及小谈多态

最近有点事情,没有及时更新笔记,学习不可弃,总结一下最近的学习,其中重点是static的一些应用,多态是一种设计理念,了解较容易,想如火纯清的确不是一件容易的事情. 对于static,主要有两点是我所学习的. 1.首先简单的介绍一下static的定义.static是静态的意思,就是说这个类变量或者类方法不需要实例化就可以使用.使用static的变量是类变量,也成为静态域(static field).这些是static的基本语义,了解了这些,继续向下看. java核心技术(卷一)对于静态有这样一段

《JAVA学习笔记 (final关键字)》

[14-9]面向对象-final关键字 /* 继承的弊端,打破封装性. 不让其他类继承该类,就不会有重写. 怎么能实现呢?通过Java中的一个关键子来实现,final(最终化). [final关键字] 是一个修饰符,可以修饰类,方法,变量(成员变量,局部变量,静态变量). [特点] 1,final修饰的类是一个最终类,不能派生子类. 如果类中出现部分可以重写,部分不可以,怎么办?只要让指定的方法最终化就可以了. 2,final修饰的方法是最终方法,不可以重写. 3,final修饰的变量是一个常量

【Java学习笔记】static方法和非static方法的区别

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法.被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.静态方法可以直接通过类名调用,任何的实例也都可以调用.因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法. 因此以下代码中,func_static方法只能访问num2成员,而func方法可以同

JAVA学习笔记(四十七)- 事件监听

定义ActionListener接口的实现类实现事件监听 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; /* * 事件监听 */ public class Te

JAVA学习笔记(四十九)- Swing相关组件

JFrame组件 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; /* * Swing是在AWT基础上的扩展 * javax.swing包及其扩展包,组件的命名多以J开关 * * JFrame组件 */ public class Test08 { public static void main(String[] args) { JFrame frame=new JFrame("我的窗体&qu