[Java 基础]类,面向对象的蓝图

首先需要区分类和对象都是啥?

类:类是一个模板,它描述一类对象的行为和状态,类这个概念更像是下定义,更像是模板(橡皮泥膜具)。

对象:对象(不是女朋友)是类的一个实例,有状态和行为(用橡皮泥膜具倒出来的一个个小人)。

拿狗这个例子来举例,狗这个概念就是类(定义了数据和动作,狗都有年龄、性别、品种等,狗都爱吃骨头、都会汪汪叫等),对象这个概念就指的是具体的一条狗。

类的数据

类中可以通过定义变量来存储数据。一个类可以包含以下类型变量:

局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。

类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型(静态变量)。

public class Person {// 类变量(静态变量)static int personCount = 0;// 成员变量(实例变量)String name;int age;// 构造方法public Person(String name, int age) {// 使用成员变量this.name = name;this.age = age;// 修改类变量personCount++;}// 成员方法public void introduce() {// 局部变量String greeting = "Hello, my name is ";System.out.println(greeting + name + " and I am " + age + " years old.");}// 静态方法public static void showPersonCount() {System.out.println("Total persons created: " + personCount);}// 主方法public static void main(String[] args) {Person p1 = new Person("Alice", 30);Person p2 = new Person("Bob", 25);p1.introduce();p2.introduce();Person.showPersonCount();}
}

类中的成员变量和类变量可以通过访问修饰符来设置这些变量的可见范围:

访问修饰符同一个类中同一个包中子类中(不同包)其他包中
public✅ 是✅ 是✅ 是✅ 是
protected✅ 是✅ 是✅ 是❌ 否(但子类中可访问)
默认(无修饰符)✅ 是✅ 是❌ 否❌ 否
private✅ 是❌ 否❌ 否❌ 否

类的行为

类的行为就是类可以执行哪些操作,这个操作就是方法的概念。方法就是一段可以重复使用的代码,它完成一个特定的任务。你可以把它当成一个“动作”、“功能”或者“操作指令”。

方法

假设你有一个机器人,它什么都不会,除非你教它。

你告诉它:“当我说‘洗衣服’,你就按照我说的步骤来做。”
于是你写下这些步骤:

  1. 打开洗衣机
  2. 放衣服
  3. 加洗衣液
  4. 按“开始”键

这个“洗衣服”的动作,就是一个方法,你把这套步骤起个名字叫 washClothes()

public void washClothes() {System.out.println("打开洗衣机");System.out.println("放衣服");System.out.println("加洗衣液");System.out.println("按开始键");
}

调用洗衣服这个方法,它就自动按照这些洗衣服的步骤执行。

方法的结构如下图所示:

方法的访问修饰符和类中的变量的访问修饰符是一致的,都是用来控制可见范围的,上面讲过了。

这里使用了 static 关键字修饰了方法,表明这个方法是静态方法,这个方法属于类本身,而不是类的任何特定实例(对象)。

构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

public class Person{public Person(){}public Person(String name){// 这个构造器仅有一个参数:name}
}

上面这个 Person 类有两个构造方法,一个是无参构造方法,一个是有参构造方法。

:::danger
在 Java 中的每个类都至少有一个构造方法。如果在 Java 中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。

:::

方法重载

在 Java 中,方法重载 (Method Overloading) 是指在一个类中可以定义多个方法,它们具有相同的名称,但它们的参数列表必须不同。参数列表的不同体现在以下方面:

