美文网首页
Java方法,对象和static内存详解

Java方法,对象和static内存详解

作者: 顺风飘千里 | 来源:发表于2021-05-25 08:31 被阅读0次

方法,对象和类的区别

Java的方法(Method)类似于其它语言的函数(Function),指一段可以直接被另一段程序或代码引用的程序或代码。
面向过程语言中,整个程序就是由函数(相互调用)组成的。
面向对象语言中,方法(函数)是类的组成部份,整个程序是由很多类组成的。
通俗讲,方法就是解决某件事情的办法。

具有特定的功能, 能够解决特定问题的实体, 就是一个对象。
由若干个具有相同的特征和行为的对象的组成的集合, 就是一个类。
类是对象的抽象的集合对象是类的实例,类比图纸和实物。

//以下代码构造的是一个“人”类
public class Person {
// 使用属性, 描述所有对象的特征
String name; // 描述所有人的姓名
int age; // 描述所有人的年龄
// 使用方法, 描述所有对象的行为
public void eat() {}
public void sleep() {}
}
//这段代码则是通过“人”这个类构造一个实例对象
class Test {
public static void main(String[] args) {
// 使用new进行对象的实例化,对象内的属性会自动进行初始化,引用类型初始化成null,int赋值成0,boolean赋值成false
Person xiaoming = new Person();//xiaoming就是一个实例对象由class Person new出来的
  }
}

Java的内存分区

java将内存分成了5块儿,分别是堆区,栈区,方法区,本地方法区,寄存器。

栈区:里面存放数据的特点是:先进后出,我们主要将加载时的局部变量和函数放在栈区,数据的特点是使用完立刻释放。

堆区:存放的是实体(对象和数组),实体可以同时存放多个值,实体里面的变量如果不赋值,会有默认值.整型数据默认值是0,boolean---false。

方法区:程序运行中的二进制文件等(比如:.class)。

本地方法区:存放外界引入的c,c++等的内容。

寄存器:也可以称为计数器.。

堆区中的数据会在某个时刻被释放-通过垃圾回收机制.
垃圾回收机制是通过一个线程控制的,由于这个线程的等级比较低,所以不会立刻执行,数据就不会立刻释放.

方法在内存中的工作原理

方法在执行时是在内存中的栈区存储的,方法在执行时遵循先入后出的原则调用的main方法最先入栈却是最后出栈的。

示例代码

public class Demo5 {
//实例:求两个数的最大值
  public static void main(String[] args) {
    int value = getMax(4,5);
    System.out.println(value);
  }
  public static int getMax(int a ,int b) {
    if (a>b) {
      return a;
    }else {
      return b;
    }
  }
}
内存展示图
执行过程
  1. 程序开始执行后会先找到程序的入口main方法,main方法入栈,并执行main中的代码,给局部变量value开辟空间,执行getMax方法。
  2. getMax方法入栈,在方法内部会进行运算,求出a和b的最大值。
  3. getMax方法会将return后面接收到最大值通过方法的返回值传到main方法,并赋值给变量value。
  4. 当getMax执行完(可以是执行return或者执行方法的右大括号),会执行出栈操作。
  5. 当main执行完,执行出栈操作,到此程序执行完成.

对象的内存分析

在了解对象内存时我们首先要记住一个点那就是,所有的new都代表在堆上开辟空间。因此对象的实例化, 是在堆上开辟空间。而且数组同样也是在对上开辟空间。
示例代码

class Person {
    // 使用属性, 描述所有对象的特征
    String name; // 描述所有人的姓名
    int age; // 描述所有人的年龄

    // 使用方法, 描述所有对象的行为
    public void eat() {
    }

    public void sleep() {
    }
}

class Test {
    public static void main(String[] args) {
// 使用new进行对象的实例化,对象内的属性会自动进行初始化,引用类型初始化成null,int赋值成0,boolean赋值成false
        Person xiaoming = new Person();
    }
}

上面代码中new关键字在内存中开辟了一块空间用来存放新建的Person对象,存放对象的内存地址被赋值给了xiaoming这个变量

示例代码对象内存分析

static内存展示

static定义
是一个关键字,被static修饰的成员就变成了静态的.具有保值功能。

如果某些属性是属于不同的对象, 每一个对象的值都不同, 可以设计为非静态。 例如人的名字。

如果某些属性是可以被所有的对象共享的, 每一个对象看到的值都是相同的, 可以设计为静态。 例如对象的数量。

示例代码

//说明static
class Student {
    int age;//非静态成员变量
    static int height;//静态成员变量

    //静态方法
    public static void jump() {
        System.out.println("jump");
    }
}

public class Demo2 {
    public static void main(String[] args) {
        Student s = new Student();
        s.age = 10;//引用调用非静态的成员变量
//s.height = 23;//引用调用静态的成员变量
//Student.age = 20;//类名不能调用非静态成员
        Student.height = 20;//类名只能直接调用静态成员
        Student.jump();//类名调用静态方法
    }
}
static内存展示

方法区里到底存着什么东西呢?
从上图可以看出来一些,存的分别是:
静态变量 + 常量 + 类信息(构造方法/接口定义) + 运行时常量池

其中方法区里的class文件信息又包括:魔数,版本号,常量池,类,父类和接口数组,字段,方法等,其实类里面又包括字段和方法的信息。

知道了都是什么东西这张图就很好理解了。
其中age和height初始值都是0,后面进行赋值后里面的值发生变化。

以上存粹个人理解若有不对地方请谅解,也可以私信我进行修改。

相关文章

  • Java方法,对象和static内存详解

    方法,对象和类的区别 Java的方法(Method)类似于其它语言的函数(Function),指一段可以直接被另一...

  • java中Serializable与Parcelable的使用

    java序列化 保存内存对象的状态,包括对象的属性值,但不包括方法和static变量(因为static修饰的变量是...

  • java 堆栈

    参考文章:1.JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解2.java里的静态成员...

  • 类和对象

    类和对象的定义、关系 成员方法:去掉static关键字的方法 单个对象内存图 多个对象的内存图 成员变量:类中方法...

  • JVM内存分配机制详解学习笔记

    JVM对象创建过程详解 对象创建的主要流程: 划分内存的方法: 指针碰撞如果Java堆中内存是绝对规整的,所有用过...

  • Kotlin Vocabulary | 唯一的 "对象"

    在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。static...

  • JAVA对象的创建、内存布局、 访问定位

    JAVA对象的创建、内存布局、 访问定位 时间:20180304 1.Java对象的创建详解 一个简单的创建对象语...

  • 复习Java基础资料

    Java中面向字符的输入流 Java中的static关键字解析 Java中的main()方法详解 Java中普通代...

  • 【String类】对象内存分配详解

    关于内存分区参见:Java内存详解 - 内存分区 本文重点描述String对象创建时的内存分配方式。 字符串常量池...

  • 深入Java方法调用

    Java方法 方法和函数的区别 为了区分开来,先不讨论static方法。 方法是一个面向对象的概念,它依赖于对象,...

网友评论

      本文标题:Java方法,对象和static内存详解

      本文链接:https://www.haomeiwen.com/subject/ezmpjltx.html