第6篇:通过 Java 官方文档学习一下 Java 的类和对象

简介: 【面向对象】面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态的特性。所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。

@TOC

一、引入

有这样一个 Java 基础面试题:Java 语言有那些特点 :question:
答案是(The answer is):

:fire: ① 简单易学(摒弃了 C++ 语言中的重载、多继承、自动强制类型转换和让人头痛的指针,并有垃圾回收机制管理内存)
:fire: ② 面向对象(Java 语言的三大特性:封装、继承和多态)
:fire: ③ 跨平台(Java 通过 JVM 实现跨平台性)
:fire: ④ 安全可靠性(没有指针这种与内存直接挂钩的机制,避免程序设计者直接操作内存,减少了对内存的直接伤害。Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制 —— 类加载器 ClassLoader,如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制 —— 安全管理器 SecurityManager 作为 Java 应用设置安全哨兵。)
:fire: ⑤ 支持多线程(C++ 没有内置的多线程机制,必须调用操作系统的多线程功能以实现多功能程序设计,而 Java 语言本身就提供了多线程支持)
:fire: ⑥ Java 语言是分布式的(Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。)
:fire: ⑦ Java 语言是健壮的(Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。)
:fire: ⑧ Java 语言是可移植的(这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。)

Java 语言的特点加起来可以绕地球:earth_africa:一圈半,并不是可以随随便便解释清楚的,上面的一大段文字也并非本篇文章的重点。本篇文章的重点是 Java 的特性中最基本的、也是最重要的 —— 面向对象(封装、继承和多态)。


还有一个面试题:面向对象和面向过程的区别是什么 :question:
The answer is:

:foggy: 【面向过程】面向过程的性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候(如单片机、嵌入式开发、Linux/Unix)一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
:foggy: 【面向对象】面向对象易维护、易复用、易扩展。 因为面向对象有 封装、继承、多态的特性。所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。

上面的两道面试题都有提到面向对象的【封装、继承和多态】等三个特点。Today,让我们来学习一下【面向对象】...

二、类和对象

在这里插入图片描述
在这里插入图片描述

(1) 什么是对象【Java 官方教程】?

① 现实生活中的对象

Objects are key to understanding object-oriented technology. Look around right now and you'll find many examples of real-world objects: your dog, your desk, your television set, your bicycle.

理解面向对象技术就必须得理解【对象】是什么。环顾四周,你会看到很多现实生活中的【对象】。你的狗 :dog:、你的桌子、你的电视机 :tv:、你的自行车 :bike: 等都是【对象】。


Real-world objects share(有) two characteristics: They all have state and behavior.

真实世界的对象有两种特征:它们都有状态(state)和行为(behavior)


Dogs have state (name, color, breed, hungry) and behavior (barking, fetching, wagging tail).*

狗 :dog: 有状态【名字、颜色、品种、饥饿】
狗 :dog: 有行为【吠叫、抓东西、摇尾巴】


Bicycles also have state (current gear, current pedal cadence, current speed) and behavior (changing gear, changing pedal cadence, applying brakes).

自行车 :bike: 有状态【当前档位、当前踏板节奏、当前速度】
自行车 :bike: 有行为【换档、改变踏板节奏、刹车】


Identifying the state and behavior for real-world objects is a great way to begin thinking in terms of 【object-oriented programming】.

识别现实世界的对象的状态和行为是开始思考面向对象编程的好方法。


【上面的英文是官方教程的原句,多看英文可以提升语感,多懂点英文对以后解决开发问题也有好处。博主是先看中文理解了再看英文的,遇到不懂的单词也通过英语词典翻译。这样学了才更有自信。 韩顺平老师的资料结合官方文档

现实世界中 🌎,万物皆对象。万事万物都可被抽象为对象,万事万物都有状态(State)和行为(Behavior)。
状态(State):可看做是对象的属性,是名词(如:名字、颜色、档位、当前速度);
行为(Behavior):可看做对象可以做的事情,是动词(如:抓东西、摇尾巴、换挡、刹车)


Take a minute right now to observe the real-world objects that are in your immediate area.
现在花一点点时间🧭 观察一下真实世界中你附近的物品。

