什么是类和对象?this引用是什么?Java如何初始化对象?

目录

一.什么是面向对象

面向过程:

面向对象:

二.类与对象 

类的概念

类的定义格式

对象的概念

注意

关于类和对象的说明

三.this引用

为什么要有this引用?

什么是this引用

this引用的特性

四.对象的构造及初始化

构造方法

特性

就地初始化


一.什么是面向对象

        类和对象是属于面向对象编程中的概念,在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

要搞清楚面向对象,我们还是得拿面向过程来进行比较,就拿洗衣服这个事件进行举例

面向过程:

如果是面向过程,那我们的设计思路就是一步一步来一个一个功能来,其中少了一个环节都不可以,其中每一个环节,我们都需要关注其中的细节,而且这样的设计是不可逆的,对于不同的衣服,我们需要的时间,拧干的力度,都是不同的,如果将来我们要设计“洗鞋子”的话,这个程序就完全不再适用了

面向对象:

但如果是面向对象的思路的话,我们并不关心其中每一步的过程如何,我们只需要划分出来几个对象,让几个对象各司其职,相互之间也不关心彼此的内部细节

我们将整个洗衣服的过程,划分出4个对象:“人”,“衣服”,“洗衣机”,“洗衣粉”,整个过程由4个对象相互交互完成,人也不需要关心洗衣机是怎么转的,衣服是怎么被洗干净的,我们只需要知道我们把衣服和洗衣服交给洗衣机,我们就可以得到洗干净的衣服了


二.类与对象 

类的概念

在了解了面向对象的思维和概念后,我们就可以打开类和对象的大门了,面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。

在上图左侧,我们可以看见一系列的参数,这些参数是在简单的描述这个洗衣机该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),而这个过程对应在我们的面向对象编程就是的概念,类是用来对一个实体(对象)来进行描述的主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。也就是说,类就是我们对于现实世界中的事物或者概念的抽象而对于这种抽象的概念,我们可以使用面向对象的编程语言描述出来

  比如:洗衣机,我们在Java中可以将其看成是一个类别。
  • 属性:产品品牌,型号,产品重量,外观尺寸,颜色...
  • 功能:洗衣,烘干、定时....  

类的定义格式

在java中定义类时需要用到 class 关键字,其中:
  • class为定义类的关键字
  • ClassName为类的名字
  • { } 中为类的主体,类中包含的内容称为类的成员
  • 属性主要是用来描述类的,称之为类的成员属性或者类成员变量
  • 方法主要说明类具有哪些功能,称为类的成员方法
具体语法如下:
// 创建类
class ClassName {
        field;         // 字段(属性) 或者 成员变量
        method;   // 行为 或者 成员方法
}

比如对于我们刚才说到的洗衣机,我们可以做出如下定义:

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("定时功能");
    }
}

对象的概念

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

比如我们这里有个狗的类,叫做Dog,它有俩个成员变量,俩个成员方法

class Dog {
    public String name;//名字
    public String color;//颜色
    
    // 狗的行为
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
    }
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
    }
}

我们可以使用 new关键字来为狗这个概念实例化一个对象,在下面这段代码中,就代表了我们对狗这个类实例化了一个对象Labrador(拉布拉多),而这条Labrador(拉布拉多)的名字叫“豆豆”,是黑色的皮毛,会汪汪叫会摇尾巴

    public static void main(String[] args) {
        Dog Labrador = new Dog();
        Labrador.name = "豆豆";
        Labrador.color = "黑色";
        Labrador.barks();
        Labrador.wag();
    }

一个类允许有多个对象,也就是说,我们这里还可以示例化很多对象,这里就表示我们这个Dog类有俩个对象,分别是Labrador(拉布拉多)和Husky(哈士奇),他们都有各自的属性和方法

    public static void main(String[] args) {
        Dog Labrador = new Dog();
        Labrador.name = "豆豆";
        Labrador.color = "黑色";
        Labrador.barks();
        Labrador.wag();
        
        Dog Husky = new Dog();
        Labrador.name = "二哈";
        Labrador.color = "黑白相间";
        Labrador.barks();
        Labrador.wag();
    }

