java面向对象 + 内存解析

这篇博客主要是重点讲解一些内存和一些规定的解释,对于定义我不会过多赘述,没有Java基础的话可以去翻看我之前的博客,学习完成之后再进行阅读。

面向对象可以说是Java中最重要的一部分了,这次复习我发现有几个点比较重要,这里分享给大家

引入:

小明今天想要一辆玩具车,他获取这辆玩具车有两个选择

1、自己准备,轮子,车架,电池等等原料进行拼接,然后组装起来就成了。

2、直接淘宝买一辆

这就是区别所在,如果选择方案一的话,你需要一步一步的完成这辆车,你需要做很多重复性的工作,组装,填充,打磨等等,但是我只是想要这辆车,我并不会组装怎么办呢?这时可以选择第二种方案直接买一辆。你只需要三个动作,淘宝搜索->选中购买->支付。是不是方便了很多?

面向对象就是说,我们不需要直到这个功能怎么实现的,正如我可以不知道玩具车怎么组装的但是并不妨碍我们使用他。只需要知道用的时候进行调用已封装好的方法即可。

代码实现

定义类:

类是一种用户自定义的数据类型,它包含了数据(属性)和操作数据的方法(行为)。通过定义类,我们可以创建具有相似特征和行为的对象(实例)。

以下是Java中类的一些关键概念:
 

public class Car {
    // 属性
    String brand;
    int year;

    // 方法
    public void start() {
        System.out.println("The car is starting...");
    }

    public void stop() {
        System.out.println("The car is stopping...");
    }
}

创建对象:
对象的创建:通过类定义,我们可以创建一个或多个具有相同属性和方法的对象。对象是类的实例。例如:

public class Main {
    public static void main(String[] args) {
        // 创建Car类的对象
        Car car1 = new Car();
        Car car2 = new Car();
    }
}
  1. 属性:属性是类中的变量,用于存储对象的状态。在上述示例中,brandyearCar类的属性。

  2. 方法:方法是类中的函数,用于描述对象的行为。在上述示例中,start()stop()Car类的方法。

  3. 访问修饰符:Java中的访问修饰符用于控制类、属性和方法的可见性。常见的访问修饰符有:public(公共的,无限制访问)、private(私有的,仅在类内部访问)和protected(受保护的,仅在类及其子类中访问)。

构造函数:构造函数是一种特殊的方法,用于在创建对象时初始化对象的属性。构造函数的名称与类名相同,且没有返回类型。例如:

public class Car {
    String brand;
    int year;

    // 构造函数
    public Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }
}

举例:

现在我们举一个基本的例子,我想要定义一个规定人的类,这个类有着唱歌,吃饭的方法。那么我应该怎么定义呢?

public class Person {
    String name ;
    int age;
    String gender;
    public Person(){

    }
    public Person(String name,int age,String gender){
        this.age = age;
        this.gender = gender;
        this.name = name;
    }

