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)