【Java|基础篇】类和对象

简介: 本篇文章主要讲解了下面三个问题类的定义和实例化构造方法this关键字

1. 前言

本篇文章主要讲解了下面三个问题


类的定义和实例化

构造方法

this关键字

2. 什么是面向对象

众所周知面向过程和面向对象是两种重要的编程思想,而Java是属于面向对象一类的语言.面向对象(Object Oriented Programming,简称 “oop”).

面向对象有三大特性:封装 继承和多态.这些内容后面会详细介绍.

在面向对象的世界里,一切皆为对象。对象就是问题中面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情.,因此在Java中,我们是对一个一个的对象进行的操作.通过实例化对象,调用对象的方法实现相应的功能.面向对象中,我们不必关注对象是如何实现相应的功能的.


例如有一个空调,空调可以进行室内温度的调节(制热或制冷),除湿等功能.这里空调就是一个对象,我们只需要调用空调的制热制冷等功能,就可以实现我们想要的结果.

3. 类的定义

类是用来对一个实体(对象)来进行描述的.类的定义要使用class关键字


// 语法格式为:

class 类名{

// 成员变量

// 成员方法

}


与上述的空调为例,我们要通过定义空调类来描述空调这个对象.空调有颜色,尺寸和型号等信息,空调有制冷制热等功能.

定义空调这个类:


class AirConditioner{
  // 成员变量
    String colour; // 颜色
    double size; // 尺寸
    String model; // 型号
  // 成员方法
    void heating(){
        System.out.println("开启制热功能");
    }
    void refrigeration(){
        System.out.println("开启制冷功能");
    }
}


定义类时,类的成员变量和成员方法可以根据需求进行定义. 下面讲解中的类皆是上述的这个空调类


4. 类的实例化

定义类对象之后,我们要如何使用类呢? 这就需要去进行类的实例化.定义类就相当于在计算机中定义了一种新的类型.用类类型创建对象的过程,称为类的实例化.使用new关键字进行类的实例化


// 语法
类名 对象名 = new 类名();


例如


public static void main(String[] args) {
      // 类名 对象名 = new 类名(); 
        AirConditioner airConditioner = new AirConditioner();
    }

实例化好类对象之后,我们可以通过 实例化对象的对象名加.的方式进行类的成员变量和成员方法的访问.

public static void main(String[] args) {
        AirConditioner airConditioner = new AirConditioner();
        System.out.println("颜色: "+ airConditioner.colour);
        System.out.println("尺寸: "+ airConditioner.size);
        System.out.println("型号: "+ airConditioner.model);
        airConditioner.heating();
        airConditioner.refrigeration();
    }
    // 输出结果:
    // 颜色: null
  // 尺寸: 0.0
  // 型号: null
  // 开启制热功能
  // 开启制冷功能

这里需要注意在main方法中,如果定义了变量,而不进行初始化,就使用时是会报错的.

例如:

image.png

image.png

但是类中的成员变量则不会出现这个问题,类中的成员变量是有默认值的.

基本数据类型:


数据类型 默认值

int 0

short 0

long 0

byte 0

float 0.0f

double 0.0

char /u0000

boolean false

注:引用数据类型的默认值为null.


既然可以通过实例对象的对象名+.的方式访问对象的成员变量,就可以通过这种方式来初始化对象的成员变量.

例如:


public static void main(String[] args) {
        AirConditioner airConditioner = new AirConditioner();
        airConditioner.colour = "白色";
        System.out.println("颜色: "+ airConditioner.colour);
    }
    // 输出结果:
    // 颜色: 白色

类可以理解为是一个"模型". 同一个类可以创建多个实例对象

例如:


public static void main(String[] args) {
        AirConditioner airConditioner1 = new AirConditioner();
        AirConditioner airConditioner2 = new AirConditioner();
        AirConditioner airConditioner3 = new AirConditioner();
    }

5. 对象的构造及初始化

上面谈到我们可以通过实例对象的对象名+.的方式进行成员变量的初始化,但是如果类很多,实例的对象也很多,那么这个时候使用这种方式进行成员变量的初始化就会很麻烦. 因此Java给我们提供了一个叫做 "构造方法" 这样的方法帮我们对成员变量进行的初始化


