Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦

article/2025/8/15 20:55:29

Java从入门到“放弃”(精通)之旅🚀——类和对象全面解析⑦

在这里插入图片描述

一、面向对象初探

1.1 什么是面向对象?

Java是一门纯面向对象的语言(OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。

面向对象的特点

  • 更符合人类对事物的认知方式
  • 对大型程序的设计、扩展和维护更加友好
  • 通过对象之间的交互来完成任务

1.2 面向对象 vs 面向过程

让我们通过洗衣服的例子来理解两者的区别:

传统洗衣服(面向过程)
在这里插入图片描述
在这里插入图片描述

现代洗衣服(面向对象)
在这里插入图片描述
在这里插入图片描述

  • 对象:人、衣服、洗衣粉、洗衣机
  • 交互过程:人将衣服放进洗衣机、倒入洗衣粉、启动洗衣机
    面向对象方式不关注具体洗衣过程,而是通过对象间的交互完成任务。

二、类的定义和使用

2.1 什么是类?

类是用来对一个实体(对象)进行描述的,主要描述该实体具有哪些属性(外观尺寸等)和哪些功能(用来做什么)。

例如,洗衣机类的属性和功能:

  • 属性:品牌、型号、重量、尺寸、颜色等
  • 功能:洗衣、烘干、定时等

2.2 类的定义格式

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

2.3 小练习

2.3.1 定义狗类

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

class PetDog {// 属性public String name;   // 名字public String color;  // 颜色// 行为public void bark() {System.out.println(name + ":旺旺旺~~");}public void wag() {System.out.println(name + ":摇尾巴~~");}
}
2.3.2 定义学生类

在这里插入图片描述

public class Student {// 属性public String name;public String gender;public short age;public double score;// 方法public void DoClass() {System.out.println("按时上课,不要迟到,如果请假,及时去补");}public void DoHomework() {System.out.println("教务系统,完成作业,一旦拖沓,神仙难救");}public void Exam() {System.out.println("考试目的,了解学情,人人必考,暴露问题");}
}

注意事项

  1. 一般一个文件只定义一个类
  2. main方法所在的类通常用public修饰
  3. public修饰的类必须与文件名相同
  4. 不要轻易修改public类的名称

三、类的实例化

3.1 什么是实例化?

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

实例化示例

class PetDog {public String name;public String color;public void bark() {System.out.println(name + ":旺旺旺~~~");}public void wag() {System.out.println(name + ":摇尾巴~~~");}
}public class Main {public static void main(String[] args) {// 通过new实例化对象PetDog dogH = new PetDog();dogH.name = "小黄";dogH.color = "黑黄";dogH.bark();dogH.wag();PetDog dogS = new PetDog();dogS.name = "赛虎";dogS.color = "棕色";dogS.bark();dogS.wag();}
}

输出结果

小黄: 旺旺旺~~~
小黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~

3.2 类和对象的关系

  1. 类是一个模型,用于描述实体
  2. 类是一种自定义类型,可以用来定义变量
  3. 一个类可以实例化多个对象
  4. 类比:类就像建筑设计图,对象是根据设计图建造的实际房子
    在这里插入图片描述

四、this引用

4.1 为什么需要this引用?

考虑以下日期类:

public class Date {public int year;public int month;public int day;public void setDay(int year, int month, int day) {year = year;    // 这里会有歧义month = month;day = day;}
}

问题:

  1. 形参名与成员变量名相同时,赋值语句有歧义
  2. 多个对象调用同一方法时,方法如何知道操作的是哪个对象的数据?

4.2 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明确指向当前对象的成员变量this.month = month;this.day = day;}public void printDate() {System.out.println(this.year + "/" + this.month + "/" + this.day);}
}

4.3 this引用特性

  1. this的类型:对应类类型引用
  2. this只能在成员方法中使用
  3. 在成员方法中,this只能引用当前对象
  4. this是成员方法的第一个隐藏参数,编译器自动传递

五、对象的构造及初始化

5.1 构造方法

构造方法是一种特殊成员方法,用于初始化对象。

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;System.out.println("Date(int,int,int)方法被调用了");}public void printDate() {System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {Date d = new Date(2021, 6, 9);  // 自动调用构造方法d.printDate();  // 输出:2021-6-9}
}

5.2 构造方法特性

  1. 名字必须与类名相同
  2. 没有返回值类型,void也不行
  3. 创建对象时由编译器自动调用,生命周期内只调用一次
  4. 可以重载
  5. 用户未定义时,编译器生成默认无参构造方法
  6. 构造方法中可通过this调用其他构造方法
  7. 通常使用public修饰

5.3 默认初始化和就地初始化

默认初始化:成员变量未显式初始化时,Java会赋予默认值

数据类型默认值
byte0
short0
int0
long0L
float0.0f
double0.0
char‘\u0000’
booleanfalse
referencenull

在这里插入图片描述

就地初始化:声明成员变量时直接赋初值

public class Date {public int year = 1900;public int month = 1;public int day = 1;// ...
}

六、封装

6.1 封装概念

封装是面向对象三大特性之一,将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口。

举个栗子🌰:
计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
在这里插入图片描述

6.2 访问限定符

Java提供四种访问权限:

在这里插入图片描述

封装示例

public class Computer {private String cpu;     // private: 仅本类可访问private String memory;  // private: 仅本类可访问public String screen;   // public: 任何类可访问String brand;          // default: 同包可访问public Computer(String brand, String cpu, String memory, String screen) {this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public void Boot() {System.out.println("开机---");}
}

6.3 包(package)

包是对类的封装机制,用于更好地组织类。(可以理解为目录)

在这里插入图片描述

包的导入

import java.util.Date;  // 导入特定类
import java.util.*;     // 导入整个包(不推荐)

自定义包

package com.example.demo;public class Test {// 类内容
}

七、static成员

7.1 static修饰成员变量

static修饰的成员变量属于类,所有对象共享。

public class Student {private String name;private static String classRoom = "Bit306";  // 静态成员变量public static String getClassRoom() {return classRoom;}
}public class Test {public static void main(String[] args) {System.out.println(Student.getClassRoom());  // 输出:Bit306}
}

7.2 static修饰成员方法

静态方法属于类,不依赖于特定对象实例。

public class Student {private static String classRoom = "Bit306";public static String getClassRoom() {return classRoom;}
}

静态方法特性

  1. 属于类方法
  2. 推荐通过类名调用
  3. 不能访问非静态成员变量
  4. 不能调用非静态方法
  5. 无法重写

八、代码块

8.1 普通代码块

定义在方法中的代码块。

public class Main {public static void main(String[] args) {{int x = 10;System.out.println("x1 = " + x);}int x = 100;System.out.println("x2 = " + x);}
}

8.2 构造代码块(实例代码块)

定义在类中,用于初始化实例成员变量。

public class Student {private String name;private int age;// 实例代码块{this.name = "bit";this.age = 12;System.out.println("实例代码块执行");}public Student() {System.out.println("构造方法执行");}
}

8.3 静态代码块

使用static定义,用于初始化静态成员变量。

public class Student {private static String classRoom;// 静态代码块static {classRoom = "bit306";System.out.println("静态代码块执行");}
}

注意事项

  • 静态代码块只会执行一次
  • 多个静态代码块按定义顺序执行
  • 实例代码块每次创建对象都会执行

九、内部类

9.1 实例内部类

未用static修饰的成员内部类。

public class OutClass {private int a = 10;// 实例内部类class InnerClass {public void print() {System.out.println(a);  // 可以直接访问外部类成员}}
}

9.2 静态内部类

用static修饰的成员内部类。

public class OutClass {private static int b = 20;// 静态内部类static class InnerClass {public void print() {System.out.println(b);  // 只能访问外部类静态成员}}
}

9.3 局部内部类

定义在方法中的内部类。

public class OutClass {public void method() {class InnerClass {public void print() {System.out.println("局部内部类");}}InnerClass inner = new InnerClass();inner.print();}
}

9.4 匿名内部类

没有名字的内部类,通常用于实现接口或抽象类。

interface Message {void send(String msg);
}public class Test {public static void main(String[] args) {Message m = new Message() {  // 匿名内部类@Overridepublic void send(String msg) {System.out.println("发送消息:" + msg);}};m.send("Hello");}
}

十、对象的打印

默认打印对象时输出的是对象的哈希码,可以通过重写toString()方法自定义输出。

public class Person {String name;String gender;int age;public Person(String name, String gender, int age) {this.name = name;this.gender = gender;this.age = age;}@Overridepublic String toString() {return "Person[name=" + name + ", gender=" + gender + ", age=" + age + "]";}public static void main(String[] args) {Person p = new Person("张三", "男", 25);System.out.println(p);  // 输出:Person[name=张三, gender=男, age=25]}
}

总结

本文全面介绍了Java中类和对象的各个方面,包括:

  1. 类的定义和实例化
  2. 成员变量和成员方法
  3. this引用的使用
  4. 构造方法和对象初始化
  5. 封装特性和访问控制
  6. static成员的使用
  7. 各种代码块的作用
  8. 内部类的分类和使用
  9. 对象的打印和toString()方法

掌握这些内容是学习Java面向对象编程的基础,希望本文能帮助大家更好地理解和运用这些概念。在实际开发中,合理使用面向对象的特性可以让代码更加清晰、可维护性更高。
在这里插入图片描述


在这里插入图片描述
JavaSE专栏

  • Java从入门到“放弃”(精通)之旅——启航①
  • Java从入门到“放弃”(精通)之旅——数据类型与变量②
  • Java从入门到“放弃”(精通)之旅——运算符③
  • Java从入门到“放弃”(精通)之旅——程序逻辑控制④
  • Java从入门到“放弃”(精通)之旅——方法的使用⑤
  • Java从入门到“放弃”(精通)之旅——数组的定义与使用⑥
  • Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
  • Java从入门到“放弃”(精通)之旅——继承与多态⑧
  • Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
  • Java从入门到“放弃”(精通)之旅——String类⑩
  • Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
    在这里插入图片描述

http://www.hkcw.cn/article/lrfkglsHTA.shtml

相关文章

【Golang】第七弹----map

笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 1基本介绍 Go语言中的 map …

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析dump时先从崩溃的那条汇…

基于谐波线性化方法的跟网型GFL并网变流器/VSC宽频序阻抗建模及扫频(Matlab/Simulink平台)及文献复现

目录 1、课程及模型介绍 2、谐波线性化方法介绍 3、跟网型及构网型并网变流器的特点 4、跟网型变流器/VSC拓扑及控制结构 5、不同坐标系下VSC序阻抗建模推导过程 5.1 abc三相坐标系下的VSC序阻抗建模 5.2 d-q旋转坐标系下的VSC序阻抗建模 5.2.1 Park变换及频率偏移效应…

C++“STL之String”

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C++入门 目录 ​编辑 前言 一、STL简介 1.1 STL是什么? 1.2 STL的版本(这个不是很重要了解即可) 1.3 STL的六大组件 二、 String类 2.1为什么要学习String类? 2.1.1 C语言中的字符串…

C++之多态

开始新的征程啦———多态,它也是C的三大特性之一。 文章目录 一、多态的概念二、多态的定义和实现2.1多态的定义2.2 实现动态多态所需要的条件(2个)2.3 虚函数的定义2.4 虚函数的重写/覆盖2.5 虚函数重写中的问题2.5.1 协变2.5.2 析构函数的…

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛(个人观点)1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 🏆100%试题B IPV6 🏆0%试题C 2025图形 🏆100%试题D 最大数字 &am…

21天Python计划:零障碍学语法(更新完毕)

文章目录 前言Python 部分MySQL 部分目录结语资料截图 前言 此技术博客专栏围绕 Python 编程和 MySQL 数据库展开了系统且循序渐进的知识讲解,共包含 21 篇文章。 Python 部分 从基础入门逐步深入到高级应用。首先介绍了 Python 的下载和开发工具,为后续…

JavaScript--js基础(详细 全面)

目录 前言: JavaScript 是什么?JavaScript 简介 1.JavaScript历史 2.JavaScript 具有以下特点 第一个JavaScript程序 1.在脚本文件中编写JavaScript代码 2.JavaScript代码执行顺序 基本语法 1.变量 2.数据类型 3.算术运算符 4.赋值运算 5.字符串运算符 6…

Java识别图片或扫描PDF中的文字

目录 使用工具 Java识别图片中的文字 Java识别扫描PDF中的文字 注意事项 图片和扫描文件通常以非文本格式存在,这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题,光学字符识别(OCR)技术应运而生。OCR通过分析…

【C++】C++11新特性详解:可变参数模板与emplace系列的应用

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

使用宝塔面板快速部署SpringBoot+Vue项目(Java + Node)

使用宝塔面板快速部署SpringBootVue项目(Java Node) 项目主要技术栈准备工作1. 一台云服务器(阿里云、腾讯云等),我这里使用的是阿里云的服务器(2核2G)2. 已安装宝塔面板3. 已开发完成的Spring…

一文弄懂 | YOLOv8网络结构解读 、yolov8.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

看这一篇就够了。本文内含YOLOv8网络结构图 yaml配置文件详细解读与说明 训练教程 训练参数设置参数解析说明等一些有关YOLOv8的内容! YOLOv8v10专栏订阅链接:YOLOv10 创新改进高效涨点持续改进300多篇永久免费答疑 (订阅的小伙伴&#xf…

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架:数据库ORM框架 --> 对象…

【Python】解决Python报错:ERROR: Could not find a version that satisfies the requirement

成功解决Python报错:ERROR: Could not find a version that satisfies the requirement。ERROR: Could not find a version that satisfies the requirement 是 Python 的包管理工具 pip 在安装包时可能遇到的错误。这通常意味着 pip 没有找到与给定版本要求匹配的包…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

目录 1. sizeof 和 strlen的区别 1.1 sizeof 1.2 strlen 2. 数组和指针习题解析 2.1 一维数组 2.2 字符数组 代码1: 代码2: 代码3: 代码4: 代码5: 代码6: 2.3 二维数组 3. 指针运算笔试题解析 3.1 3.…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分:事件处理与信号槽机制4.1 什么是信号与槽?4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解: 4.4 处理不同的信号代码详解: 4.5 自定义信号与槽代码详解: 4.6 信号槽…

MathType的安装与word嵌入

博主近期在写论文,发现word编辑公式好像只能用MathType,于是就去下载安装,然后遇到了蛮多问题总结一下,希望能帮到有相同问题的大家~ 一.MathType的下载 博主是在官网直接下载的,个人觉得没啥问题,下的也…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 (1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 (3)plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 (4&#xff09…

Python的包管理工具pip安装

Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一:通过 ​ensurepip​ 模块安装(推荐)方法二:通过 ​get-pip.py​ 脚本安装(经常应为网络域名问题连接不上) 3.验证pip安装4.创建别名5.更新pip 二、常…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…