JVM内存模型

-
程序计数器:当前线程执行的字节码的行的指示器。
-
本地方法栈:jvm虚拟机使用的native方法服务
-
虚拟机栈:创建栈帧,用于存储局部变量,操作数栈,动态连接,方法的返回地址。
-
堆:所有线程所共享的一块内存区域(数组,分配到堆里面。所有的new 关键字)
-
方法区(元空间):线程所共享,常量池
-
GC(不定时垃圾回收器):一些不使用的内存给回收,程序员不需要手动去操作,它会自动回收
方法内的基本数据类型内存变化
基本数据类型栈的内存变化
-
先进后出的原则
-
不会改变彼此的数据,独立的,是一个指向
-
数据存在栈里面,是可以共享的
引用数据类型的栈堆内存的变化
方法调方法,基本数据类型和引用数据类型
-
需求:定义一个add计算器的方法,
递归
定义:方法自己调用自己。
需求:不使用递归计算5的阶乘。
public class RecursionDemo {
public static void main(String[] args) {
int a=5;
int ret =1;
for (int i = 5; i >1; i--) {
ret*=i;
}
System.out.println(ret);
}
}
需求:使用递归计算5的阶乘。
public class RecursionDemo2 {
public static void main(String[] args) {
System.out.println(recursion(5));
}
public static int recursion(int a){
if(a==1){
return 1;
}
return a*recursion(a-1);
}
}
常见错误:java.lang.StackOverflowError 栈溢出
软件设计的概况
-
软件的生命周期
-
提出需求
-
分析及其规划
-
软件的设计,程序的编码(自己调试,联调)
-
上测试环境,交给测试人员(找bug)
-
linux 上线(运维人员维护,修改bug,系统升级)
-
-
软件设计的原则
-
可复用性
-
可拓展性
-
可维护性
-
高内聚,低耦合(让模块之间相互独立,提高代码的可维护性)
-
-
需求:做饭,写代码实现(买菜,做饭,做菜,吃饭,洗碗)。
面向过程

-
方法与方法之间的关系(方法自己处理,或者方法调用方法)
-
存在问题:从上往下的设计方式,分别考虑每个方法要干啥,很难细分
-
面向对象

-
站在对象的角度去考虑问题(类与类之间的调用和操作,把每一个类拆分成不同的功能)
-
面向对象的三大特征
-
封装:将对象的细节隐藏起来,通过公共的方法来调用,实现功能
-
继承:做到一些重复代码的复用
-
多态:可以把子类赋给父类对象,调用的时候,还是调用的子类,表现出不同的特征
-
-
类:具有相同特征和行为的事物的抽象。
-
电脑:cpu 内存 电源
-
人类:名字 身高 体重 年龄 血压
-
-
对象:类的实例,类是对象的模板。
类的定义
-
成员变量
-
方法
public class 类名{ 0-N个 字段(成员变量); 0-N个 方法; }对象的创建和使用
-
使用 new 关键字,堆内存里面开辟空间, new 类名();
-
给成员变量(字段)设置初始值
直接对象名. P.name = "小军";
-
获取对象名 .字段名
-
实例方法的调用 对象名.方法名();
-
需求:
-
定义学生类诶(姓名 ,年龄 ,住址等字段),定义一个介绍方法,分别介绍学生的信息
-
定义书类(科目,页码,出版时间),定义一个介绍方法,分别介绍书本信息,给上面字段初始化赋值,并且调用方法打印信息。
//定义学生类
public class Student {
String name;
int age;
String address;
public void introduceInfo(String name,int age,String address){
System.out.println("姓名:"+name+","+"年龄:"+age+","+"住址:"+address);
}
}
//定义书本类
public class Book {
String subject;
int page;
String publishDate;
public void introduceInfo(String subject, int page, String publishDate) {
System.out.println("科目:" + subject + "页码:" + page + "出版时间:" + publishDate);
}
}
//测试方法
public class Test {
public static void main(String[] args) {
//创建对象
Student student = new Student();
//属性赋值
student.name = "小军";
student.age = 26;
student.address = "重庆";
//对象调用方法
student.introduceInfo(student.name,student.age,student.address);
Book book = new Book();
book.subject = "数学";
book.page=55;
book.publishDate="2022.5.2";
book.introduceInfo(book.subject,book.page,book.publishDate);
}
}
构造方法
public Student(){
}
-
作用:创建对象
-
特点:
-
无参数
-
无返回值
-
默认构造方法体里面
-
使用public修饰
-
不能用static修饰
-
-
构造器支持重载(参数列表不一致)
static关键字
修饰符:
static:静态的,修饰方法,字段(变量),内部类,执行最快,优先加载
静态代码块执行优先于构造方法
public class Game {
public Game(){
System.out.println("开启第一局游戏。");
}
static {
System.out.println("游戏资源加载中......");
}
public Game(String str){
System.out.println(str);
}
public static void main(String[] args) {
Game game1 = new Game();
Game game = new Game("进入中");
}
}
///游戏资源加载中......
//开启第一局游戏。
//进入中
注意:
-
静态代码块执行优先于方法
-
主方执行顺序,从上往下。
-
静态方法只可以访问静态成员,非静态方法可以访问静态成员。
什么时候使用static字段及其方法?
-
在开发中,写工具类
-
资源加载,加载配置文件(mysql jdbc)
本文介绍了Java内存模型,包括程序计数器、本地方法栈、虚拟机栈、堆和方法区的作用。讲解了基本数据类型和引用数据类型在栈和堆中的内存变化,并通过递归计算阶乘的例子展示了栈溢出错误。此外,讨论了软件设计的生命周期、原则,以及面向过程和面向对象编程的区别。最后,阐述了构造方法、静态关键字的使用场景以及何时使用静态字段和方法。
12万+

被折叠的 条评论
为什么被折叠?



