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

方法,对象和类的区别 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 = https://www.it610.com/article/getMax(4,5); System.out.println(value); } public static int getMax(int a ,int b) { if (a>b) { return a; }else { return b; } } }


Java方法,对象和static内存详解
文章图片
内存展示图
执行过程
  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这个变量
Java方法,对象和static内存详解
文章图片
示例代码对象内存分析 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(); //类名调用静态方法 } }

Java方法,对象和static内存详解
文章图片
static内存展示 方法区里到底存着什么东西呢?
从上图可以看出来一些,存的分别是:
静态变量 + 常量 + 类信息(构造方法/接口定义) + 运行时常量池
其中方法区里的class文件信息又包括:魔数,版本号,常量池,类,父类和接口数组,字段,方法等,其实类里面又包括字段和方法的信息。
知道了都是什么东西这张图就很好理解了。
其中age和height初始值都是0,后面进行赋值后里面的值发生变化。
【Java方法,对象和static内存详解】以上存粹个人理解若有不对地方请谅解,也可以私信我进行修改。

    推荐阅读