注意

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

关于类和对象的说明

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


三.this引用

为什么要有this引用?

先看一个日期类的例子:
public 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() {
        System.out.println(year + "/" + month + "/" + day);
    }
    
    public static void main(String[] args) {
        // 构造三个日期类型的对象 d1 d2 d3
        Date 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();
    }
}
以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题,但是细思之下有个疑问:

形参名不小心与成员变量名相同的话会是怎么样呢?

在这种情况下,编译器很难对我们给出的方法进行判断,那方法体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?

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

什么是this引用

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

public 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(this.year + "/" + this.month + "/" + this.day);
    }
}

this引用的特性

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

四.对象的构造及初始化

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败
public static void main(String[] args) {
    int a;
    // Error:(26, 28) java: 可能尚未初始化变量a
    System.out.println(a);
}

构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次,我们可以利用构造方法的这个特性来对对象初始化
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(2023, 11, 5); // 输出Date(int,int,int)方法被调用了
        d.printDate();
    }
}

特性

  • 名字必须与类名相同
  • 没有返回值类型,设置为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);
        }
    }

另外构造方法中,可以通过this调用其他构造方法来简化代码,但需要注意this(...)必须是构造方法中第一条语句

public class Date {
    public int year;
    public int month;
    public int day;
    
    // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
    // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
    // 但是this(1900,1,1);必须是构造方法中第一条语句
    public Date() {
        //System.out.println(year); 注释取消掉,编译会失败,因为this(...)必须是构造方法中第一条语句
        this(1900, 1, 1);
        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 Date(){
        this(1900,1,1);
        }
public Date(int year, int month, int day) {
        this();
        }

就地初始化

是指在声明成员变量时,就直接给出了初始值
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();
    }
}



本次分享就到此为止了,感谢您的支持,如有不同意见,欢迎评论区积极讨论,私信都会看的,您的三连支持就是博主分享的最大动力,我那我们下次再见

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

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

相关文章

51单片机应用从零开始(九)·数组

目录 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 2. 用 P0 口显示字符串常量 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 C语言中的字符型数组是一种数据类型,它是一个由字符组成的序列,以空字符\0结尾。在声明字符型数组时,需要指…

CnosDB FDW:打通一扇通往PostgreSQL世界的大门

本文档提供了下载、安装和使用 CnosDB FDW 的简要说明。请根据您的实际需求和环境对文档进行调整。 概述 CnosDB FDW 是一个用于在 PostgreSQL 数据库中访问 CnosDB 数据库的外部数据包装器(Foreign Data Wrapper)。它提供了在 PostgreSQL 中查询 CnosD…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络,基于开源的代码,专为科研用户设计。 软件无线电架构,构建真实5G移动通信系统 X410 采用了目前流行的异构式系统,融合了FP…

思维模型 赫洛克效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。及时反馈,激发动力。 1 赫洛克效应的应用 1.1 赫洛克效应在管理中的应用 美国惠普公司是一家全球知名的科技公司,该公司非常注重员工的激励和认可。在惠普公司&…

[RoFormer]论文实现:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

文章目录 一、完整代码二、论文解读2.1 注意力机制2.2 绝对位置编码2.3 相对位置编码2.4 旋转位置编码Long-term decayAdaption for linear attention 2.5 模型效果 三、过程实现四、整体总结 论文:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING …

操作系统·存储器管理

根据冯诺依曼原理,程序必须先存储在内存中,才可以执行。 在多道程序并发执行的系统存储器管理非常重要。 5.1 存储器管理的功能 5.1.1 主存分配与回收 要完成内存的分配和回收工作,要求设计者选择和确定几种策略和结构: 1.调入…

基于springboot + vue体育馆使用预约平台

qq(2829419543)获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:springboot 前端:采用vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件&#xf…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数,是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组&…

设计模式基础(1)

