类和对象详解

目录

1.面向对象

1.1什么是面向对象

1.2与面向过程的比较

2类的定义和使用

2.1简单认识类

2.2类的定义格式

2.3类的实例化

2.3.1什么是实例化

2.3.2类和对象的说明

2.3.3this关键字

2.3.4什么是this引用

2.3.5this引用的特性

3.对象的构造和实例化

3.1对象的初始化

4.构造方法

4.1概念

4.2特性

5.默认初始化

6.就地初始化


1.面向对象

1.1什么是面向对象

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

1.2与面向过程的比较

假如我们需要去洗衣服,一般来说有两种方式,即手洗和机洗。手洗的话我们需要放水,添加洗涤剂,然后手搓,发现哪里有污渍,要用更大的力气去搓,以及洗完后用清水漂洗等等过程,而机洗呢,我们只需要把衣服放进去,加入洗涤剂,启动洗衣机即可。两种方式都可以达到衣物清洗干净的目的。手洗我们通常会关心怎么洗,而机洗却不用关心这个问题。虽然说两种方式都可以清洗衣物,手洗虽然费力但是省电省水,机洗虽然轻松,但是会费水费电。不能说哪种方式就一定更好。就像面向过程的语言执行起来效率更高,但是开发难度高,开发时间长,面向对象的语言开发效率高,难度低,但是执行起来很多时候并没有面向过程的语言那么地高效。孰优孰劣,两者并不能一概而论。

2类的定义和使用

2.1简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性,哪些功能。

2.2类的定义格式

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

//创建类

class ClassName {

        field;        //字段(属性)或者成员变量

        method;  //行为或者成员方法

}

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

类中包含的类容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者成员变量。

方法主要说明类具体有哪些功能,称为成员方法。

class WashMachine {
    public String brand;
    public double weight;
    public double height;
}
public void washClothes() {
    System.out.println("洗衣服的功能");
}
public void dryClothes() {
    System.out.println("脱水的功能");
}

采用Java语言将洗衣机类在计算机中定义完成,经过javac编译后形成class文件,在JVM的基础上计算机就可以识别了。

注意事项

  • 类名注意采用大驼峰定义
  • 成员前写法统一为public
  • 此处方法不带static关键字

2.3类的实例化

2.3.1什么是实例化

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

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

public class void mian(String[] args) {
    WashMachine n=new WashMachine();
    n.brand1="格力";
    n.wieght=195.3;
    n.height=1.4;
}
class WashMachine {
    String brand;
    double weight;
    double hieght;
}

注意事项

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

2.3.2类和对象的说明

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

2.3.3this关键字

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类中的成员方法对对象进行设置和打印。

但是细想一下会发现两个问题

1.形参不小与成员变量名相同

public void setDay(int year,int month,int day) {

        year=year;

        month=month;

        day=day;

}

那函数到底是在给谁赋值?这是一个说不清的问题了。

2.三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是哪个对象的数据呢?

所有的一切都需要this引用来解释。

2.3.4什么是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引用的是调用成员方法的对象。

public static void main(String[] args) {
    Date d = new Date();
    d.setDay(2020,9,15);
    d.printDate();
}

2.3.5this引用的特性

1.this的类型:对应类型类型引用,即哪个对象调用就是哪个对象的引用类型

2.this只能在成员方法中使用

3.在成员方法中,this只能引用当前对象,不能再引用其他对象

4.this是成员方法第一个隐藏参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责接收。

在代码层面来简单演示一下(下面右侧中的Date类也是可以通过编译的)

3.对象的构造和实例化

3.1对象的初始化

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

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

上述的代码要想通过编译只需要给a赋值即可。

但如果是对象的话情况却不一样了。

public static void main(String[] args) {
    Date d = new Date();
    d.printDate();
    d.setDate(2021,6,9);
    d.printDate();
}

虽然说可以通过编译,但需要调用前面写的SetDate方法才可以将具体的日期设置到对象中。

4.构造方法

4.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
    }
}

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

4.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();
    }
}

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

5.如果说用户没有显示定义,编译器会生成一份默认的构造方法,生成默认构造方法一定是无参的。

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
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
*/

6.构造方法中,可以通过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(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;
    }
}

注意:this(……)必须是构造方法中的第一句,也不能形成环。

public Date() {
    this(1900,1,1);
}
public Date(int year, int month, int day) {
    this();
}
/*
无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用
编译报错:Error:(19, 12) java: 递归构造器调用
*/

7.绝大多数情况下使用public来修饰,特殊场景下会被private修饰

5.默认初始化

我们发现了一个问题,成员变量在定义时,并没有给初始值,为什么可以使用呢?

这就需要我们知道,在这个过程中,new关键字背后所发生的一些事情了。

Date d=new Date(2060,7,5);

在程序层面只是简单的一条语句,在JVM层面需要做很多事情,下面简单介绍一下:

1.检测对象对应的类是否加载了,如果没有就会加载

2.为对象分配内存空间

3.处理并发安全问题

        比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突。

4.初始化所分配的空间

        即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

5.设置对象头信息

6.调用构造方法,给对象中各个成员赋值

6.就地初始化

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

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/473134.html

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

相关文章

AIOCR:AI文字识别web集成系统@Kylin+RISCV