For each object that you see, ask yourself two questions: "What possible states can this object be in?" and "What possible behavior can this object perform?".
对于每一个你看到的物品,都问自己 2️⃣ 个问题:
① 这个物品可能处于什么状态 :question:
② 这个物品可能会执行什么行为 :question:

Make sure to write down your observations.
最好是把你观察到的结果记录下来。

【1】 物品:手机
可能处于状态:亮屏、息屏、播放声音、充电状态、微信支付界面
可能的行为:微信支付、打电话、刷快手、发短信
【2】 物品:小电风扇
可能处于状态:停止旋转、快速旋转中、慢速旋转中、完全没电
可能的行为:快速旋转、慢速旋转
【3】 物品:键盘
可能处于状态:提示灯亮、提示灯灭、可以打字、不可以打字
可能的行为:提示灯发光、提示灯流动、打字

As you do, you'll notice that real-world objects vary in complexity.
当您这样做时,您会注意到现实世界中的对象的复杂性各不相同。

your desktop lamp may have only two possible states (on and off) and two possible behaviors (turn on, turn off), but your desktop radio might have additional states (on, off, current volume, current station) and behavior (turn on, turn off, increase volume, decrease volume, seek, scan, and tune).
您的桌面灯 🔦 可能只有两种状态(打开和关闭)和两种可能的行为(打开、关闭)
但您的桌面收音机 📻 可能有其他状态(打开、关闭、当前音量、当前电台)和行为(打开、关闭、增大音量、减小音量、搜索、扫描和调频)

You may also notice that some objects, in turn, will also contain other objects. These real-world observations all translate into the world of object-oriented programming.
您可能还会注意到,一些对象反过来也会包含其他对象。这些现实世界的观察(物品)都可转化为面向对象编程的世界。

俄国文艺理论家 尼古拉·加夫里诺维奇·车尔尼雪夫斯基说过:“ 艺术源于生活,又高于生活
艺术之所以说来源于生活,是因为所谓的生活给予了创作者以经历。贝多芬耳聋后而作命运交响曲,李白放逐后而作将进酒,不朽的名篇背后必有不凡的人生。 而多数人纵使命运坎坷,经历丰富,也难以通过艺术加以诉说。
在这里插入图片描述

编程中的某些概念也和现实世界有些相似(对象的概念、设计模式),毕竟编程也是现实生活中的人创造的嘛!现实世界中的人创作必然会受到现实世界的影响,现实世界必然会给创作带来灵感。


② 软件对象(Java 中的对象)

在这里插入图片描述
Software objects are conceptually similar to real-world objects: they too consist of state and related behavior.
软件对象在概念上类似于现实世界的对象:它们也由状态和相关行为组成。

状态(State)对应软件对象中的 Field(属性)
行为(Behavior)对应软件对象中的 Method(方法)

An object stores its state in fields (variables in some programming languages) and exposes(暴露) its behavior through methods (functions in some programming languages).
对象将其状态存储在字段(某些编程语言中的变量)中,并通过方法(某些编程语言中的函数)暴露其行为

Methods operate on an object's internal state and serve as the primary mechanism for object-to-object communication.
通过方法操作(如修改)对象内部的状态(属性),并作为不同对象之间沟通的主要机制。

Hiding internal state and requiring all interaction to be performed through an object's methods is known as data encapsulation(封装) — a fundamental principle of object-oriented programming.
隐藏内部状态并要求通过对象的方法执行所有交互被称为数据封装 —— 面向对象编程的基本原则之一。

(2) 什么是类【Java 官方教程】?

① 概念

In the real world, you'll often find many individual objects all of the same kind. There may be thousands of other bicycles in existence, all of the same make(品牌、型号) and model.
在现实世界中,您经常会发现许多物品有相同的特征。可能还有成千上万的其他自行车,都是相同的品牌和型号。
在这里插入图片描述

Each bicycle was built from the same set of blueprints(模板、蓝图) and therefore contains the same components(组件).
每辆自行车都是由同一组蓝图制造的,因此包含相同的组件。

