【JavaSE】-- 类和对象(1)

文章目录

  • 1. 面向对象的初步认知
    • 1.1 什么是面向对象
    • 1.2 面向对象与面向过程
  • 2. 类的定义和使用
    • 2.1 简单认识类
    • 2.2 类的定义格式
  • 3. 类的实例化
    • 3.1 什么是实例化
    • 3.2 类和对象的说明
  • 4. this引用
    • 4.1 为什么要有this引用
    • 4.2 什么是this引用
    • 4.3 this引用的特性
  • 5. 对象的构造及初始化
    • 5.1 构造方法
      • 5.1.1 概念
      • 5.1.2 特性
      • 5.1.3 默认初始化
    • 5.2 就地初始化

1. 面向对象的初步认知


1.1 什么是面向对象

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

1.2 面向对象与面向过程

传统洗衣服(面向过程):
在这里插入图片描述
现代洗衣服(面向对象):
在这里插入图片描述

2. 类的定义和使用


2.1 简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。

2.2 类的定义格式

在java中定义类时需要用到class关键字,具体语法如下:

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

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。

注意事项

  • 类名注意采用大驼峰定义
  • 成员前写法统一为public,后面会详细解释
  • 此处写的方法不带 static 关键字. 后面会详细解释
  1. 一般一个文件当中只定义一个类
  2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  3. public修饰的类必须要和文件名相同
  4. 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改.

3. 类的实例化


3.1 什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型。类(一种新定义的类型),有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

注意事项:

  1. new 关键字用于创建一个对象的实例.
  2. 使用 . 来访问对象中的属性和方法.
  3. 同一个类可以创建多个实例.注意事项:
  4. new 关键字用于创建一个对象的实例.
  5. 使用 . 来访问对象中的属性和方法.
  6. 同一个类可以创建多个实例.

public class Dog {public String name;public int age;public void eat(){System.out.println(name + "正在吃饭......");}
}
public class test {public static void main(String[] args) {Dog dog = new Dog();System.out.println(dog.name);// nullSystem.out.println(dog.age);// 0int a;System.out.println(a);// 报错}}

在这里插入图片描述
问题:局部变量在使用的时候要初始化。为什么在使用name和age的时候不报错,而使用a的时候却报错呢?
答:因为 name 和 age 是定义在类当中、方法外面的。它不是局部变量,它是成员变量,成员变量未初始化,它有一个默认值。

  • 遵循规则:
  1. 引用类型默认为null.
  2. 基本数据类型默认为0

通过对象的引用 可以去访问 对象的成员变量和对象的成员方法。


  • 可以通过关键字new可以实例化多个对象。
    在这里插入图片描述

3.2 类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量.
  3. 一个类可以实例化出多个对象,实例化出的对象 才能占用实际的物理空间,存储类成员变量

4. this引用


4.1 为什么要有this引用

public static void main(String[] args) {Date date = new Date();date.setDate(2008, 8, 8);date.printDate();
}
public class Date {public int year;public int month;public int day;public void setDate(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "年" + month + "月" + day + "日");}
}

此时,程序输出结果为:2008年8月8日

我们通过调用 setDate() 方法对year、month、day都赋了值,所以我们调用printDate()方法时,就会打印2008年8月8日

在这里插入图片描述


但是接下来我们来看另一个代码:

public class Date {public int year;public int month;public int day;public void setDate(int year, int month, int day){year = year;month = month;day = day;}public void printDate(){System.out.println(year + "年" + month + "月" + day + "日");}
}
public static void main(String[] args) {Date date = new Date();date.setDate(2008, 8, 8);date.printDate();Date date2 = new Date();date2.setDate(2009, 9, 9);date2.printDate();Date date3 = new Date();date3.setDate(20010, 10, 10);date3.printDate();
}

程序输出结果:

000000000

提出问题:
问题1:
这么多对象都调用了同一个setDate()方法,在这个方法内,它们是怎么区分是哪个对象调用的setDate()方法中的year、month、day。

问题2:
形参名和成员变量同名时,调用setDate()方法,却没有对year, month, day赋值。

答:在方法内,year, month, day都是局部变量。局部变量优先使用。
此时year = year; month = month; day = day;,程序认为左边的 year, month, day 和右边的 year, month, day 都是形参自己,所以出现了形参自己给自己赋值的情况,却并没有修改到对象当中的 year, month, day 。而在打印时,我们打印的是成员变量,而我们的成员变量并没有成功被赋上值,所以就出现了打印出来都是0的情况。

问题2的解决方案就是加一个this.

public class Date {public int year;public int month;public int day;public void setDate(int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void printDate(){System.out.println(this.year + "年" + this.month + "月" + this.day + "日");}
}

这样之后程序就能正常运行了。

4.2 什么是this引用

this就是代表当前对象的引用。 this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

哪个对象的引用 调用了 该方法 this就代表哪个对象。
在这里插入图片描述
问题:this是怎么传递的呢?
答:实际上它是隐藏的第一个参数,相当于public void setDate(Date this, int year, int month, int day){ , 这个参数可写可不写(一般情况下不写)。

习惯使用this!!!!

4.3 this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在"成员方法"中使用,this不能在静态方法中使用,只能在非静态方法中使用。
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。

注意:下图右侧中的Date类也是可以通过编译的
在这里插入图片描述

this的用法有3种:

  1. 可以通过this访问 当前对象的成员变量。
  2. 可以通过this访问 当前对象的非静态的成员方法。
  3. 可以通过this访问 当前对象的其他构造方法。

5. 对象的构造及初始化

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

5.1 构造方法


在这里插入图片描述
在这里插入图片描述

一个对象的生成至少有两步:

  1. 为对象分配内存。
  2. 调用合适的构造方法(构造方法不止一个)。

构造方法的作用:对当前对象的成员进行初始化。
实例化对象的时候可以借用构造方法对对象进行初始化。

5.1.1 概念

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

public class Date {public int year;public int month;public int day;// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次public Date(int year, int month, int day){this.year = year;this.month = month;this.day = day;System.out.println("Date(int,int,int)方法被调用了");}public void printDate(){System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {
// 此处创建了一个Date类型的对象,并没有显式调用构造方法Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了d.printDate(); // 2021-6-9}
}

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

构造方法快捷键:Alt + Insert / 鼠标右键–generate–Constructor

5.1.2 特性

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

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

  1. 当我们没有写任何的构造方法的时候, Java会提供一个默认的不带参数的构造方法。但是 一旦你有其他的构造方法, Java就不会再给你提供不带参数的构造方法了。
public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {Date d = new Date();d.printDate();}
}

上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
注意:一旦用户定义,编译器则不再生成。

public class Date {public int year;public int month;public int day;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();}
}
/*
Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;
需要: int,int,int
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
*/

注意:

