当前位置: 首页 > news >正文

Java SE:类与对象的认识

类与对象的认识

  • 1.对于类与对象的认识
  • 2.类的定义及使用
    • 2.1类与对象的初步认识
    • 2.2类的定义格式
  • 3.类的实例化
    • 3.1什么是实例化?
    • 3.2 类和对象的说明
  • 4.this引用
    • 4.1 为什么要用this引用?
    • 4.2this引用的特性
  • 5.对象的构造及初始化
    • 5.1构造方法

1.对于类与对象的认识

我们之前学习c语言就是在面向过程。面向过程注重过程是如何实现的。

以洗衣服为例,面向过程的解决思路如下:

把衣服浸湿
倒入洗衣液
搓衣服
换水
拧干
晾衣服

面向过程维护或者扩展起来会比较麻烦

Java是一门面向对象的语言,注重对象间的协作与交互而不需要关注具体细节如何实现。

依旧以洗衣服为例,面向对象的解决思路如下:

衣服
洗衣液
洗衣机

此时我们就只需要关注人,衣服,洗衣液,洗衣机之间的关系,不需要关注洗衣机内部如何工作。

2.类的定义及使用

2.1类与对象的初步认识

是对对象的特性的描述,对象的具体实例。
以洗衣机为例,所有洗衣机都有品牌,功率,型号,容量,工作方式等特性。依据这些特性我们才能生产出符合要求的洗衣机。

2.2类的定义格式

定义类需要使用 class 关键字。

class text {
field; //字段/属性/成员变量
method; //方法
}
  • class 紧随其后的是类名。{ }内部是类的主体。
  • 类包含的内容称为类的成员。
  • 属性是用来描述类的,称为类的成员属性或类成员变量。
  • 方法用于说明类的功能,称为类的成员方法。

这样我们就可以创建一个洗衣机类:

class WashingMachine{public String brand;//品牌public String type;//型号public double capacity;//容量public double power;//功率public void washClothes(){System.out.println("洗衣功能");}public void dryClothes(){System.out.println("脱水功能");}
}

注意: 类名命名为大驼峰,方法命名为小驼峰。

3.类的实例化

3.1什么是实例化?

定义一个类后相当于在计算机中创建了一个类型,类似于int , double
用类创建对象的过程就成为类的实例化
Java中使用 new 关键字来实例化对象。

public static void main1(String[] args) {    WashingMachine w1 = new WashingMachine(); w1.washClothes(); w1.dryClothes();}

注意:

  • 类后紧跟对象的命名。
  • 使用 . 来访问对象的属性或方法。

运行结果:
在这里插入图片描述

3.2 类和对象的说明

  • 类相当于模型,用于对一个实体进行描述,限定了成员。
  • 类是一种自定义类型,可以定义定义变量。
  • 一个类可以实例化多个对象,实例化出的对象占用实际的物理空间,储存类成员变量。
  • 做一个比方,类相当于建筑图纸,并没有占用实际空间。而实例化对象相当于照着图纸建造房子,此时可以储存数据。

4.this引用

4.1 为什么要用this引用?

举个例子:构造函数形参与成员变量不同命名时,我们可以很好的区分

class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(Date this){System.out.println(this.year + "/" + this.month + "/" + this.day);}
}
public class C0507 {public static void main(String[] args) {// 构造三个日期类型的对象 d1 d2 d3Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();// 对d1,d2,d3的日期设置d1.setDay(2020, 9, 15);d2.setDay(2020, 9, 16);d3.setDay(2020, 9, 17);// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}

但如果当形参名与成员变量名相同,我们就需要思考:

  1. 究竟是谁赋值给谁?是成员变量给成员变量?还是参数给参数?
 public void setDay(int year, int month, int day){year = year;month = month;day = day;}
  1. 三个对象都调用了setDay()和printDate()函数,但是这两个函数没有任何有关对象的说明,那么setDay()是如何知道应该设置哪个对象的信息,printDate()是如何知道应该打印哪个对象的信息??

事实上,编译器不会报错,这是的变量默认为最近小括号内部的变量,这里也就是形参。这相当于自己给自己赋值,是无效的
在这里插入图片描述

为了方便区分局部变量和成员变量,用 this.变量 来指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有的成员变量的操作都可以通过this引用去访问。