In object-oriented terms, we say that your bicycle is an instance(实例) of the class of objects known as bicycles(自行车这个物品的类.
在面向对象的术语中,我们说您的自行车是自行车这个对象类的一个实例。

A class is the blueprint from which individual objects are created.
类是创建单个对象的蓝图(模板)。

类(Class)是创建具体对象的模板(eg: 动物、自行车、电脑、手机)
对象是一个类的实例(eg: 猫 :cat:、崔克自行车 🚴、苹果电脑 💻、华为手机)

猫是动物中的一种;崔克自行车是自行车中的一种、苹果电脑是电脑中的一种、华为手机是手机中的一种。
动物、自行车、电脑、手机都可看做是类(Class)
猫是动物类的一个实例(Instance);崔克自行车是自行车类的一个实例;苹果电脑是电脑类的一个实例;华为手机是手机类的一个实例。

② 代码示例

一个自行车类:
在这里插入图片描述

/**
 * 自行车类:创建一个自行车的蓝图(模板)
 */
public class Bicycle {

    int cadence = 0; // 节奏、韵律
    int speed = 0;
    int gear = 1; // 排挡

    /**
     * 改变节奏
     *
     * @param newValue 节奏值
     */
    void changeCadence(int newValue) {
        cadence = newValue;
    }

    /**
     * 换挡
     *
     * @param newValue 换挡值
     */
    void changeGear(int newValue) {
        gear = newValue;
    }

    /**
     * 加速
     *
     * @param increment 加速值
     */
    void speedUp(int increment) {
        speed = speed + increment;
    }

    /**
     * 减速
     *
     * @param decrement 减速值
     */
    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }

    /**
     * 打印当前自行车对象的状态
     */
    void printStates() {
        System.out.println("cadence 节奏:" +
                cadence + " speed 速度:" +
                speed + " gear 档位:" + gear);
    }
}

The syntax(语法) of the Java programming language will look new to you, but the design of this class is based on the previous discussion of bicycle objects.
Java 编程语言的语法对您来说可能是新的,但是这个类(Bicycle)的设计是基于前面对自行车对象的讨论。

The fields(字段) cadence, speed, and gear represent the object's state, and the methods(方法) (changeCadence, changeGear, speedUp etc.) define its interaction with the outside world.
字段 cadence、speed 和 gear 表示对象的状态
方法(changeCadence、changeGear 和 speedUp)定义该类与外部世界的交互方式。

You may have noticed that the Bicycle class does not contain a main method. That's because it's not a complete application(应用程序); it's just the blueprint for bicycles that might be used in an application. The responsibility of creating and using new Bicycle objects belongs to some other class in your application.
您可能已经注意到 Bicycle 类不包含 main 方法。那是因为它不是一个完整的应用程序。它只是可能在应用程序中使用到的自行车对象的蓝图。创建和使用 Bicycle 对象的责任属于应用程序中的其他一些类。

创建一个 Bicycle 对象,并使用它

class BicycleDemo {
    public static void main(String[] args) {

        // Create two different Bicycle objects
        // 创建两个不同的自行车对象
        Bicycle bike1 = new Bicycle();
        Bicycle bike2 = new Bicycle();

        /*
            Invoke methods on those objects
            用这些对象调用方法
         */

        // 自行车1的节奏改为50
        bike1.changeCadence(50);
        // 自行车1的速度【增加】10
        bike1.speedUp(10);
        // 自行车1的档位改为2
        bike1.changeGear(2);
        // 打印自行车1的状态
        bike1.printStates();

        // 自行车2的节奏改为50
        bike2.changeCadence(50);
        // 自行车2的速度【增加】10
        bike2.speedUp(10);
        // 自行车2的档位改为2
        bike2.changeGear(2);
        // 自行车2的节奏改为40
        bike2.changeCadence(40);
        // 自行车2的速度【增加】10
        bike2.speedUp(10);
        // 自行车2的档位改为3
        bike2.changeGear(3);
        // 打印自行车2的状态
        bike2.printStates();
    }
}

输出结果:
在这里插入图片描述

(3) 另一个代码案例(刘爷爷的猫)

① 案例需求和代码

🍎 需求:
刘爷爷养了两只猫。一只名字叫 Tom,今年 3 岁,白颜色(猫的花色)。还有一只叫 Jerry,今年 5岁,绿颜色。
请编写一个程序,当用户输入猫的名字后就显示该猫的【名字,年龄和颜色】。如果用户输入的猫的名字错误,则显示刘爷爷没有这只猫。
在这里插入图片描述


