Javase-类与对象

news2024/12/25 9:18:59

文章目录

      • 一 . 面向过程的初步认知
      • 二 . 如何创建一个类
      • 三 . 如何创建一个对象
      • 四 . this引用
      • 五 . 构造方法
      • 六 . 初始化

一 . 面向过程的初步认知

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人
们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

其实从我们开始学习编程到现在,我们一直都是在面向过程在编程,而从今天开始我们就要学会去面向对象来编程,在java的世界里面,一切皆是对象…

面向对象与面向过程的区别
我们拿洗衣服举例子
在这里插入图片描述
传统的洗衣服的过程,注重的是洗衣服的各种步骤,也就是注重的过程,中间少一个环节都可能完成不了工作,假设我们把这种映射到计算机,也就是每次处理一个问题都要有不同的方案,代码的可维护性大幅度下降
线代洗衣服的过程
在这里插入图片描述
总结一下
其实面向对象和面向过程的区别就是,面向对象解决问题的方式是通过多个对象之间的相互协作来对一个系统性的信息进行处理,这样就会更加的高效,代码的可维护性及其可复用性将会大幅度上升

二 . 如何创建一个类

类与对象的关系就好像设计图与房子,类就是一个设计图,但是不是一个实体,房子就是根据设计图创造出来的实体,也就是有实际的存储空间

创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}

其实class前面还可以加上一些修饰符进行修饰,但是我们不明确这个修饰符的具体含义到底是什么,但是目前可以确定的是,一个文件中只能有一个public修饰的类,而且类名必须与文件名保持一致,但是也可以没有public修饰的类
一个文件中最好只有一个类,其实也可以有多个类,而且每一个类都有其各自的main方法,鼠标右击进行运行的时候在哪个类运行哪个类的main方法
下面我们创建一个洗衣机类

class WashMachine {

    /**
     * 下面其实也就是这个洗衣机类的成员变量,也可以称之为字段/属性
     * 在现阶段修饰符你就只管写public,后续再说
     * 成员变量是定义在方法外部,但是在类的内部,声明周期与局部变量是不一样的
     */
    public String brand;
    public String type;
    public double length;
    public double width;
    public double height;
    public double weight;

    /**
     * 这其实是这个类的成员方法,也可以称之为实例方法/行为
     * 在现阶段我们所有的类的实例方法修饰符都加上public 请记住,我们暂时不去加上static
     * 在方法内部定义的变量我们称之为局部变量,比如我们在下面定义的 a = 10
     * 与实例变量不同,该局部变量的生命周期从方法调用创建,调用结束后销毁
     */
    public void wash(){
        int a = 10;
        System.out.println("洗衣机正在洗衣服");
    }
    public void dry(){
        System.out.println("洗衣机正在甩干衣服");
    }
    public void setTime(){
        System.out.println("洗衣机的定时功能");
    }
}

如何在idea里面修改我们类的名称
在这里插入图片描述
找到rename修改就行

三 . 如何创建一个对象

刚刚的分析中,我们已经学会了如何写一个类,也就是相当于我们现在有了图纸,那下一步就是盖我们的房子了,在java中我们是通过new关键词来创建一个对象
并通过我们的**" . "**操作符来访问其中的成员变量或者是成员方法
具体代码如下参考

 public static void main(String[] args) {

        //创建一个对象
        WashMachine washMachine = new WashMachine();

        //通过.操作符来访问成员变量
        washMachine.brand = "西门子";
        washMachine.type = "w3045";
        washMachine.height = 134.3;
        washMachine.width = 134.4;
        washMachine.weight = 45.75;
        washMachine.length = 121.3;

        //通过.操作符来访问成员方法
        washMachine.wash();
        washMachine.dry();
        washMachine.setTime();

    }

用new操作符创建对象时的内存分析
以上面的代码举例子,当用new操作符的时候,我们的jvm会在堆空间分配一块内存用来管理我们的对象数据
在这里插入图片描述
请注意此时我们在堆上产生了一个对象,但是这个空间中只有对象的属性,没有成员方法,具体实现机制在以后再说吧…
所以我们假设打印washMachine的值,打印出来的其实就是它里面保存的地址
在这里插入图片描述
上面的WashMachine@4eec7777其实就是我们的地址,其实我们java中的地址都是经过处理过的地址,这里其实显示的hashcode码

截至到这里,你应该已经完成了三项事情
1.学会创建类
2.学会创建对象
3.学会初始化对象

四 . this引用

this说白了就是一个当前对象的引用,或者说,就是当前对象
this的使用原则**,任何情况都别省略…**免得以后事多