    public  void sing(){
        System.out.println(this.name+"唱歌");
    }
    public  void dance(){
        System.out.println(this.name+"跳舞");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

使用这个类创建1个叫张三的人和1个叫李四的人。那么我们根据上面知识进行构造函数的调用。得到两个对象 lisi zhangsan 此时我们执行各自的sing和dance方法

class Main{
    public static void main(String[] args) {
        Person zhangsan = new  Person("张三",18,"男");
        Person lisi = new  Person("李四",18,"女");
        zhangsan.sing();
        zhangsan.dance();
        lisi.sing();
        lisi.dance();
    }
}

得到结果

new 关键字的作用是调用构造方法

这个过程由虚拟机调用不需要手动调用,每创建一次对象,就会调用一次构造方法。

new关键字用于创建对象,它会在堆内存中分配一块空间来存放新创建的对象,并返回一个指向该对象的引用。

构造方法是一种特殊的方法,它与类同名且没有返回值,主要用于对象的初始化工作。

过程中的内存讲解

使用new关键字创建对象是将对象创建在堆中的,main方法中的zhangsan lisi是在栈中创建的,之所以可以调用zhangsan.sing()和lisi.sing()是因为,调用new Person()创建完成之后,会返回一个指向堆区中创建的这个对象信息的地址,将这个地址赋值给zhangsan lisi,此时就可以调用储存在堆中的属性和方法了

关系图:zhangsan.sing() === 001.sing()
zhangsan === 001

创建一个对象的过程:

栈分析和垃圾回收:

在栈中,当main()方法加载的时候,此时main()方法进栈,进栈之后,在main方法中zhangsan lisi 被创建,两个变量进入main中。 此时zhangsan.sing()调用,sing()方法进栈,调用结束后后出栈,同理main()方法调用结束出栈。

垃圾回收:当main方法出栈之后,此时zhangsan lisi已经被销毁,堆区中的001内存 和002 内存没有任何变量指向,无法再被访问,此时jvm自动进行垃圾回收。

就近原则

了解完上面的栈操作,我们可以解释一下为什么变量调用遵循就近原则

在Java中,每当定义一个新的作用域(比如一个代码块、方法或者类),都会创建一个新的栈帧(stack frame)。栈帧是用来存储局部变量和方法调用相关信息的内存区域。

当程序执行到一个新的作用域时,会将该作用域中的局部变量和方法参数添加到栈帧中。当程序离开该作用域时,栈帧会被弹出,局部变量和方法参数也会被销毁。

由于栈的工作方式是"后进先出"(LIFO,Last-In-First-Out),所以在同一个作用域中,最后定义的变量会被放在栈的顶部,也就是离栈顶最近的位置。因此,当我们在同一个作用域中使用一个变量时,就近原则会选择离栈顶最近的那个变量。

这样设计的好处是可以有效地管理变量的生命周期,并且保证变量在正确的作用域内使用。同时,也减少了命名冲突的可能性,提高了代码的可读性和维护性。

this关键字的本质

this关键字本质上就是创建的堆空间的地址他的值就是返回给main中接受的变量如zhangsan lisi。

所以使用this关键字调用的方法就是对象的方法,调用的变量就是对象的属性。

public  void sing(){
    System.out.println(this.name);
    this.dance();
    System.out.println(this.name+"唱歌");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/214780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust日报】2023-12-02 深度学习框架 Burn 发布 v0.11.0

深度学习框架 Burn 发布 v0.11.0 深度学习框架 Burn 发布 v0.11.0,新版本引入了自动内核融合(Kernel Fusion)功能,大大提升了访存密集型(memory-bound)操作的性能。同时宣布成立 Tracel AI (https://tracel…

深入理解 Kafka 集群搭建与管理

Apache Kafka 作为分布式流处理平台的核心,其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略,以助力读者更深层次地理解和灵活运用 Kafka 集群。 Kafka 集群基础 1 集群…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前,问答网站已经成为人们获取知识、交流思想的重要平台。然而,对于许多开发者来说,从头开始构建一个问答网站可能会面临各种挑战。今天,小编给大家介绍一款基于PHP的开源问答网站平台源码系统,它不仅源码全部开源&am…

HR看好的字符函数和字符串处理函数!!!

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的,可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 在本篇…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据,可以使用turf.js 随机生成点,并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

如何在线给官网搭建一个帮助文档?

在数字化时代,帮助文档已成为官网不可或缺的一部分。然而,传统的帮助文档往往只是简单地罗列问题和答案,缺乏互动性和用户体验。那么,如何在线给官网搭建一个富有创意且用户友好的帮助文档呢? | 一、打造沉浸式体验 传…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站,这个是由于证书失效了,临时解决方式是: 第一种方案: 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下,然后输入“thisisunsafe”(页…

逻辑漏洞测试靶场实验

任务一: 突破功能限制漏洞,要求突破查询按钮disabled限制,获取编号:110010的查询内容(弹框中的flag) 任务二:用户信息泄露漏洞,通过回显信息,以暴力破解法方式猜测系统中…

Shell循环:expect(二)

expect实战:公钥推送 一、准备工作:安装expect,装备公钥 二、通过shell循环判断主机在线 #!/bin/bash #脚本编写 #创建一个IP地址文件 >ip.txt #使用for循环ping测试主机是否在线 for i in {3..254} do{ip192.168.151.$iping -c1 -W…

docker搭建rabbitmq、配置延迟队列插件

docker搭建rabbitmq、配置延迟队列插件 消息队列的作用:消峰、解耦、异步 rabbitmq安装 查询 [rootlocalhost ~]# docker search rabbitmq安装 [rootlocalhost ~]# docker pull rabbitmq准备工作 创建文件夹:/usr/local/software/rabbitmq/data 运…

【设计模式-4.3】行为型——责任链模式

说明:本文介绍设计模式中行为型设计模式中的,责任链模式; 审批流程 责任链模式属于行为型设计模式,关注于对象的行为。责任链模式非常典型的案例,就是审批流程的实现。如一个报销单的审批流程,根据报销单…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局,给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

麒麟系统添加环境变量

环境变量添加方法 方法一:用户主目录下的.profile或.bashrc文件(推荐) 登录到你的用户(非root),在终端输入: sudo vim ~/.profile 或者 sudo vim ~/.bashrc 翻到该文件最后&#xff0c…

字符串转换整数

字符串转换整数 描述 : 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符&am…

[ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…

nodejs微信小程序+python+PHP问卷调查系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

java源码-Java方法的定义和使用详解

1、 方法定义 如果我们想定义一个方法,基本语法如下: 修饰符:方法的修饰符是可选的,用于定义该方法的访问类型,可用的修饰符包括public/private/protected/默认的。 返回值:方法可以有返回值,…

《Junit单元测试》

目录 SpringBoot2.2.0版本之前的单元测试模式 SpringBoot2.2.0版本之后的单元测试模式 SpringBoot2.4以上版本移除了默认对Vintage的依赖 SpringBoot2.2.0版本之前的单元测试模式 SpringBooot 2.2.0 版本开始引入Junit5作为单元测试默认库,之前的版本是使用Junit…

[二分查找双指针]LeetCode881: 救生艇

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本文涉及的基础知识点 二分查找算法合集 题目 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0…