目录 一、设计模式的定义 二、设计模式的三大类别 三、设计模式的原则 四、主要设计模式目录 4.1 创建型模式(Creational Patterns) 4.2 结构型模式(Structural Patterns) 4.3 行为型模式(Behavioral Patterns&…

怎样使用rtsp,rtmp摄像头低延时参于Web视频会议互动直播

业务系统中有大量的rtsp,rtmp等监控直播设备,原大部分都是单一业务监控直播之类,目前很多业务需要会议互动,需要监控参会,提出需摄像头拉流参会的需求,由于rtmp,rtsp原生不支持web播放&#xff…

并发编程2:Java 加锁的原理和JVM对锁的优化

为什么要加锁 在多进程的环境下,如果一个资源被多个进程共享,那么对资源的使用往往会表现的随机和无序,这显然是不行的。例如多个线程同时对控制台输出,每个线程都输出的是完整的句子但是多个线程同时同时输出,则输出…

如何购买阿里云服务器

作为一家全球领先的云计算服务提供商,阿里云提供了多种云产品和解决方案,包括云服务器、对象服务OSS、数据库、存储、SSL、域名和CDN等。阿里云服务器是一种灵活可扩展的云计算服务,适用于各种规模和类型的企业和个人用户。阿里云以其出色的性…

重启路由器可以解决N多问题?

为什么重启始终是路由器问题的首要解决方案? 在日常的工作学习工作中,不起眼的路由器是一种相对简单的设备,但这仍然是我们谈论的计算机。 这种廉价的塑料外壳装有 CPU、随机存取存储器 (RAM)、只读存储器 (ROM) 和许多其他组件。 该硬件运行预装的软件(或固件)来管理连接…

【多线程】-- 10 线程同步synchronized方法/块

多线程 6 线程同步 同步方法 由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括以下两种用法: ​ synchronized方法和synchronized块 …

会声会影2023序列号免费永久序列号和激活码下载使用(附破解补丁)

前言 会声会影2023破解版免费下载是经过修改的视频剪辑软件,它能够免费为您提供很多功能。会声会影2023免费下载提供超过 1500 种独特的效果,可让您提升自我。会声会影破解版是用于是制作独一无二的视频的最强大、功能最全的软件。 它是一个简单而快速的…

【算法】滑动窗口题单——5.多指针滑动窗口醒醒⭐

文章目录 930. 和相同的二元子数组解法1——前缀和 哈希表解法2——滑动窗口 ⭐ 1248. 统计「优美子数组」1712. 将数组分成三个子数组的方案数⭐⭐⭐2444. 统计定界子数组的数目解法——多指针滑动窗口代码2——简洁写法:一次遍历O(1) 空间🐂⭐ 992. K…

docker部署jupyter

文章目录 1.搜索镜像2.拉取镜像3.创建挂载4.运行容器4.查看容器运行运行状态5.token查看6.访问jupyter 1.搜索镜像 docker search jupyter: 命令用于在 Docker Hub 上搜索名为 “jupyter” 的镜像。搜索结果显示了一个名为 “jupyter/datascience-notebook” 的镜像&#xff0…

掌握大型语言模型(LLM)技术:推理优化

原文链接:Mastering LLM Techniques: Inference Optimization | NVIDIA Technical Blog 大模型相关技术文章已整理到Github仓库,欢迎start! 堆叠Transformer层以创建大型模型可以获得更好的准确性、few-shot学习能力,甚至在各种语言任务中具有…

python 运用pandas 库处理excel 表格数据

文章目录 读取文件查看数据数据选择数据筛选创建新列计算并总结数据分组统计 读取文件 Pandas 是一个强大的数据分析库,它提供了丰富的数据结构和数据分析工具,其中之一是用于读取不同格式文件的 read_* 函数系列。以下是一个简单介绍如何使用 Pandas 读…

HDMI之数据岛

概述 发送端在发送视频信号之前,将多媒体信息通过数据岛传输给接收端。接收端通过数据岛信息获取当前分辨率(VIC),编码信息(RGB/YCR等),色彩空间,位深等等。然后对应将视频信息解码。与此同时,多余的带宽用于传输音频信息等。本文通过具体的包信息(从实验室仪器拍照…