小王java学习打卡day05——jvm内存模型,递归,面向对象,构造方法

JVM内存模型

img

  1. 程序计数器:当前线程执行的字节码的行的指示器。

  2. 本地方法栈:jvm虚拟机使用的native方法服务

  3. 虚拟机栈:创建栈帧,用于存储局部变量,操作数栈,动态连接,方法的返回地址。

  4. 堆:所有线程所共享的一块内存区域(数组,分配到堆里面。所有的new 关键字)

  5. 方法区(元空间):线程所共享,常量池

  6. GC(不定时垃圾回收器):一些不使用的内存给回收,程序员不需要手动去操作,它会自动回收

方法内的基本数据类型内存变化

基本数据类型栈的内存变化

  1. 先进后出的原则

  2. 不会改变彼此的数据,独立的,是一个指向

  3. 数据存在栈里面,是可以共享的

引用数据类型的栈堆内存的变化

方法调方法,基本数据类型和引用数据类型

  1. 需求:定义一个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 栈溢出

软件设计的概况

  1. 软件的生命周期

    • 提出需求

    • 分析及其规划

    • 软件的设计,程序的编码(自己调试,联调)

    • 上测试环境,交给测试人员(找bug)

    • linux 上线(运维人员维护,修改bug,系统升级)

  2. 软件设计的原则

    • 可复用性

    • 可拓展性

    • 可维护性

    • 高内聚,低耦合(让模块之间相互独立,提高代码的可维护性)

  3. 需求:做饭,写代码实现(买菜,做饭,做菜,吃饭,洗碗)。

    面向过程

    1. 方法与方法之间的关系(方法自己处理,或者方法调用方法)

    2. 存在问题:从上往下的设计方式,分别考虑每个方法要干啥,很难细分

面向对象

  1. 站在对象的角度去考虑问题(类与类之间的调用和操作,把每一个类拆分成不同的功能)

  2. 面向对象的三大特征

    • 封装:将对象的细节隐藏起来,通过公共的方法来调用,实现功能

    • 继承:做到一些重复代码的复用

    • 多态:可以把子类赋给父类对象,调用的时候,还是调用的子类,表现出不同的特征

  3. 类:具有相同特征和行为的事物的抽象。

    • 电脑:cpu 内存 电源

    • 人类:名字 身高 体重 年龄 血压

  4. 对象:类的实例,类是对象的模板。

类的定义

  1. 成员变量

  2. 方法

    public class 类名{
        0-N个
        字段(成员变量);
        
        0-N个
        方法;
    }

    对象的创建和使用

    1. 使用 new 关键字,堆内存里面开辟空间, new 类名();

    2. 给成员变量(字段)设置初始值

      直接对象名. P.name = "小军";

    3. 获取对象名 .字段名

    4. 实例方法的调用 对象名.方法名();

需求:

  1. 定义学生类诶(姓名 ,年龄 ,住址等字段),定义一个介绍方法,分别介绍学生的信息

  2. 定义书类(科目,页码,出版时间),定义一个介绍方法,分别介绍书本信息,给上面字段初始化赋值,并且调用方法打印信息。

//定义学生类
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(){
    
}
  1. 作用:创建对象

  2. 特点:

    • 无参数

    • 无返回值

    • 默认构造方法体里面

    • 使用public修饰

    • 不能用static修饰

  3. 构造器支持重载(参数列表不一致)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值