静态/非静态 方法/变量的写法

大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过

class Test{    // 静态变量    public static int id = 1;    // 普通变量    public int usualId = 2;    // 静态常量    public static final int finalNextId = 3;    // 静态方法    public static void A(){        // 静态方法只能访问静态字段,不能访问非静态字段        System.out.println("this is static function A!");    }    // 普通方法    public void B(){        // 普通方法可以访问静态字段和非静态字段        System.out.println("this is usual function B!");    }}

静态变量

静态变量(带有static关键字的字段)是属于类的,所有该类的对象共用该字段;非静态变量(普通字段)是属于类的对象的,每一个该类的对象都有自己的非静态字段,他们互不影响。

class Test{    // 静态变量    public static int id = 1;    // 普通变量    public int usualId = 2;}class TestA{    // 对于静态字段,不实例化类(即创建对象)就可使用    Test.id; // 对于普通字段,Test.usualId 就会报错    // 对于普通字段,需要先实例化类    Test test = new Test();    test.usualId; // 不会报错}

静态方法

静态方法与普通方法的区别,与静态字段与普通字段的区别类似静态方法是不在对象上执行的方法,在调用静态方法时,不需要实例化该类而调用普通方法必须实例化该类。

class Test{    // 静态方法    public static void A(){        // 静态方法只能访问静态字段,不能访问非静态字段        System.out.println("this is static function A!");    }    // 普通方法    public void B(){        // 普通方法可以访问静态字段和非静态字段        System.out.println("this is usual function B!");    }}class TestA{    // 对于静态方法,不实例化类(即创建对象)就可调用    Test.A(); // 对于普通字段,Test.B()就会报错    // 对于普通方法,需要先实例化类    Test test = new Test();    test.B(); // 不会报错}

可以了解下Java中类的生命周期,就能知道为什么访问静态方法/字段不需要实例化类而访问非静态的方法/字段需要实例化类静态字段/方法在类的连接阶段就存在了,几乎可以理解为类存在,静态字段/方法就存在;非静态字段/方法在类初始化后(new 类名)才会存在,也就是对象存在后,非静态字段/方法才会存在。

类的生命周期

此部分几乎搬运了“三级小野怪”的文章,参考链接:https://blog.csdn.net/zhengzhb/article/details/7517213

当我们编写一个Java源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在Java虚拟机中运行,Java类的声明周期就是指一个class文件从加载到卸载的全过程。

一个Java类的完整的生命周期会经历加载,连接,初始化,使用,卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况。

jvm中的几个重要的内存区域

方法区:专门用来存放已经加载的类信息,常量,静态变量以及方法代码的内存区域常量池:是方法区的一部分,主要用来存放常量和类中的符号引用等信息;堆区:存放类的对象实例栈区:也叫Java虚拟机栈,由一个个的栈帧组成的后进先出的栈式结构,存放方法运行时产生的局部变量,方法出口等信息。当调用一个方法时,虚拟机栈就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法调用了其他方法,则继续在栈顶创建新的栈帧。

加载

在加载阶段,Java虚拟机会找到需要加载的类,并把类信息放到jvm的方法区中,然后堆中实例化。是类的生命周期中的第一个阶段,加载阶段之后是连接阶段,但是有时连接阶段并不会等加载阶段完成之后才开始,而是交叉进行,可能一个类只加载了一部分之后,连接阶段就已经开始了。但是两个阶段总的开始时间和完成时间总是固定的:加载阶段总在连接阶段之前开始,连接阶段总是在加载阶段完成之后完成。

连接

连接阶段主要任务是做一些加载后的验证工作以及一些初始化前的准备工作

验证:当一个类被加载会后,验证类是否合法,比如这个类的变量与方法是不是有重复,数据类型是否有效等,目的是保证加载的类能够被jvm所运行。准备:为类的静态变量分配内存并设为jvm默认的初始值,非静态变量则不分配内存。需要注意的是,这时候静态变量的初值是jvm默认的初始值而不是我们在程序中设定的初值。jvm默认的初值是这样的:1.基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0。2.引用类型的默认值为null。3.常量的默认值为我们程序中设定的值,比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。解析

初始化

如果一个类被直接引用就会触发类的初始化,直接引用的情况有:

通过new关键字实例化对象,读取或设置类的静态变量,调用类的静态方法通过反射执行以上三种行为初始化子类的时候,会触发父类的初始化作为程序入口直接运行时(也就是直接调用main方法)除了以上四种情况,其他使用类的方法叫做被动引用,被动引用不会触发类的初始化主动引用代码示例

class InitClass{    static {        System.out.println("初始化InitClass")    }    public static String a = null;    public static void method(){}}class SubInitClass extends InitClass{}public class Test1{    public static void main(){        // 主动引用引起类的初始化:new 对象、读取或者是类的静态变量,调用类的静态方法        new InitClass();        InitClass.a = "";        String a = InitClass.a;        InitClass.method();        // 主动引用引起类的初始化,通过反射实例化对象,读取或设置类的静态变量,调用类的静态方法        Class cls = InitClass.class;        cls.newInstance();        Field f = cls.getDeclaredField("a");        f.get(null);        f.set(null,"s");        Method md = cls.getDeclaredMethod("method");        md.invoke(null, null);        // 主动引用引起类的初始化,实例化子类        new SubInitClass();    }}

初始化过程:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。在初始化阶段,只会初始化与类相关的静态赋值语句和静态语句,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象时才会运行

使用类的使用包括主动引用和被动引用,主动引用上面说过了,下面主要说下被动引用

引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化;定义类数组,不会引起类的初始化;引用类的常量,不会引起类的初始化。被动引用代码示例

class InitClass{    static{        System.out.println("初始化InitClass");    }    public static String a = null;    public final static String b = "b";    public static void method(){}}class SubInitClass extends InitClass{    static {        System.out.println("初始化SubInitClass");    }}public class Test4 {    public static void main(String[] args) throws Exception{        //  String a = SubInitClass.a;// 引用父类的静态字段,只会引起父类初始化,而不会引起子类的初始化        //  String b = InitClass.b;// 使用类的常量不会引起类的初始化        SubInitClass[] sc = new SubInitClass[10];// 定义类数组不会引起类的初始化    }}

卸载

如果满足下面的情况,类就会被卸载:

该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。加载该类的ClassLoader已经被回收。该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

原文链接:https://blog.51cto.com/14801695/2493438

java heap space 解决方法_Java静态方法/变量,非静态方法/变量的区别,今天一并帮你解决相关推荐