在这里插入图片描述
假设这里的形式参数不是brand,那其实就可以不加this,但是我们的原则就是this都加上
那编译器怎么就知道this是啥呢,其实我们的方法在传参的时候默认传了一个this,但是程序员是不知道的
其实真实的情况就是像下面这样,显示传递之后是不会报错的在这里插入图片描述
this先懂这么些就行,下面的构造方法里面我们详细说一下this,插一张我们学this时候的分析图(我自己看的)
在这里插入图片描述

五 . 构造方法

所谓构造方法其实就是一种特殊的方法,构造方法的作用其实是对对象进行创建和初始化
构造方法与普通方法的不同之处就在于定义不一样,构造方法的定义一般是

(访问修饰符) 方法名称 (形式参数列表){
	方法体
}

与普通方法的不同之处就是构造方法没有返回值(void)也不行,其次就是构造方法的方法名称必须与类名保持一致
构造方法的特性如下

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

下面我们演示一下构造方法的定义

class Student {
    public String name;
    public int age;
    public double height;
    public double weight;

    下面是无参数的构造方法
    请注意系统会默认提供一个无参数的构造方法,如果你已经进行构造方法的定义,那就不会默认提供
    public Student(){
        System.out.println("正在调用无参数的构造方法...");
    }
    四个参数的构造方法
    public Student(String name,int age,double height,double weight){
        在上文我们已经说了这里隐式传递了一个this(是真的么)

        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
        System.out.println("现在正在调用四个参数的构造方法");
    }
   
}

其实在构造方法的时候,并没有隐式传递我们的this,解释如下
在这里插入图片描述
这其实是非常合理的,首先this是当前的对象的引用,而构造方法是为了构造当前的对象而产生的,你都没对象,怎么会传递的this啊…但是这里以我们目前的水平还是有点蒙圈…

在我们的构造方法种,也可以使用this(),来简化我们的代码
示例如下:

class Student {
    public String name;
    public int age;
    public double height;
    public double weight;

    public Student(){

		请你要注意这个this()一定要在所在语句的第一行
        this("ljh",19,183.1,75.3);
        System.out.println("调用了无参的构造方法");
    }
    
    public Student(String name,int age,double height,double weight){
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
        System.out.println("正在调用四个参数的构造方法");
    }

}

注意this()的这种写法,不可以形成环
在这里插入图片描述
这里构成我们的递归构造器调用,所以是不合理的…

六 . 初始化

默认初始化:
现在我们来解释一下上面的问题,临时变量如果不进行初始化就会报错,那为什么成员变量不会有这样的问题,下面我们来分析一下,在创建对象的时候,都发生了什么事情
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:

Date d = new Date(2021,6,9);
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题
    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
    数据类型 默认值
    byte 0
    char ‘\u0000’
    short 0
    int 0
    long 0L
    boolean false
    float 0.0f
    double 0.0
    reference null
  4. 初始化所分配的空间
    即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
  5. 设置对象头信息(关于对象内存模型后面会介绍)
  6. 调用构造方法,给对象中各个成员赋值

总结一句话,在调用我们的构造方法之前,就已经对成员变量进行了初始化操作

就地初始化:
就是在定义实例变量的同时进行我们的初始化操作

class Student {
    private String name = "ljh";
    private int age = 19;
    private char gender = '男';
    public static String classroom = "zzu112Java";
}

总结一下,初始化的方式有 代码块初始化,构造方法初始化,就地初始化,默认初始化
下面的几种初始化我们在后面的章节进行介绍…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE3项目学习系列--项目配置(二)

在项目团队开发过程中,多人协同开发为保证项目格式书写格式统一标准化,因此需要进行代码格式化校验,包括在代码编写过程中以及代码提交前进行自动格式化,因此需要进行在项目中进行相关的配置使之代码格式一致。 一、eslint配置 …

http和https的区别是什么?

–前言 传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同 一、传输信息安全性不同 1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。 2、h…

微信小程序开发学习笔记《18》uni-app框架-网络请求与轮播图

微信小程序开发学习笔记《18》uni-app框架-网络请求 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、下载网络请求包 这个包是以前黑马程序员老师写的一个包,跟着课程学习&#x…

六、西瓜书——聚类

1.聚类任务 聚类是一种无监督学习,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律。聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster). 2.聚类度量 聚类性能度量亦称聚类“有效性指标”(validity index)。在…

07.IO流

07. IO流 01. 文件 1. 什么是文件 ​ 文件对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件…都是文件。它既可以保存一张图片,可以保存视频,声音 2.文件流 ​ 文件…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前,数据应在一定时间内保持稳定,这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

