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;
}
}
}
文章图片
内存展示图
执行过程
- 程序开始执行后会先找到程序的入口main方法,main方法入栈,并执行main中的代码,给局部变量value开辟空间,执行getMax方法。
- getMax方法入栈,在方法内部会进行运算,求出a和b的最大值。
- getMax方法会将return后面接收到最大值通过方法的返回值传到main方法,并赋值给变量value。
- 当getMax执行完(可以是执行return或者执行方法的右大括号),会执行出栈操作。
- 当main执行完,执行出栈操作,到此程序执行完成.
示例代码
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(抽象类与接口的区别&重载与重写&内存泄漏)
- 对抗抑郁最好的方法
- 事件代理
- 怎样用黑谜速冻膜去黑头,|怎样用黑谜速冻膜去黑头, 最有效的去黑头的方法看这!
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 移动端h5调试方法
- 唱歌教学(导致嗓音损坏的几个常见的错误唱歌方法!)
- 拆书方法训练营
- 数组常用方法一