java内存分布和面向对象
Posted project-zqc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存分布和面向对象相关的知识,希望对你有一定的参考价值。
Java内存区域
栈概念:
是线程私有的,它的生命周期与线程相同,每个方法执行的同时都会创建一个栈帧,用于存储局部 变量操作数栈、动态链接、方法出口等信息。
堆概念:
堆是虚拟机所管理的内存中最大的一样区域。堆是被所有线程共享的一块内存区域,在虚拟机启动时 创建。此区域用来存储对象实例。
方法区:
和堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
对象的创建过程
过程解释:
1.jvm加载器先将.class字节码加载入方法区,运行时调用静态方法main()
2.在对内存开辟main()方法内存空间,执行构造方法。
3.执行构造方法会
4.在堆内存给对象开辟内存空间,并编有内存地址
5.生成的对象的引用(对象地址)传递给对象变量。引用和指针类似是一种存放对象地址的变量。
最后main()程序执行完毕进行弹栈释放,堆内存中的对象会被JVM虚拟机的垃圾回收机制回收。
成员变和局部变量的区别
1.在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
2.在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
3.生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4.初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
匿名对象
匿名对象的定义:
就是没有名字的对象
匿名对象应用场景
1.调用方法,仅仅只调用一次的时候。
2.匿名对象可以作为实际参数传递
private与static
privateu关键字的特点:
1.是一个权限修饰符
2.可以修饰成员变量和成员方法
3.被其修饰的成员只能在本类中被访问
static关键字:
1.可以修饰成员变量、方法和语句块
2.被static所修饰的都会在类加载的过程中将符号引用变成直接引用,以及对变量进行赋值。
使用static注意事项
1.在静态方法中是没有this关键字的
2.静态方法只能访问静态的成员变量和静态的成员方法
简单记:静态只能访问静态,非静态可以访问静态的也可以访问非静态的
重载和重写
首先这两个不是一个概念,其次作用的效果、和地方不同
重载:
1.同一个类中
2.方法名相同,参数列表不同(参数顺序、个数、类型)
3.方法返回值、访问修饰符任意
4.方法的参数名无关
重写:
1.继承关系的子类中
2.法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3.问修饰符,访问范围需要大于等于父类的访问范围
4.方法的参数名无关
代码块学习
静态代码块:
静态代码块会在类加载时期进行加载(就是将符号引用变成直接引用等待执行),但是执行是在类初始化时期。
格式:
static{
内容
}
注意:
初始化阶段是执行类构造器<clinit>()方法的过程。<clinit>()方法是由编译器自动收集类中 的所有类变量的赋值动作和静态语句块static{}中的语句合并产生的,编译器收集的顺序是由语句在 源文件中出现的顺序所决定的,静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的 变量,在前面的静态语句块可以赋值,但是不能访问。
final关键字介绍
对成员变量使用:
final用于变量:
final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声 明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器 会报编译错误。
如果对一个成员变量使用了final关键字的化那么该变量只要初始化完毕之后就不能进行修改了。
final用于方法:
final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你 认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法 比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
以上是关于java内存分布和面向对象的主要内容,如果未能解决你的问题,请参考以下文章