【OJ】求和与计算日期

文章目录 1. 前言2. JZ64 求123...n2.1 题目分析2.2 代码 3. HJ73 计算日期到天数转换3.1 题目分析3.2 代码 4. KY222 打印日期4.1 题目分析4.2 代码 1. 前言 下面两个题目均来自牛客,使用的编程语言是c,分享个人的一些思路和代码。 2. JZ64 求123…n …

117.移除链表元素(力扣)

题目描述 代码解决 class Solution { public:ListNode* removeElements(ListNode* head, int val) {//删除头节点while(head!NULL&&head->valval){ListNode*tmphead;headhead->next;delete tmp;}//删除非头节点ListNode*curhead;while(cur!NULL&&cur-&g…

阿里云国际云解析DNS如何开启/关闭流量分析?

流量分析服务会涉及产生日志费用,所以开通内网DNS解析服务后,默认不会主动开启流量分析,需要您手动开启流量分析。对于未开启流量分析的用户,进入界面会提示您展示的都是模拟数据,您可以点击开启流量分析服务&#xff…

Vue+SpringBoot打造城市桥梁道路管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统,支持…

(十六)【Jmeter】取样器(Sampler)之测试活动(Test Action)

简述 操作路径如下: JMeter中的测试活动取样器实际上并不是一个具体的取样器类型,而是一种对测试计划中的多个取样器进行组合和执行的活动。常常被用作定时器,在某个请求之后等待多长时间。 参数说明 Logical Action on Thread(在线程上的逻辑操作) Pause Duration(mil…

“羊驼“入侵CV,美团浙大沈春华团队将LLaMA向CV扩展,构建全新基础模型VisionLLaMA

本文首发:AIWalker https://arxiv.org/abs/2403.00522 https://github.com/Meituan-AutoML/VisionLLaMA 本文概述 大型语言模型构建在基于Transformer的架构之上来处理文本输入, LLaMA 系列模型在众多开源实现中脱颖而出。类似LLaMa的Transformer可以用来处理2D图像吗&#xf…

关于数据库基本概念与基本介绍

​ 数据库是 一个组织良好的数据集合,旨在方便多个用户高效地共享信息资源 。以下是关于数据库的一些基本介绍: 1. 定义和目的:数据库是一个电子化的数据存储系统,设计用来存储、管理和检索数据。它允许用户或应用程序以各种复杂的…

【代码随想录算法训练营Day35】435.无重叠区间;763.划分字母区间;56.合并区间

文章目录 ❇️Day 36 第八章 贪心算法 part05✴️今日任务❇️435. 无重叠区间自己的思路自己的代码(✅通过81.59%)随想录思路随想录代码 ❇️763.划分字母区间自己的思路自己的代码(✅通过55.30%)随想录思路随想录代码 ❇️56. 合…

计算机网络-网络安全(二)

1.应用层安全协议: S-HTTP或SHTTP(Sec HTTP),安全超文本传输协议,是HTTP扩展,使用TCP的80端口。HTTPS:HTTPSSL,使用TCP的443端口。和TLS(传输层安全标准)是双…

Linux 安装 Mysql 8.0

获取 Mysql 8.0 在 /usr/local下 创建mysql文件夹 mkdir mysql切换到mysql文件夹下 cd mysql下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz解压mysql tar xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz重命名…

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中,经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上,使它们并排显示。在本文中,我们将介绍几种实现这一效果的CSS方法。 1. 使…

网络学习:SMart link技术与Monitor link技术

目录 一、SMart link技术 1.1、SMart link技术简介 1.2、SMart link技术原理及基础知识点 1、应用场景(举例): 2、运行机制 3、保护vlan 4、控制VLAN 5、Flush报文 6、SMart link的负载分担机制 7、SMart link角色抢占模式 二、Mo…

MySQL的Redo Log、Undo Log、Binlog与Replay Log日志

前言 MySQL数据库作为业界最流行的开源关系型数据库之一,其底层实现涉及多种重要的日志机制,其中包括Redo Log、Undo Log、Binlog和Replay Log。这些日志组件共同确保MySQL数据库系统在面对事务处理、数据恢复和主从复制等方面表现出色。本文主要介绍一下…

08 OpenCV 腐蚀和膨胀

文章目录 作用算子代码 作用 膨胀与腐蚀是数学形态学在图像处理中最基础的操作。其卷积操作非常简单,对于图像的每个像素,取其一定的邻域,计算最大值/最小值作为新图像对应像素位置的像素值。其中,取最大值就是膨胀,取最小值就是腐…