  1. Java heap space设置方法记录

    近被 OutOfMemory Error折腾得够呛,记载一点设置JVM虚拟机内存Java heap space的方法. Tomcat 7 参考: http://www.davidghedini.com ...

  2. java heap space 什么意思_Java heap space 解决方法(转)

    因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误. 在网上一查可能是JAVA的堆栈设置 ...

  3. java heap space 什么意思_java heap space解决方法和JVM参数设置

    因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误. 在网上一查可能是JAVA的堆栈设置 ...

  4. java heap space 什么意思_java内存溢出之Java heap space

    作为一个java程序员,大家都应该认识JVM.JVM作为java的核心,实在太重要了.而内存溢出又是程序员常遇到的错误之一,如果你对JVM的原理足够了解,那么解决这样的问题就不在是一件困难的事情. 关 ...

  5. java.lang.OutOfMemoryError: Java heap space内存溢出解决方案

    java.lang.OutOfMemoryError: Java heap space内存溢出解决方案 一.设置环境变量 JAVA_OPTS= -Xms2048m -Xmx2048m 二.在Eclil ...

  6. memory java heap_java.lang.OutOfMemoryError: Java heap space解决方法

    //首先检查程序有没有限入死循环 这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问 ...

  7. java heap space解决方法

    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...

  8. java.lang.OutOfMemoryError: Java heap space解决方法

    java.lang.OutOfMemoryError: Java heap space解决方法 参考文章: (1)java.lang.OutOfMemoryError: Java heap space ...

  9. kafka 出现Java heap space的解决方法

    问题: 测试环境异常,经过查看server.log日志,发现:java.lang.OutOfMemoryError: Java heap space,具体如下: server.log: [2021-0 ...

  10. java.lang.OutOfMemoryError: Java heap space 解决方法

    这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 1.可以在windows 更改系统环境变量 加上JAVA_OPTS=-Xms64m - ...

最新文章

  1. 服务器论坛有哪些_SEO工作中,经常使用的无效外链有哪些?
  2. 试试这款针对JAVA应用的开源防火墙!
  3. iphone NSNotificationCenter
  4. 日志长度_Kafka 日志存储详解
  5. yii+php+当前目录,Yii常用路径方法总结
  6. xlutils演练 修改表格内容
  7. 看别人情侣空间显示服务器繁忙什么意思,调查13000位80后年轻人,他们的感情状态究竟如何?...
  8. WCF学习笔记(2)——独立WCF服务
  9. debian 10 Buster正式发布了
  10. ADO 错误:0x80004005,连接字符串属性无效
  11. 自然语言处理(三) 语料库和语言知识库
  12. 数字证书、ssl、sasl(GSSAPI,Kerberos)、jaas简单解释
  13. 海明贴近度matlab,Matlab学习系列23.-模糊聚类分析原理及实现.docx
  14. css--打字机效果
  15. 计算机本地连接xp,xp系统本地连接不见了的解决方法
  16. linux下kbhit的头文件,linux下kbhit的实现
  17. 记录回家第一天的bug解决和心理过程
  18. 宁夏移民文化的内涵及特点
  19. 计算机系统会受到什么损害,影子系统是什么?会损害电脑硬盘吗?
  20. jvm-sandbox:基础了解及demo演示

热门文章

  1. 32GSSD组建RAID0后对硬盘的加速效果
  2. 字符串匹配のKMP【专题@AbandonZHANG】
  3. 如何做好新一年的产品规划?
  4. 产品汪们匿名自爆工资,看完心里好难受......
  5. 干货 | 要怎样和程序猿谈一场没有bug的恋爱
  6. Apache按天截断日志工具,无法生成访问日志
  7. CSS3 :nth-child(n)使用注意
  8. [Spring]IoC容器之进击的注解
  9. JS获取URL中GET的参数
  10. Jquery在线引用地址: