JavaSE 类与对象

news2024/11/19 4:22:18

前言

我们之前学的都是面向过程,面向过程研究的是对单个对象的一种方法实现过程,比如求一个数的阶乘,强调的是怎么实现这个方法的过程,但对我们以后来说,如果想要应用到更广的层面,不能只是学习一个方法的过程,而是通过用对象的方法与其他对象建立联系来实现一个项目,那么怎么让对象与对象建立联系呢?我们就需要学习面向对象的相关知识。

1. 面向对象的初步认知

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

传统的方式:注重的是洗碗的过程,少了一个环节可能都不行,按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。
2. 现代洗碗过程
总共四个对象:人 碗 洗洁精 洗碗机
整个过程就人打开洗碗机,把碗放到洗碗机,放洗洁精,关上洗碗机,洗碗机自己把碗洗完然后烘干。
整个过程就人,碗,洗洁精,洗碗机这四个对象相互完成,不需要管洗碗机是怎么把碗洗干净的,怎么烘干的。
在这里插入图片描述
以面向对象方式来进行处理,就不关注洗碗的过程,具体洗碗机是怎么来洗碗,如何来烘干的,用户不用去关
心,只需要将碗放进洗碗机,倒入洗洁精,启动开关即可,通过对象之间的交互来完成的。
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

2. 类定义和使用

2.1 简单认识类``
就我而言,类是指描述一个物品的大致摸样,是一个比较抽象的东西,类是不实的,也可以说是一个抽象的概念。
百度百科:java类就是具备某些共同特征的实体的集合,他是一种抽象的数据类型,它是对所具有相同特征的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。
那么在java中怎么去定义一个类?
2.2 类的定义格式
在java中定义类时需要用到class关键字,具体语法如下:

class Dog{
	//成员变量   属性   字段
	public String name;
	public int age;
	public String colour;
	//成员方法
	public void eat() {
	System.out.println("正在吃..........");
	}
	public void barks() {
	System.out.println(name + ": 旺旺旺~~~");
	}
}

class为定义类的关键字,Dog为类的名字,{}中为类的主体。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。
注意事项:
类名注意采用大驼峰定义
成员前写法统一为public,后面会详细解释
此处写的方法不带 static 关键字. 后面会详细解释

3. 类的实例化

3.1 什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

用代码实现在狗类中实例化一个狗的对象:

class Dog {
    //成员变量 属性  字段
    String name;
    int age;
    String colour;
    //成员方法
    public void eat() {
        System.out.println(name+"正在吃............");
    }
    public void barks() {
        System.out.println(name+"正在汪汪汪.........");
    }
    public void wag() {
        System.out.println(name+"正在摇尾巴.........");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.age = 2;
        dog.colour = "黑色";
        dog.wag();
        dog.eat();
        dog.barks();
    }
}

在这里插入图片描述
在main方法中创建一个dog对象,通过dog.成员方法去访问Dog类中的成员方法,运行出来的结果:
在这里插入图片描述
类中的成员变量是存储子在堆的实例化空间,每一个对象都有一个私有的实例化变量空间。当对象被创建时,它的实例化变量就会被初始化,并会储存该对象的成员变量值。

成员方法时存储在方法区的。

在这里插入图片描述

这是定义了两个类,一个Dog类,一个Test类,我在Test类中实例化了一个Dog类的对象dog,并且通过dog.成员方法以及dog.成员变量都能访问到Dog类中的成员变量和成员方法。

在这里插入图片描述
在同一个类中,如果我不实例化一个对象,我用类名Test.成员变量或成员方法都会报语法错误,我在这个类中实例化一个test对象之后,再用test.成员变量或者成员方法 这个时候是可以去访问Test类中成员变量和成员方法。

总结:不管是多个类还是一个类,想要去访问类中的成员变量或者成员方法,都需要去实列化一个对象,然后用对象+点号去访问成员变量和成员方法。

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

3.2 类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量.
  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东
    西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空

4. this引用

4.1 为什么要有this引用
先看一个日期类的例子:

class Date {
    public int year;
    public int month;
    public int day;

    public void setDay(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 class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();
        date1.setDay(2021,10,10);
        date2.setDay(2022,11,11);
        date3.setDay(2023,12,12);
        date1.printDate();
        date2.printDate();
        date3.printDate();
    }
}

以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。
但是细思之下有以下两个疑问:

  1. 形参名不小心与成员变量名相同:
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}

那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计
自己都搞不清楚了。
在这里插入图片描述
在调试的情况下可以看出访问这次方法并没有将值赋给类中的成员变量,而是赋给了该方法中的局部变量。
这是运行出来的结果:
在这里插入图片描述
修改一下这个代码:

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

加上this后的再看调试下的现象:
在这里插入图片描述
成功将值赋给了类中的成员变量。
我们再看看这个this的地址和对象的地址:
在这里插入图片描述
两个地址是相同的,说明this在这的作用就是代表当前对象的引用。

  1. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和
    printDate函数如何知道打印的是那个对象的数据呢?
 public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();
        date1.setDay(2021,10,10);
        date2.setDay(2022,11,11);
        date3.setDay(2023,12,12);
        date1.printDate();
        date2.printDate();
        date3.printDate();
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面几组图片可以来得到一个小细节,在你实例化了多个对象的时候,还有在成员有参方法中形参和成员变量相同时,用this关键字,这样计算机就知道哪一个对象在调用哪一个方法。
4.2 什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
4.3 this引用的特性

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

this关键字的用法:
1.this.成员变量
2.this.成员方法
3.this() (这个在后面讲)

5. 对象的构造及初始化

5.1 如何初始化对象
通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败.

public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

public static void main(String[] args) {
Date d = new Date();
d.printDate();
d.setDate(2021,6,9);
d.printDate();
}
// 代码可以正常通过编译

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
我上面就讲了每实例化一个对象就会有一个私有的实例化变量空间,这个实例化变量空间当对象被创建之后就会初始化,也会存储改对象的变量值。

5.2默认初始化

class Date {
    public int year;
    public int month;
    public int day;
    public void printDate() {
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }
}
public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.printDate();

这是运行后的结果:
在这里插入图片描述
在这里插入图片描述
5.3就地初始化
在声明成员变量时,就直接给出了初始值。

class Date {
    public int year = 2023;
    public int month = 11;
    public int day = 11;
    public void printDate() {
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }
}
public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.printDate();

重点我们要讲一下构造方法去初始化:
5.4 构造方法
5.4.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

class Date {
    public int year;
    public int month;
    public int day;
    public Date() {
        this.year = 2023;
        this.month = 11;
        this.day = 11;
    }
    public void printDate() {
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }
}
public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.printDate();

5.4.2 特性:

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
    方法重载:名字相同,参数列表不一样。
public Date(int year, int day) {
        this.year = year;
        this.day = day;
    }

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

    public Date() {
        this.year = 2023;
        this.month = 11;
        this.day = 11;
    }

上述代码就构造了方法重载,有两个参数,有三个参数,和没有参数。
在idea中可以快速创建重载方法:单击右键或者快捷键Alt+Insert
在这里插入图片描述
如果用户自己没有去定义构造方法,那么编译器会自己默认生成一个无参的构造方法并且调用。
如果用户定义了构造方法,那么编译器就不会去自己生成一个无参的构造方法。
上面讲到this不是还有这样的一种用法吗?
在这里就可以知道this的这种方法怎么用的了。
构造方法中,可以通过this调用其他构造方法来简化代码

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 Date() {
        this(2023,11,11);
    }
    public void printDate() {
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }
}
public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.printDate();

在这里我们通过this(2023,11,11)调用含三个参数的构造方法来实现对代码的简化。
注意:this(…)必须是构造方法中第一条语句
在这里插入图片描述
如果this()不是在构造方法中的第一条语句,那么就会报错。

在这里插入图片描述
不能成环,通过this()调用了三个参数的构造方法,再到那个三个参数构造方法通过this()调用无参数的构造方法,这是不被允许的。
如果是通过this()调用了一个含参数的构造方法,之后再这个含参数的构造方法利用this()去调用另一个含参数的方法,这样是被允许的。总之是不能闭环。

public Date( int month) {
        this.month = month;
    }

    public Date(int year, int day) {
        this(11);
        this.year = year;
        this.day = day;
    }

    public Date() {
        this(2023,11);
    }

本章完>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

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

相关文章

基于Qt Linux开发板USER-KEY按键实现

介绍如何在 Qt 应用上使用嵌入式 GET6818 Linux 开发板 上的按键。 工具:Qt Creator 5.14.2 平台:windows ## 资源简介 在GET6818 开发板,开发板板载资源上有两个用户按键。如下图原理图(下图开发板的按键原理图)。 ## 应用实例 想要监测这个 KEY0,首先出厂内核已经…

Linux是什么,Linux系统介绍

很多小伙伴都不是那么了解和知道Linux,到底Linux是什么? 像大家用到的安卓手机,生活中用到的各种智能设备,比如路由器,光猫,智能家具等,很多都是在Linux操作系统上。 Linux是什么?Li…

常见问题: (Windows/app/浏览器)总结及其研究———(不断更新中.....)

