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内存分布和面向对象的主要内容,如果未能解决你的问题,请参考以下文章

Java特性和优势

java面向对象,final,super ,抽象类,重写,代码块,static,this,构造方法,堆栈

Java学习 -- 面向对象概述与封装性

Java学习 -- 面向对象概述与封装性

VSCode自定义代码片段——JS中的面向对象编程

大数据必学Java基础(三十四):面向对象内存分析