【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中最基础的,务必要掌握


相关文章
|
17天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
14天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
37 17
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
21天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
11天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
15天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
19天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
19天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。