基于kotti_ai的AI文字识别web集成系统 AIOCR项目目标: 在KylinRISCV搭建一个kotti_ai构架的网站,提供AI OCR文字识别web服务。 二期目标:在AIOCR的基础上提供chatgpt和文心一言等大模型调用,建立综合大模型应用平台。 功能&am…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…

腾讯云服务器如何购买省钱?2024年优惠券和优惠活动整理

腾讯云代金券领取渠道有哪些?腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券,大家也可以在腾讯云百科蹲守代金券,因为腾讯云代金券领取渠道比较分散,腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

基于torch.compile和gptfast代码风格实现ChatGLM模型推理加速

目录 一、ChatGLM模型代码重构迁移 二、推理的代码重构 三、效果分析对比 参考文章 torch2.0发布以后模型训练和推理可以实现一行代码加速,试用之后发现效果并不明显。随后gptfast项目也发布,表明它确实是可以实现模型推理的加速,看来之前…

c/c++ 深拷贝和浅拷贝

深拷贝与浅拷贝 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制的两种不同方式,它们涉及到对象成员数据的复制方式和内存管理。 浅拷贝(Shallow Copy): 浅拷贝是指将一个对象的…

投资400亿美元!人工智能或将诞生超级大国

据外媒报道,沙特阿拉伯政府计划设立约 400 亿美元的基金来投资人工智能,如此规模的基金将成为迄今为止全球最大的专注于人工智能发展的基金之一。 据知情人士透露,该基金长期以来一直被硅谷用来为科技初创企业提供资金,甚至一度是…

在线教育话术(1W字精选)

产品结构图 Nginx实现代理 问:我们在本机的host文件中配置了域名映射,都是同一个服务器。我们只需要输入对应的域名就可以到对应的界面,这是怎么实现的? 答:主要就是通过Nginx反向代理来实现的,Nginx会先…

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用;然后介绍pprof的应用场景,主要分为工具型应用和服务型应用。最后数据分析项目,先采集项目信息,再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…

基于补丁方式修复 nginx漏洞 缓冲区错误漏洞(CVE-2022-41741)、越界写入漏洞(CVE-2022-41742)

nginx1.22.0版本漏洞 CVE-2022-41741 、CVE-2022-41742 漏洞描述 1、nginx 缓冲区错误漏洞(CVE-2022-41741) 此插件基于版本检测,有可能误报,未开启 MP4 模块的nginx属于误报,请忽略该漏洞。Nginx是美国Nginx公司的一款轻量级Web服务器/反…

Jmeter Ultimate Thread Group 和 Stepping Thread Group

线程组:使用复杂场景的性能测试 有时候我们做性能测试时,只依靠自带的线程组,显示满足不了性能测试中比较复杂的场景,下面这两种线程组可以帮助你很好的完成复杂的场景 第一种:Stepping Thread Group 在取样器错误后…

2024年【安全员-C证】考试资料及安全员-C证新版试题

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证考试资料是安全生产模拟考试一点通生成的,安全员-C证证模拟考试题库是根据安全员-C证最新版教材汇编出安全员-C证仿真模拟考试。2024年【安全员-C证】考试资料及安全员-C证新版试题 1、【多选题…

Java基础入门day17

day17 复习二分查找java package com.saas; ​ public class BinarySearch { ​public static void main(String[] args) {int[] nums {12, 21, 33, 77, 89, 90}; ​System.out.println(binarySearch(nums, 21));} ​public static int binarySearch(int[] arrs, int target)…

springBoot项目,无配置中心,怎么实现类似功能

实现EnvironmentPostProcessor import cn.hutool.http.HttpUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springfr…

springboot企业级抽奖项目业务一(登录模块)

开发流程 该业务基于rouyi生成好了mapper和service的代码,现在需要在controller层写接口 实际操作流程: 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…

在windows上安装Jenkins

jenkins安装 下载jenkins 官网:Jenkins download and deployment 官方文档说明:Jenkins User Documentation 安装jenkins1.点击下载好的安装包,点击Next 2.选择一个安装路径 如果系统是windows家庭版打不开策略就创建一个txt文件&#xff0c…

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储?三、私有目录和公有目录三、存储权限和分区存储有什么关系?四、我们应该该怎么做适配?4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

NBlog Java定时任务-备份MySQL数据

NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击,给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的,有些方法直接用的已有的&#xf…

Matlab中inv()函数的使用

在Matlab中,inv()函数是用来求解矩阵的逆矩阵的函数。逆矩阵是一个与原矩阵相乘后得到单位矩阵的矩阵。在数学中,矩阵A的逆矩阵通常用A^-1表示。 什么是逆矩阵 在数学中,对于一个n阶方阵A,如果存在一个n阶方阵B,使得…

Gradio官方文档

文章目录 构建您的第一个demo分享您的demo进度条受密码保护的应用程序The Interface class(接口类)Components Attributes(组件属性)多个输入和输出组件图像示例嵌套列表描述性内容手风琴中的附加输入The 4 Kinds of Gradio Inter…

Android: Gradle 命令

一、查看整个项目依赖传递关系 x.x.x (*) 该依赖已经有了,将不再重复依赖。x.x.x -> x.x.x 该依赖的版本被箭头所指的版本代替。x.x.x -> x.x.x(*) 该依赖的版本被箭头所指的版本代替,并且该依赖已经有了,不再重复依赖。 1. gradlew ap…