  • this(…)必须是构造方法中第一条语句
  1. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰
  2. 在实例化不同对象时,就可以根据不同的构造方法进行初始化。

5.1.3 默认初始化

源文件要想让编译器运行这个源文件,只能通过javac生成二进制的文件才能让编译器看懂,所以就生成了字节码文件,要把这个程序运行起来,一定会运行在JVM中,通过java命令会将字节码文件加载到JVM中,此时这字节码文件就会被JVM解析成Class对象(Java中一切皆对象)。

在这里插入图片描述

优点:之前被加载过的类,就不会再重复加载了。

5.2 就地初始化

在声明成员变量时,就直接给出了初始值。

public class Date {public int year = 1900;public int month = 1;public int day = 1;public Date(){}public Date(int year, int month, int day) {}public static void main(String[] args) {Date d1 = new Date(2021,6,9);Date d2 = new Date();}
}

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

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

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

相关文章

增强GPT4v的Grounding能力,video-level

开源链接: appletea233/AL-Ref-SAM2: AL-Ref-SAM 2: Unleashing the Temporal-Spatial Reasoning Capacity of GPT for Training-Free Audio and Language Referenced Video Object Segmentation (github.com) In this project, we propose an Audio-Language-Refe…

Spring Boot中实现一个递归获取省市区行政区划代码

Spring Boot中实现一个递归获取省市区行政区划代码 写于20240924 10:23 在Spring Boot中实现一个递归获取省市区行政区划代码的功能,可以按照以下步骤进行。我们将使用Spring Data JPA来与数据库交互,并构建一个递归的方法来获取层级数据。 首先这里数据…

11周年 | 初心不改,焕新前行,奔赴下一个10年!

2024年8月13日,爱加密正式迎来了11岁生日,在爱加密肩负着崇高使命踏浪而行的10年间,蓝绿色的品牌标识一直伴于左右。随着时代的变迁以及市场需求的不断变化,企业同样也需要在品牌上做出创新递进,从而更加适应市场竞争的…

数据科学的秘密武器:defaultdict——Python字典的自动化填充神器,让数据结构更灵活

目录 什么是defaultdict 引入动机 创建与初始化 工作原理 自定义默认值函数 注意事项 使用案例 使用场景 1: 计数 使用场景 2: 分组数据 使用场景 3: 嵌套字典结构 进阶案例使用 进阶案例 1: 使用 defaultdict 实现词频统计并排序 进阶案例 2: 使用 defaultdict 实…

OpenCSG推出StarShip SecScan:AI驱动的软件安全革新

OpenCSG 导读 如今,IT 技术迅速发展,软件安全不仅是企业稳健运营的基础,更是整个社会经济体系安全的保障。加强软件安全,尤其是在开发阶段识别和修补漏洞,是企业必须重视的问题。国际数据公司(IDC&#xf…

MyBatis 入门教程-搭建入门工程

Maven作为一个优秀的项目构建和管理工具,在日常的开发中被大多数开发者使用,后续的项目也是基于Maven来构建。 创建一个Maven项目 利用IDEA创建项目工具来创建一个Maven项目 添加MyBatis的依赖 这里可以从Maven仓库地址中进行查看, https://mvnrepository.com/ 从这里可…

反汇编—switch

x64和x86分析类似 标号1的位置要计算出:减去(debug) / 加上(release)第一个case要等于0,因为第一个case在跳转表数组的0下标位置 通过1和2,可以知道它们应该是连续case,还要判断是否缺项,进入跳转表看 可以看到原本应…

经济型伺服电缸EMB系列

经济型伺服电缸系列特点 小型电缸,推力范围:5kg-1500kg 精巧设计 所有部件模块化组合,标准化,经济化 轧制滚珠丝杠,高效率,高速度 匹配经济型步进伺服电机驱动器一体化,可总线 can,erthercat等&…

NAS求变,“0成本、低门槛”的鲁大师能否脱颖而出?

互联网科技的高速发展,推动了全球信息爆炸的进程。如何高效地存储和使用这些海量数据成了困扰企业、乃至个人的一大难题。从U盘、到移动硬盘、再到各种网云盘、以及愈发大众化的NAS……存储解决方案也随着个人及家庭数据存储需求的不断增长而发展着。如今&#xff0…

shardingjdbc-读写分离配置

文章目录 1、application.yml2、shardingsphere.yaml3、创建实体类 User4、创建 UserMapper5、添加依赖6、读写分离测试7、事务测试 我们的主从复制已经提前搭建好: mysql-搭建主从复制:https://blog.csdn.net/m0_65152767/article/details/142214434 1…

AI最大的应用是什么,如何成为初代AGI产品经理?

❝ 在当今这个由数据驱动的时代,AI技术正以前所未有的速度发展,它不仅改变了我们与数字世界的互动方式,更在物理世界中掀起了一场革命。阿里巴巴集团CEO吴泳铭在2024云栖大会上的演讲,为我们描绘了AI技术未来的巨大潜力。他指出&a…

华为云长江鲲鹏深度赋能,大势智慧稳居“实景三维+AI”领域排头兵

本文转自长江日报大武汉客户端 走出象牙塔第10年,武汉大势智慧科技有限公司(以下简称“大势智慧”)已成长为国内三维技术创新及应用领域龙头企业,其自主研发的“重建大师”等三维测绘软件系统在各级测绘系统占有率达到87.5%。 这…

奇迹再现!帕金森患者6年后停药,竟能自如行走:背后的故事与启示

在医学的浩瀚星空中,总有一些故事如同璀璨星辰,照亮着患者与家属的希望之路。今天,我们要讲述的,就是一位与帕金森病抗争了6年之久的患者,如何在看似不可能的境遇下,实现了停药后自如行走的奇迹。这不仅是对…

前端——元素类型+文字样式

一、元素类型 1. 块级元素 >块级标签: div p h1~h6 ul ol li dl dt dd hr br等 还有表格标签 table 特征: 1.独占一行 不会共享一行的位置 2.不设置宽度 默认是继承父级宽度 100% 结构上没有父级那就是浏览器 3.高度不设置 默认由内容撑开 4.可…

mock虚拟接口技术

一、什么是mock mock指的就是使用mock创建出来的一个虚拟的接口 二、对于测试人员而言,我们为什么要使用mock 当我们进行接口测试时,如果对应的接口还没有开发好,但是我们又需要用到这个接口响应的信息,这个时候我们就可以使用…

学习threejs,绘制二维线

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言二、🍀绘制二维线1. ☘️…

筛子排序(SieveSort)

当你手头有了支持AVX-512(SIMD)的i9-11900K,你最想做什么? i9-11900K?现在都14代了,谁还用11代的? 但12代以上就没有AVX-512了! AVX-512有什么特别之处?有了这个硬件支…

Redis 的 Java 客户端有哪些?官方推荐哪个?

Redis 官网展示的 Java 客户端如下图所示,其中官方推荐的是标星的3个:Jedis、Redisson 和 lettuce。 Redis 的 Java 客户端中,Jedis、Lettuce 和 Redisson 是最常用的三种。以下是它们的详细比较: Jedis: 线程安全&…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

【Linux】Linux基本命令

目录 文件和目录操作: ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑: cat less head tail vi 或 vim sz/rz echo 系统信息和管理: su uname hostname df free top ps ki…