 public void setDay(int year, int month, int day){this.year = year;this.month = month;this.day = day;}

4.2this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
  2. this只能在成员方法中使用。
  3. 在成员方法中,this只能引用当前对象,不可以指向其他对象
  4. this是成员方法的第一个隐藏参数,编译器会自动传递,不需要手动编写。当成员方法执行时,编译器会负责将调用成员方法对象的引用传递给成员方法,this负责接收。
    在这里插入图片描述

5.对象的构造及初始化

Java中未初始化的局部变量不能使用。
在这里插入图片描述

这时只需要在创建变量时初始化就可以直接使用。
类中的字段也可以初始化。

5.1构造方法

构造方法是一个特殊的成员方法,名字与类名相同,在创建对象时,由编译器自动调用,并且整个对象的生命周期只调用一次。

注意:

  • 名字必须与类名相同,没有返回值,也不可以写void
  • 创建对象由对象自动调用,并且在对象的生命周期只调用一次(相当于人出生,每个人只能出生一次)
  • 构造函数的作用是对对象中的成员进行初始化,并不负责为对象开辟空间
  • 构造方法可以重载(可以根据需求输入不同参数来调用不同的构造方法)
public class Date {public int year;public int month;public int day;// 无参构造方法public Date(){this.year = 1900;this.month = 1;this.day = 1;
}// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}

上述两个构造方法名字相同,参数列表不同,因此构成了方法的重载。
注意:

  • 如果没有显式定义,编译器会自动生成默认的无参的构造方法。
http://www.lryc.cn/news/597268.html

相关文章:

  • 编程语言Java——核心技术篇(二)类的高级特性
  • Python 程序设计讲义(9):Python 的基本数据类型——复数
  • LeetCode|Day23|326. 3 的幂|Python刷题笔记
  • Flask框架全面详解
  • Element中ElMessageBox弹框内容及按钮样式自定义
  • 服务器版本信息泄露-iis返回包暴露服务器版本信息
  • [Linux入门] Linux 文件系统与日志分析入门指南
  • Linux中scp命令传输文件到服务器报错
  • (Arxiv-2025)利用 MetaQueries 实现模态间迁移
  • 在 Ubuntu 上将 Docker 降级到版本 25.0.5 (二) 降低版本,涉及兼容性问题
  • 欧盟网络安全标准草案EN 18031详解
  • 我用EV-21569-SOM评估来开发ADSP-21569(十三)-SigmaStudio Plus做开发(4)
  • sqlsuger 子表获取主表中的一个字段的写法
  • 进程间通信之-----零拷贝
  • AI替代人工:浪潮中的沉浮与觉醒
  • 【Java学习|黑马笔记|Day21】IO流|缓冲流,转换流,序列化流,反序列化流,打印流,解压缩流,常用工具包相关用法及练习
  • Log4j2漏洞复现
  • 论文解析 基于遗传算法增强YOLOv5算法的合成数据风力涡轮叶片缺陷检测
  • mysql什么时候用char,varchar,text,longtext
  • 什么是HTTP长连接、短连接?谁更能抗DoS攻击?
  • C# 正则表达式
  • C#使用socket报错 System.Net.Sockets.SocketException:“在其上下文中,该请求的地址无效。
  • 抽奖系统(2)——注册/登陆
  • C#面向对象三大特性的封装
  • C#定时任务实战指南:从基础Timer到Hangfire高级应用
  • 【系统全面】常用SQL语句大全
  • 避坑:C# json反序列化为float精度丢失
  • 棱镜技术在光谱相机中应用
  • 第八章 W55MH32 HTTP Client示例
  • 机器人行业工商注册企业基本信息数据(1958-2023年)