  1. 参数的类型不同
  2. 参数的个数不同
  3. 参数类型的顺序不同

像上面的构造方法,它就是可以重载的。

public class Calculator {// 两个整数相加public int add(int a, int b) {System.out.println("Adding two integers");return a + b;}// 三个整数相加public int add(int a, int b, int c) {System.out.println("Adding three integers");return a + b + c;}// 两个双精度浮点数相加public double add(double a, double b) {System.out.println("Adding two doubles");return a + b;}// 一个整数和一个双精度浮点数相加(注意参数类型顺序)public double add(int a, double b) {System.out.println("Adding an integer and a double");return a + b;}// 一个双精度浮点数和一个整数相加(注意参数类型顺序)public double add(double a, int b) {System.out.println("Adding a double and an integer");return a + b;}public static void main(String[] args) {Calculator calc = new Calculator();System.out.println(calc.add(5, 10));         // 调用 add(int, int)System.out.println(calc.add(2, 3, 4));      // 调用 add(int, int, int)System.out.println(calc.add(3.5, 2.5));     // 调用 add(double, double)System.out.println(calc.add(10, 5.5));      // 调用 add(int, double)System.out.println(calc.add(7.2, 8));       // 调用 add(double, int)}
}

this 关键字

如果构造方法的入参的参数名和类的成员变量名是一样的,我们需要将入参赋值给成员变量,会导致局部变量和成员变量冲突的问题,需要使用 this 关键字代指当前的对象,通过 this 去访问当前对象的属性。

class Person {int age;public Person (int age) {this.age = age;}public int getAge () {return this.age;}
}

this 关键字代指当前的对象,也可以通过 this 调用成员方法:

class Person {public void openMouth() {...}public void speak() {this.openMouth();}
}

:::danger
这里的 this 关键字可以省略不写

:::

构造方法是在实例化对象时被 Java 虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在一个构造方法中使用 “this([参数 1, 参数 2,…])” 的形式来调用其他的构造方法:

class Person {public Person() {System.out.println("无参的构造方法被调用了...");}public Person (String name) {this(); // 调用无参的构造方法System.out.println("有参的构造方法被调用了...");}
}public class Example10 {public static void main (String[] args) {Person p = new Person ("itcast"); // 实例化 Person 对象}
}

静态方法

如果方法使用了 static 关键字修饰了方法,表明这个方法是静态方法,这个方法属于类本身,而不是类的任何特定实例(对象)。

静态代码块

在 Java 类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用 static 关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。

public class StaticBlockExample {// 静态成员变量static int count;// 静态代码块static {System.out.println("静态代码块执行了!");count = 10; // 初始化静态变量}// 构造方法public StaticBlockExample() {System.out.println("构造方法被调用!");}public static void main(String[] args) {System.out.println("main 方法开始执行");System.out.println("创建第一个对象:");StaticBlockExample obj1 = new StaticBlockExample();System.out.println("count = " + count);System.out.println("\n创建第二个对象:");StaticBlockExample obj2 = new StaticBlockExample();System.out.println("count = " + count);}
}

类的设计

一般来说,类代表的是一种概念的定义,所以,类名一般是名词。

Java 中还有包的概念,包类似于文件夹,一般会将一堆相关联的类文件放到一个包中,包名也一般是名词。

Java 中,一个源文件中只能有一个 public 类,一个源文件可以有多个非 public 类。

源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为 Employee.java。

如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。

如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium-自动更新谷歌浏览器驱动

1、简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题,因为有些网页数据是通过JavaScript动态加载的。selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如输入…

java从azure中读取用户信息

以下是用 Java 从 Azure AD 获取用户信息的完整实现方案&#xff0c;使用 Spring Boot 框架和 Microsoft 身份验证库 (MSAL)&#xff1a; 1. 添加 Maven 依赖 <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.…

C# 数据库访问与ORM框架全面指南:从ADO.NET到Entity Framework Core

在现代应用开发中&#xff0c;数据持久化是核心需求之一。作为.NET生态系统中的主力语言&#xff0c;C#提供了丰富多样的数据库访问技术和工具。本文将全面探讨C#中的数据库访问方式&#xff0c;重点介绍三种主流ORM&#xff08;对象关系映射&#xff09;框架&#xff1a;Entit…

day19 leetcode-hot100-37(二叉树2)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 1.深度优先遍历&#xff08;递归&#xff09;ps:不好理解&#xff0c;所以我一般不喜欢用递归 思路 典型算法&#xff0c;用递归求出高度&#xff0c;每次都是深度优先。 具体算法 /*** Definition for a bi…

【LLMs篇】13:LLaDA—大型语言扩散模型

栏目内容论文标题大型语言扩散模型 (Large Language Diffusion Models)核心思想提出LLaDA&#xff0c;一种基于扩散模型的LLM&#xff0c;通过前向掩码和反向预测过程建模语言分布&#xff0c;挑战自回归模型&#xff08;ARM&#xff09;在LLM领域的主导地位&#xff0c;并展示…

Deepfashion2 数据集使用笔记

目录 数据类别: 筛选类别数据: 验证筛选前2个类别: Deepfashion2 的解压码 数据类别: 类别含义: Class idx类别名称英文名称0短上衣short sleeve top1长上衣long sleeve top2短外套short sleeve outwear3长外套long sleeve outwear4裙子skirt5裤子trousers6连衣裙dre…

Java并发编程哲学系列汇总

文章目录 并发编程基础并发编程进阶并发编程实践 并发编程基础 Java并发编程基础小结 Java线程池知识点小结 详解JUC包下各种锁的使用 并发编程利器Java CAS原子类全解 深入理解Java中的final关键字 Java并发容器深入解析&#xff1a;HashMap与ArrayList线程安全问题及解…

git 之 stash

一、git stash&#xff1a;临时保存工作区修改 作用 将当前工作目录和暂存区的未提交修改保存到栈中&#xff0c;并恢复工作区到上一次提交的干净状态。 适用场景&#xff1a; 临时切换分支修复紧急 Bug拉取远程代码前清理工作区保存实验性代码避免生成无效提交 常用命令&am…

vxe-grid 双击行,打开expand的内容

1、官网api Vxe Table v4.6&#xff08;根据版本&#xff09; 要调用这个事件&#xff0c;双击单元格&#xff0c;我们打开type"expand"的内容 2、打开的事件toggleRowExpand 3、事件的说明 这个方法&#xff0c;会自动判断当前展开的状态&#xff0c;然后去触发相…

Java Stream 高级实战:并行流、自定义收集器与性能优化

一、并行流深度实战&#xff1a;大规模数据处理的性能突破 1.1 并行流的核心应用场景 在电商用户行为分析场景中&#xff0c;需要对百万级用户日志数据进行实时统计。例如&#xff0c;计算某时段内活跃用户数&#xff08;访问次数≥3次的用户&#xff09;&#xff0c;传统循环…

计算机系统结构-第5章-监听式协议

监听式协议******&#xff1a; 思想: 每个Cache除了包含物理存储器中块的数据拷贝之外&#xff0c;也保存着各个块的共享状态信息。 Cache通常连在共享存储器的总线上&#xff0c;当某个Cache需要访问存储器时&#xff0c;它会把请求放到总线上广播出去&#xff0c;其他各个C…

(c++)string的模拟实现

目录 1.构造函数 2.析构函数 3.扩容 1.reserve(扩容不初始化) 2.resize(扩容加初始化) 4.push_back 5.append 6. 运算符重载 1.一个字符 2.一个字符串 7 []运算符重载 8.find 1.找一个字符 2.找一个字符串 9.insert 1.插入一个字符 2.插入一个字符串 9.erase 10…

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2]

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]-CSDN博客 下面…

LeetCode 2297. 跳跃游戏 VIII(中等)

题目描述 给定一个长度为 n 的下标从 0 开始的整数数组 nums。初始位置为下标 0。当 i < j 时&#xff0c;你可以从下标 i 跳转到下标 j: 对于在 i < k < j 范围内的所有下标 k 有 nums[i] < nums[j] 和 nums[k] < nums[i] , 或者对于在 i < k < j 范围…

【前端】缓存相关

本知识页参考&#xff1a;https://zhuanlan.zhihu.com/p/586060532 1. 概述 1.1 应用场景 静态资源 场景&#xff1a;图片、CSS、JS 文件等静态资源实现&#xff1a;使用 HTTP 缓存控制头&#xff0c;或者利用 CDN 进行边缘缓存 数据缓存 场景&#xff1a;请求的返回结果实现…

猎板硬金镀层厚度:高频通信领域的性能分水岭

在 5G 基站、毫米波雷达等高频场景中&#xff0c;硬金镀层厚度的选择直接决定了 PCB 的信号完整性与长期可靠性。猎板硬金工艺&#xff1a; 1.8μm 金层搭配罗杰斯 4350B 基材的解决方案&#xff0c;在 10GHz 频段实现插入损耗&#xff1c;0.15dB/cm&#xff0c;较常规工艺降低…

第35次CCF计算机软件能力认证-5-木板切割

原题链接&#xff1a; TUOJ 我自己写的35分正确但严重超时的代码 #include <bits/stdc.h> using namespace std; int main() {int n, m, k;cin >> n >> m >> k;vector<unordered_map<int, int>> mp(2);int y;for (int i 1; i < n; …

【蓝桥杯】包子凑数

包子凑数 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼&#xff0c;其中第 ii 种蒸笼恰好能放 AiAi​ 个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买 XX 个包子&#xff0c;卖包子的大叔就会迅速选出若干…

pikachu通关教程-目录遍历漏洞(../../)

目录遍历漏洞也可以叫做信息泄露漏洞、非授权文件包含漏洞等. 原理:目录遍历漏洞的原理比较简单&#xff0c;就是程序在实现上没有充分过滤用户输入的../之类的目录跳转符&#xff0c;导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。 这里的目录跳转符可以是../…

[概率论基本概念4]什么是无偏估计

关键词&#xff1a;Unbiased Estimation 一、说明 对于无偏和有偏估计&#xff0c;需要了解其叙事背景&#xff0c;是指整体和抽样的关系&#xff0c;也就是说整体的叙事是从理论角度的&#xff0c;而估计器原理是从实践角度说事&#xff1b;为了表明概率理论&#xff08;不可…