【Java】/*类和对象(上)*/

目录

一、什么是类、什么是对象

二、为什么要学习类和对象

三、初识面向过程和面向对象编程 

四、如何定义类

4.1 语法形式

4.2 定义示例

示例一:定义一个描述学生的类

示例二:定义一个描述冰箱的类

示例二:定义一个描述狗的类

4.3 修改public修饰的主类名称

五、如何实例化一个对象

5.1 语法形式

5.2 实例化的对象在内存中的分析

5.3  如何通过对象的引用访问对象的成员变量和对应类的成员方法

5.4 类和对象的关系

六、this引用

6.1 为什么了解this引用

6.2 什么是this引用

​6.3 this引用的特性

七、非静态成员变量初始化方式

方式一:

方式二:

方式三:

方式四:

方式五:

八、构造方法

8.1 概念

8.2 特性


一、什么是类、什么是对象

1. 一切实体皆可称为对象,例如:冰箱、小狗、学生等。

2. 类是用来描述对象的一个引用数据类型,它和C语言中的结构体类似。

二、为什么要学习类和对象

答:是为了更好的面向对象编程

三、初识面向过程和面向对象编程 

四、如何定义类

4.1 语法形式

说明:(class、类名、如何修饰类、在Java文件中定义几个类,main方法、怎么修改主类名,类中写些什么,成员变量有默认值)

1. 定义类要用到class关键字

2. 类名采用大驼峰的形式。

3. 注意一下,类前面的修饰只会出现两种情况:① public修饰 ② 无修饰。

4. 一个源文件中最多有一个public修饰的类,且这个类的类名要与Java源文件名保持一致,这个被public修饰的类又称为主类。

5. 通常一个Java文件中只会写一个类,使用ideal集成开发环境创建一个Java文件后,编译器会在该Java文件中自动生成一个主类框架。

6. 程序的入口main方法只能放在被public修饰的类中使用,main方法的书写规范:public static void main(String[] args) { //... }。为什么main方法要用static修饰?答:JVM在运行Java应用程序时,首先会调用main方法,调用时并不会自动实例化这个类的对象,而是通过类名直接调用main方法,因此需要用static修饰。

7. 不要轻易修改public修饰的主类名称,如果非要修改,可以通过开发工具修改(具体操作见下面的 <4.3 修改public修饰的主类名称> 中的内容)。

8. 定义类时一般会对对象的两个方面进行描述(也可根据实际需要自行决定是否要将这两个方面描述完整):一个是对象的属性,另一个是对象拥有的行为。通常我们会把属性称为成员变量,行为称为成员方法。 

9. 成员变量在没有初始化之前都会有一个默认值(也就是说成员变量可以不初始化就可以直接使用而不报错):基本数据类型除boolean类型的默认值是false外,其余的默认值都是0值,引用数据类型的默认值都是null

10. 此处我们在定义成员变量、成员方法时为什么均采用public修饰,以及定义成员方法时为什么没有用static修饰,看到后面就会理解了。

4.2 定义示例

示例一:定义一个描述学生的类

class Student {
    String name;
    int age;
    double score;
    
    public void set() {
        System.out.println(name + " " + age + "" + score);
    }
    
    public void eat() {
        System.out.println(name + "正在吃饭...");
    }
}

示例二:定义一个描述冰箱的类

class WashMachine {
    public String brand; // 品牌
    public String type; // 型号
    public double weight; // 重量
    public double length; // 长
    public double width; // 宽
    public double height; // 高
    public String color; // 颜色
    
    public void washClothes(){ // 洗衣服
        System.out.println("洗衣功能");
    }

    public void dryClothes(){ // 脱水
        System.out.println("脱水功能");
    }

    public void setTime(){ // 定时
        System.out.println("定时功能");
    }
}

示例二:定义一个描述狗的类

class Dog {
    public String name;//名字
    public String color;//颜色
    
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
    }

    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
    }
}

4.3 修改public修饰的主类名称