🍎 分析:

Tom 和 Jerry 是两只不同的猫,它们都有名字、年龄、颜色等状态(属性)。应该把猫 :cat: 抽象为一个类(Cat),类中有 name、age 和 color 三个属性。Tom 和 Jerry 都是 Cat 类的实例(对象)。

🍎 参考上面的 Bicycle 类和 BicycleDemo 类完成下面的代码

Cat 类:

/**
 * Cat 类:猫对象的模板(蓝图)
 */
public class Cat {

    /*
        name、age、color 是猫对象共有的状态
     */

    String name;

    int age;

    String color;

    /**
     * 是猫对象都有的行为(打印状态)
     */
    void printStates() {
        System.out.println("name:" +
                name + " age:" +
                age + " color:" + color);
    }

}

创建 Cat 对象,并使用它

class CatDemo {
    
    public static void main(String[] args) {
        // 通过【new】关键字创建一个 Cat 对象
        // tom 是 Cat 对象的地址的引用(tom 是当前 Cat 对象的对象名)
        // Cat 是一个类, Cat 是 Java 中的引用数据类型
        Cat tom = new Cat();
        // 访问类中的属性:对象名 + 【.】+ 属性名
        tom.name = "Tom";
        tom.age = 3;
        tom.color = "白色";
        // 调用类中的方法:对象名 + 【.】+ 方法名
        // name:Tom age:3 color:白色
        tom.printStates();

        Cat jerry = new Cat();
        jerry.name = "Jerry";
        jerry.age = 5;
        jerry.color = "绿色";
        // name:Jerry age:5 color:绿色
        jerry.printStates();

        System.out.println("请输入猫的名字:");
        Scanner scanner = new Scanner(System.in);
        String userCatName = scanner.next();
        if ("jerry".equals(userCatName)) {
            jerry.printStates();
        } else if ("tom".equals(userCatName)) {
            tom.printStates();
        } else {
            System.out.println("刘爷爷没有这只猫");
        }

    }
    
}

测试结果:
在这里插入图片描述

② 类与对象的关系分析

在这里插入图片描述

🍉 ① 类是抽象的,代表 一类事物(eg:猫类、自行车类、人类)
🍉 ② 类是引用数据类型
🍉 ③ 类是对象的模板(blueprint)
🍉 ④ 对象是具体的、实际的,代表 具体的一个事物
🍉 ⑤ 对象是类的实例化

三、总结

  • 对象

-- 生活中万事万物都是对象(对象有状态行为)
-- 面向对象编程中的对象和生活中的对象类似(状态是属性、行为是方法)

-- 类是一类事物的蓝图(模板),类中定义了属性和方法
-- 类实例化后就是对象

若您是比我还若的初学者,可能对代码部分比较懵。没关系,我后面的文章胡详细说明。
类的实例化、类中的属性和方法、对象的内存布局 ... 将在以后的文章中详细说明。🥤

我才疏学浅,但又颇爱分享。若您在文章中发现错误,请不吝赐教。㊗️万事顺心,愿您点赞。

相关文章
|
23天前
|
存储 Java 编译器
Java 零基础入门学习(小白也能看懂!)
Java 零基础入门学习(小白也能看懂!)
|
23天前
|
存储 Java 编译器
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
|
9天前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
34 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
5天前
|
Java 流计算
这个错误信息来自于Java的ScheduledThreadPoolExecutor类,具体的原因是RejectedExecutionException,也就是任务被拒绝执行
【2月更文挑战第3天】这个错误信息来自于Java的ScheduledThreadPoolExecutor类,具体的原因是RejectedExecutionException,也就是任务被拒绝执行
21 2
|
1天前
|
存储 安全 Java
|
1天前
|
Java
|
2天前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
7 3
|
5天前
|
存储 安全 Java
Java Map接口及其常用实现类详解
Java Map接口及其常用实现类详解
|
5天前
|
算法 安全 前端开发
Java Queue接口及其常用实现类分析
Java Queue接口及其常用实现类分析
|
5天前
|
存储 Java 索引
Java Set接口及其常用实现类详解
Java Set接口及其常用实现类详解

相关产品

  • 云迁移中心