构造方法: 也称为构造器,是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且

在整个对象的生命周期内只调用一次。

image.png

构造方法:


名字与类名相同,没有返回值类型,设置为void也不行

一般情况下使用public修饰

在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次


上述就是默认的,无参的构造方法. 也是在没有构造方法时,编译器自动调用的构造方法

当我在构造方法中添加一个输出语句时:

image.png

可以看到,我并没有去调用构造方法,却还是输出了构造方法中的语句. 这也验证了构造方法会在实例化对象时自动调用. 因此我们可以传入参数让构造方法帮我们进行成员变量的初始化.


public AirConditioner() {
        System.out.println("执行了 无参 的构造方法");
    }
    public AirConditioner(String a) {
        colour = a;
        System.out.println("执行了 一个参数 的构造方法");
    }
    public AirConditioner(String a, double b, String c) {
        colour = a;
        size = b;
        model = c;
        System.out.println("执行了 三个参数 的构造方法");
    }

image.png

在讲方法时,说到过"重载"这个概念.

方法的重载有三个注意的地方: 1. 方法的重载与返回值无关 2. 参数列表不能相同(形参的个数 顺序 类型等) 3.方法名必须相同

构造方法也是可以重载的.上述三个构造方法就构成了方法的重载.


使用构造方法,我们就可以对成员变量进行初始化了. 根据我们传入实参的数量,会自动调用对应参数的构造方法.


image.png

我们来打印一下这些类中的成员变量的内容.在IDEA中可以右键 选择Generate

image.png

选择这里的toString()

image.png

IDEA就会给我们生成好一个这样的方法.

image.png


接下来我们来打印实例好的实例对象

image.png


6. this引用

上述代码中,其实有一个问题,就是构造方法中的形参变量名是随便写的. 如果要初始化的成员变量非常多,且又不是按照顺序写的(doge) 是不是看着就很头疼.

image.png

这个时候可能有些聪明的同学就会说,把形参的名字设置成与成员变量相同不就可以了. 接下来我们来试试


public AirConditioner(String colour, double size, String model) {
        colour = colour;
        size = size;
        model = model;
        System.out.println("执行了 三个参数 的构造方法");
    }


image.png

可以看到虽然是调用了构造方法,但是并没有进行初始化.

这个主要的原因就是在构造方法中,编译器并不知道谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?

image.png

为了解决这个问题,Java可以给我们提供了一个"this"这样的关键字


this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该

引用去访问


对上述代码进行修改

image.png

image.png

此时就可以正确进行初始化完成了.

使用this之后就是告诉了编译器前面的是当前类的成员变量,而后面的是形参.


关于构造方法,也可以使用IDEA帮助我们自动生成. 与toString相同

image.png

image.png

可以选择想要初始化的成员变量进行对应构造方法的生成. 选择多个成员变量可以按住CTRL 进行选择.


this的特性


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

this只能在"成员方法"中使用

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

补充: 在类中也可以进行初始化


class AirConditioner{
    String colour = "白色"; // 颜色
    double size; // 尺寸
    String model; // 型号
    public AirConditioner() {
        System.out.println("执行了 无参 的构造方法");
    }
}


image.png

这种初始化的方法通常会搭配 "final"关键字进行使用,后面会详细的介绍


7. 总结

文章到这里就结束了.文章的内容虽然不难,但是需要注意的地方还是特别多的.类和对象是学习Java中最基础的,务必要掌握


相关文章
|
6天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
27 1
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
6天前
|
Java
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
17 1
|
2天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
17 2
|
4天前
|
设计模式 算法 Java
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
|
6天前
|
消息中间件 Java RocketMQ
MQ产品使用合集之在同一个 Java 进程内建立三个消费对象并设置三个消费者组订阅同一主题和标签的情况下,是否会发生其中一个消费者组无法接收到消息的现象
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
13 1
|
6天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
6天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
22 3
|
6天前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
10 3
|
6天前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
13 2