注意:使用开发工具只能修改只存在一个类的Java文件中主类的名称,因为如果一个Java文件中有多个类,编译器不知道要改哪个类的类名(它并不会主动识别哪个是主类)。

五、如何实例化一个对象

5.1 语法形式

1. 实例化对象要用到new关键字。

2. 在方法中(并不限定只能在main方法中,其他的方法也行),写上类名 + 变量名 = new 类名();就可以实例化出一个对象了。

5.2 实例化的对象在内存中的分析

说明:上面代码中,在main方法中分别用new关键字实例化了两个Dog类型的对象,分别是dog1和dog2(它们是引用数据类型的变量,简称引用),它们里面存的是其所指向对象的地址,且dog1和dog2引用由于在方法中,故它们是局部变量,局部变量的内存在栈中开辟空间,注意:成员变量和局部变量的生命周期、作用域是不同的。Java中给对象所开辟的空间在堆区。每个对象都有自己独有的成员变量,但并没有自己独有的成员方法,因为方法是用来调用的,并不需要开辟空间存放。综上有了如下所示的内存分布。

5.3  如何通过对象的引用访问对象的成员变量和对应类的成员方法

对象+(.)+成员变量/成员方法

5.4 类和对象的关系

1. 类只是一个模型,用来对一个实体进行描述,限定。

2. 类是一种自定义的类型,可以用来定义变量。

3. 一个类可以实例化出多个对象类不占内存空间,实例化出的对象占用实际的内存空间,用于存储对象的成员变量。 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子。设计图只设计出需要什么东西,但是并没有实体的建筑存在。类只是描述了对象会有哪些特征,并没有正真的对象存在,不会占用实际的内存空间。

六、this引用

6.1 为什么了解this引用

问题一:在下图中使用对象的引用调用非静态的成员方法时(红色框起来的部分),非静态成员方法的参数中并没有关于对象的描述,编译器怎么知道非静态成员方法中下图中绿色部分指的是哪个对象的成员变量?

 

问题二:当非静态成员方法的形参名与成员变量名不小心相同时为什么这样赋值,使用日期类中的printDate方法打印出来的结果会发现赋值没有成功?

6.2 什么是this引用

1. this引用和当前调用成员方法的引用指向的是同一个对象

2. 在非静态的成员方法中对所有非静态的成员变量/成员方法的调用,都是通过this引用去访问的

