面向对象----(程序执行过程的内存分析01)
引用类型
Java 语言中除基本类型之外的变量类型都称之为引用类型.
Java中的对象是通过引用(reference)对其操作的.
类的属性
属性 field ,或者叫成员变量
属性用于定义该类或该类对象包含的数据或者说静态属性.
属性作用范围是整个类体
在定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化.(数值: 0,0.0 char:\u0000, boolean:false,所有引用类型:null )
属性定义格式:
[修饰符] 属性类型 属性名 = [默认值]
面向对象中,整个程序的基本单位是类,
方法是从属于类的.
方法定义格式:
[修饰符] 方法返回值类型 方法名(形参列表) {
n条语句
}
java中方法参数传递是:值传递!没有引用传递
内存分析( SxtStu..java )
栈:
存放:局部变量
堆:
存放new出来的对象
方法区:
存放:类的信息(代码), static变量, 常量池(字符串常量)等.
内存分析:
栈(自动分配连续的空间,后进先出)
放置:局部变量
堆(不连续 , )
堆:放置new处的对象
方法区():也是堆的一部分
类的信息(代码), static变量, 常量池(字符串常量)等.
存放:类的代码信息,static变量,常量池(字符串常量......)
package cn.Test.oop;
/**
* 以类的方式组织代码,以对象的方式封装(组织)数据!
操作对象就是操作它的地址!
对象以类为模板来的!
所有的引用类型都是4个字节!
* @author 神奇的梦
*
*/
public class Student {
//属性:静态的数据 private 私有
// 成员变量你不初始化,系统会帮你初始化一下
String name;
int id; //学号
int age;//年龄
String gender;//性别
int weight;//体重
//动态的行为
public void study() {
// 局部变量不会初始化,需要自己初始化
int a;
// the local variable a 这个局部变量a
// may not have been _initializeo 也许没有被初始化
// System.out.print(a+3);
System.out.println(name+"在学习");
}
sname是局部变量需要声明,name是成员变量已经声明;
public void sayHello(String sname) {
System.out.println(name+"向"+sname+"说:你好!");
}
// 形参列表形式: 数据类型1 形参名1,数据类型2 形参名2,...
public int add(int a,int b,int c) {
int k=a+b+c;
// return语句用于终止方法的执行并指定要返回的数据
return k;
}
// 从代码上讲Student从属Student()有关系
// 从逻辑上讲Student和Student()没有关系
// main及和它有关系,又可以认为没关系,因为所有的方法都要从main开始
// 虚拟机跑起来之后就找main方法
// java里面所有的方法只能放在main里面,不能放到类之外
public static void main(String[] a) {
// 如果是对象的话除了八种数据类型之外的话都是null
// 如果是数字默认是0小数是0.0
// boolean默认是false
// char: 反斜杠u0000 表示一个unknown也是0
// 构造类的初始化 创建一个学生对象
// 有没赋值的时候系统会默认给其赋个值
Student s1=new Student();
s1.name="宝气";
s1.study();
s1.sayHello("马克");
/**
*
到这一步_jvm虚拟机就会在内存空间里面找有没有Student这个类
如果已经加载了这个信息我们这里可以直接用
如果没加载就在类里面找到并加载,找不到就会报错,它找的是class字节码文件的类
通过类加载器Class Loader加载Student类的信息,
加载后,在方法区中就有了类的信息
s2是一个局部变量 建一个对象把对象的值覆盖这个变量
new Student()这是调用我们的构造器
只要通过new构造的对象都会丢到堆里面去
(通过赋值符=指向s2的地址)
*
*/
Student s2=new Student();
/**
* 方法区(也是堆)
* 方法区():也是堆的一部分!类的信息(代码), static变量, 常量池(字符串常量)等.
存放:类的代码信息,static变量,常量池(字符串常量......)
* 代码
* 一堆属性
* Study(){
* ......
* }
*
* sayHello(){
* ......
* }
* static变量(以后再说)
* 常量池(字符串常量...)
* "宝气","宝气22","宝气333"
*
*
*/
/**
* 堆
* 堆(不连续 , )堆:放置new处的对象
"new出来的模板"
* 这里存的是地址(引用)
*
* name=null
* id:0;
* age:0;
* gender:null;
* weight:0;
*
* study:
* sayHello:
*
* 通过study:指向study()
* 通过sayHello:指向sayHello()
*
* 通过赋值符=指向s1的地址
*
*
*/
/**
* 栈
* 栈(自动分配连续的空间,后进先出)放置:局部变量
* s1 地址
*
* 栈里面要进行操作开一个栈针(每个方法对应一个栈针),用完就没有了(斯泰格福瑞姆)
*/
// 它方法区里面的对象通过引用赋值给堆里面的name地址(引用),
// 然后指向s2的地址
// 通过study:指向study()
// 通过赋值符=指向s2的地址
// 基本数据类型是可以直接赋值的
s2.age=18;
s2.name="宝气";
// study()会指向它的方法 堆里面
// 栈里面要进行操作开一个栈针(每个方法对应一个栈针),
// 用完就没有了(斯泰格福瑞姆)
s2.study();
// sayHello()会指向它的方法 堆里面
// 找到s2后指向一个study:再找到Study()方法
s2.sayHello("宝气22");
Student mt=new Student();
int i=3,j=4,k=5;
int result =mt.add(i, j, k);
// 调用方法调用的形式:对象引用.方法名(实参列表)
// 实参的数目,数据类型和次序必须和所调用方法声明的形参列表匹配
System.out.println(result);
}
}
本文来自博客园,作者:神奇的梦,转载请注明原文链接:https://www.cnblogs.com/fantasticDream/p/16274167.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~