问题目录 手机电脑电脑qq如何多开分身电脑与手机无线传送数据的方法 浏览器下载如何利用技术下载网上图片 WindowsVMware Workstation1 无法创建11264MB的匿名分页文件:页面文件2 虚拟机安装Windows11时出现: tempting to start up from: EFI VMware Virtual N 百度…

Vuex:模块化Module :VCA模式

VCA中不支持辅助函数,因为辅助函数中是用this.$store,而VCA中没有绑定this的 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。 这句话的意思是,…

开源Gimp动态压感笔刷设置方法

一、问题描述 开源绘画工具的Gimp的笔刷压感在哪里控制和开启呢? 二、解决方法 1、Gimp有专用的笔刷集:如下图。开启需要在主窗口window下拉菜单开启,或在右侧面板里的左箭头按钮里打开。一般绘画够用了。比用自定义特殊笔刷。 2、如果要调…

win11系统提示msvcp140.dll丢失的解决方法,3个有效的解决方法

Win11系统在运行photoshop或其他软件,游戏的时候,电脑提示“找不到msvcp140.dll”,“msvcp140.dll丢失”,“无法定位输入点msvcp140.dll”等问题,都是由于Windows11系统中的msvcp140.dll文件丢失或者损坏了。 一、问题…

【开源】基于Vue.js的大学兼职教师管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0…

HTTP-FLV详解及分析

文章目录 前言一、HTTP-FLV 简介1、市场上使用 http-flv 的商家2、http-flv、rtmp 和 hls 直播的优缺点3、http-flv 技术实现 二、Nginx 配置 http-flv1、Windows 安装 nginx,已经集成 nginx-http-flv-module2、nginx.conf 配置文件3、运行 nginx 服务器4、ffmpeg 推…

Linux系统编程——文件操作原理

文件描述符 1.文件描述符是文件的索引: 对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。 int fd1 open("./file1",O_RDWR);…

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】一、入门知识讲解 (C关键字、命名空间、C输入&输出、缺省参数、函数重载)-CSDN博客 六 . 引用 (1). 引用的概念和特性…

内存管理

目录 C/C内存分布 引入 分析 说明 C语言内存管理方式:malloc calloc realloc free malloc realloc calloc 面试题 C内存管理方式 new/delete操作符 用法 new和delete操作自定义类型 operator new和operator delete函数 operator new ​编辑 operator…

什么是Ribbon的饥饿加载?有什么优势?

目录 一、什么是Ribbon 二、什么是饥饿加载 三、Ribbon饥饿加载的优势 四、Ribbon饥饿加载的劣势 一、什么是Ribbon Ribbon是一个开源的、基于HTTP和TCP的客户端负载均衡工具,它提供了一个简单的、基于配置的负载均衡策略,可以帮助开发人员更轻松地…

“护肤品销售策略:从“免费拼团”到“3人回本大放送”“

有一个销售护肤品的团队,他们家399块钱一套的护肤品,他们在小程序这一个渠道,只用了23天的时间,就卖出去了2000多万的营业额,你敢信吗? 那么23天的时间,他们是怎么卖出去2000多万的呢&#xff1…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻…

基于VSCode + PlatformIO创建运行第一个esp32程序

文章目录 使用VSCode创建项目安装驱动下载驱动安装驱动连接开发板电脑识别开发板 编写程序烧录程序第一步、编译程序第二步、烧录程序第三步、开发板观察效果 原理讲解项目源码 在之前的课程,我们已经介绍了ESP32单片机,并且也已经安装好了开发环境&…

upload-labs12-21关

第十二关 提示及源码 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],".")1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES…

C语言【趣编程】我们怎样便捷输出空心的金字塔

目录 1问题: 2解题思路: 3代码如下: 4代码运行结果如下图所示: 5总结: r如若后续有不会的问题,可以和我私聊; 1问题: 2解题思路: 方法:找规律&#xff0…

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。 虽然很简单的一个功能,但是网…

上拉电阻与下拉电阻

文章目录 上拉电阻下拉电阻上下拉电阻作用1、稳定信号2、减少电磁干扰3、提高驱动能力 大家在玩单片机的过程中,一定没少听过上拉电阻和下拉电阻这组名词,那么到底什么是上拉电阻和下拉电阻呢?今天我们一起来简单了解一下 上拉电阻 上拉电阻…

激光雷达标定板是自动驾驶系统中关键部件

中国政府制定了多项产业发展规划,包括《汽车产业中长期发展规划》和《新一代人工智能发展规划》等,旨在推动汽车产业的转型升级,培育具有国际竞争力的汽车品牌,同时鼓励企业加大对自动驾驶技术研发的投入,加快自动驾驶…