3. 在所有的非静态成员方法的参数列表中其实都隐藏了形参this,例如上面的代码示例中,setDate方法的完整表示应该为:public void setDate(Date this, int y, int m, int d) { //... };

4. 上面的问题一,编译器怎么知道成员方法绿色部分指的是哪个对象的成员变量?答:是通过编译器自动传递的参数this知道的。

5. 上面的问题二,当成员方法的形参名与成员变量名不小心相同时,编译器采用局部变量优先的原则,类中的setDate方法中所有的year、month、day代表的都是形参year、month、day而不是成员变量中的year、month、day,所以造成了赋值并没有成功。

6. 建议在非静态的成员方法中调用非静态的成员变量/成员方法时,都给非静态的成员变量/成员方法前加一个this,相当于明确说明了这个非静态的成员变量/成员方法是哪个对象的

6.3 this引用的特性

1. this的类型:哪个引用调用的非静态成员方法this就和哪个引用的类型一致

2. this只能在非静态的成员方法中使用

3. 在非静态的成员方法中,this引用只能找到所指向对象的成员变量/方法(但并不推荐去找静态的成员变量/方法,因为静态的成员变量/方法并不依赖于对象),不能找到其他对象的成员变量/方法

4. this引用是非静态成员方法的第一个隐藏的形式参数,在非静态成员方法执行时,编译器会负责将调用非静态成员方法的引用所指向的对象的地址传递给形参this

5. 代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的。

七、非静态成员变量初始化方式

方式一:

成员变量用public修饰,在main方法中采用引用+(.)+成员变量的方式初始化。

方式二:

在类中定义成员方法的形式初始化成员变量。

方式三:

在创建类时,就给成员变量初始化,但这种初始化方式没有什么意义,因为不可能所有对象的成员变量的值都是一样的。(这种初始化方式也叫,就地初始化)。

方式四:

利用构造方法,顺便初始化 。(下面会具体介绍构造方法是什么)。

方式五:

在类中利用构造代码块初始化。 (<类和对象(下)>会介绍Java中的代码块)

八、构造方法

8.1 概念

1. 方法的构成:返回类型 + 方法名称 + 参数列表 { //方法体 };

    构造方法:方法名称(和所在类的类名一致) + 参数列表 { //方法体 };

2. ① 构造方法的名字与所在类的类名一致,没有返回值类型,设置为void也不行。

    ② 一般情况下使用public修饰构造方法,特殊场景下会被private修饰(后序讲单例模式时会遇到)。

    ③ 在实例化对象时由编译器自动调用,并且在对象的生命周期内只调用一次

    ④ 构造方法是一种特殊的成员方法,构造方法的作用就是对对象中的非静态成员变量进行初始化,并不负责给对象开辟空间

8.2 特性

① 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。

    例如上图代码中带参数的构造方法,和不带参数的构造方法就构成了方法的重载。

    我们可以使用开发工具生成所有可能构成的构造方法,步骤如下图。

② 如果没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。 

③ 如果有自己定义的构造方法,编译器不会再提供不带参数的构造方法,如果此时又想使用不带参数的构造方法就得自己去写了。例如,下图中自己已经定义了带参数的构造方法,在示例化对象时,new的后面没有给构造方法传参数,就会报错。

④ 可以通过this(...);在构造方法中调用其他的构造方法来简化代码。

注意1:this(...)必须是构造方法中第一条语句。

 

 注意2:使用this();不能形成环,否则会报错。

 本篇文章已完结,谢谢支持哟 ^^ !!!

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

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

相关文章

【HUST】信道编码|基于LDPC码的物理层安全编码方案概述

本文对方案的总结是靠 Kimi 阅读相关论文后生成的&#xff0c;我只看了标题和摘要感觉确实是这么回事&#xff0c;并没有阅读原文。 行文逻辑&#xff1a;是我自己设定的&#xff0c;但我并不是这个研究领域的&#xff0c;所以如果章节划分时有问题&#xff0c;期待指出&#x…

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

机器学习补充学习

1、Adaboost算法 Adaboost算法是一种集成学习方法&#xff0c;通过结合多个弱学习器来构建一个强大的预测模型。核心思想&#xff1a;如果一个简单的分类器在训练数据上犯错误&#xff0c;那么它在测试数据上也可能犯错误。 Adaboost通过迭代地训练一系列的分类器&#xff0c…

哪款电脑桌面日历记事本软件好用?推荐优秀的电脑日历记事本

对于众多上班族而言&#xff0c;每天在电脑前忙碌已成为生活常态。若想提升工作效率&#xff0c;简化繁琐的工作流程&#xff0c;选择一款出色的电脑桌面日历与记事本软件就显得至关重要。 然而&#xff0c;在Windows操作系统上设定提醒显得相当繁琐&#xff0c;而系统自带的记…

【Linux】fork和exec中的信号继承探索

fork和exec中的信号继承探索 一、结论二、代码验证2.1 代码编写2.2 代码执行 三、linux源码验证四、APUE中的验证五、其他 一、结论 fork时子进程会继承父进程的信号处理方式&#xff0c;包括父进程设置信号为SIG_DFL或SIG_IGN或捕获后设置自定义处理函数。exce时子进程会继承…

计算机系统的层次结构

操作系统的定义 操作系统&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的接口和环境&#xff1b;它是计算机系统中最基…

【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

亚马逊SFP有何优势?跨境卖家又该如何申请?

一、亚马逊SFP概述 亚马逊SFP(Seller Fulfilled Prime)是亚马逊为卖家提供的一项物流计划&#xff0c;旨在让满足条件的卖家能够将其产品纳入Prime服务&#xff0c;获得Prime标识&#xff0c;并直接面向Prime会员市场。通过SFP&#xff0c;卖家可以获得亚马逊的流量倾斜&#…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检测…

vue项目中如何使用iconfont

导读&#xff1a;vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用&#xff0c;默认黑色图标&#xff0c;无法修改颜色Symbol 支持多色图标&#xff0c;更灵活&#xff0c;推荐 一、unicode 略 二、Font class 方式一&#…

完美解决原生小程序点击地图markers上的点获取不到对应的坐标信息

需求&#xff1a;地图上有多个markes点&#xff0c;点击每一个获取对应的数据&#xff0c;再根据当前的坐标信息去调用导航。 出现的问题&#xff1a;每次点击的时候获取不到对应的坐标信息&#xff0c;获取到的信息显然不是想要的 原因&#xff1a; 因为你的id不是number类型&…

阿里云手机adb远程连接出现adb问题unauthorized解决

执行adb shell出现下面错误 adb.exe: device unauthorized. This adb servers $ADB_VENDOR_KEYS is not set Try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your device.解决&#xff1a;导入和绑定adb的密钥 重启云手机

[Redis]常见数据和内部编码

相关命令 type (key) type 命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列 表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有…

[36#]私有化部署地图套装(全球版)

私有化部署地图套装&#xff08;全球版&#xff09;&#xff0c;是由全球高清卫星影像与100%全球水陆覆盖高程数据组成的全球三维地图套装。 私有化部署地图套装&#xff08;全球版&#xff09; 我们在《难以置信&#xff0c;谁还会用离线地球》一文中&#xff0c;为大家分享…

7 Series FPGAs Integrated Block for PCI Express IP核 Advanced模式配置详解(三)

1 TL Settings Transaction Layer (TL)设置只在Advanced模式下有效。 Endpoint: Unlock and PME_Turn_Off Messages: 与端点的电源管理相关&#xff0c;允许发送解锁和电源管理事件关闭消息。 Root Port: Error Messages: Error Correctable&#xff08;错误可纠正&#xff09…

IO游戏设计思路

1、TCP ,UDP ,KCP ,QUIC TCP 协议最常用的协议 UDP协议非常规的协议&#xff0c;因为需要在线广播&#xff0c;貌似运营商会有一些影响 KCP 基于UDP的协议&#xff0c;GitHub - l42111996/java-Kcp: 基于java的netty实现的可靠udp网络库(kcp算法)&#xff0c;包含fec实现&am…

增强版 Kimi:AI 驱动的智能创作平台,实现一站式内容生成(图片、PPT、PDF)!

前言 基于扣子 Coze 零代码平台&#xff0c;我们从零到一轻松实现了专属 Bot 机器人的搭建。 AI 大模型&#xff08;LLM&#xff09;、智能体&#xff08;Agent&#xff09;、知识库、向量数据库、知识图谱&#xff0c;RAG&#xff0c;AGI 的不同形态愈发显现&#xff0c;如何…

GEO数据挖掘-PCA、差异分析

From 生物技能树 GEO数据挖掘第二节 文章目录 探针注释自主注释流程(了解)PCA图、top1000基因热图探针注释查看示例代码 top 1000 sd 热图离散基因热图&#xff0c;top1000表达基因&#xff0c;只是看一下&#xff0c;不用放文章里 差异分析火山图差异基因热图转换id富集分析-K…

安装mpi4py与dlio_profiler_py的总结

安装mpi4py mpi4py是一个Python库&#xff0c;它提供了与MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能够利用MPI实现并行计算。mpi4py 的核心是基于MPI标准的C/C实现&#xff0c;它能够在高性能计算环境下进行高效的并行处理…

网页版收银系统比安装板收银系统的四大优势

在当今竞争激烈的零售市场中&#xff0c;高效的收银系统对于连锁实体店的管理至关重要。随着科技的不断发展&#xff0c;网页版收银系统成为越来越多零售企业的首选。网页版收银系统以其灵活性、可定制性和便利性&#xff0c;成为现代零售业的利器。本文将探讨网页版收银系统相…