JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法
一、面向对象编程基础
1. 程序中的数据存储方式
- 基本类型:变量(如
int max = 15;
)。 - 数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复杂事物数据)。
2. 对象的本质
- 定义:对象是一种特殊的数据结构,用于封装事物的属性(数据),代表现实中的事物(如“赵丽颖”对象包含姓名、年龄、身高、体重等属性)。
- 创建方式:通过类(模板/设计图)使用
new
关键字创建,每new
一次生成一个新对象。Star s1 = new Star(); // 创建对象 s1.name = "赵丽颖"; // 设置属性
二、类的基本语法
1. 类的定义
- 作用:定义对象的模板,包含属性(成员变量)和行为(成员方法)。
- 语法结构:
public class 类名 {// 成员变量(属性)数据类型 变量名; // 如 String name; int age;// 成员方法(行为)public void 方法名() {// 方法逻辑} }
2. 对象的使用步骤
- 定义类:设计对象的属性和方法(如
Star
类)。 - 创建对象:使用
new
关键字实例化对象(如Star s1 = new Star();
)。 - 操作对象:通过对象名访问属性和方法(如
s1.name = "赵丽颖";
)。
三、核心概念解析
1. 构造器(Constructor)
- 作用:创建对象时初始化成员变量。
- 特点:
- 与类同名,无返回值类型声明。
- 默认构造器:若未显式定义构造器,系统自动生成无参构造器。
- 自定义构造器:若定义有参构造器,默认无参构造器会被覆盖,需手动添加无参构造器以保留。
- 语法示例:
public class Student {private String name;private int age;// 无参构造器public Student() {}// 有参构造器public Student(String name, int age) {this.name = name;this.age = age;} }
2. this 关键字
- 作用:
- 指代当前对象,哪个对象调用方法,
this
就指向哪个对象。 - 解决成员变量与方法参数/局部变量同名时的命名冲突问题。
- 指代当前对象,哪个对象调用方法,
- 示例:
public class Student {private String name;public void setName(String name) { // 参数名与成员变量同名this.name = name; // 通过 this 访问成员变量} }
3. 封装(Encapsulation)
- 定义:面向对象三大特征之一,将数据(成员变量)和操作数据的方法封装在类中,通过控制访问权限实现“合理隐藏,合理暴露”。
- 实现方式:
- 隐藏属性:用
private
修饰成员变量,禁止外部直接访问。 - 暴露方法:用
public
修饰getter/setter
方法,用于读写属性。
- 隐藏属性:用
- 示例:
public class Student {private String name; // 私有属性// getter 方法(获取属性)public String getName() {return name;}// setter 方法(设置属性)public void setName(String name) {this.name = name;} }
4. 实体类(Javabean)
- 定义:一种符合特定规范的类,用于存储数据,数据与业务逻辑分离。
- 规范要求:
- 所有成员变量
private
修饰,提供public
的getter/setter
方法。 - 必须包含无参构造器,有参构造器可选。
- 所有成员变量
- 应用场景:在软件开发中用于封装数据(如数据库表中的记录),便于数据传输和存储。
四、static 关键字
1. static 修饰成员变量(静态变量/类变量)
- 特点:
- 属于类,而非单个对象,内存中仅存储一份,被所有对象共享。
- 访问方式:
类名.静态变量
(推荐)或对象名.静态变量
(不推荐)。
- 示例:
public class Student {public static int totalStudents; // 静态变量,记录学生总数private String name;public Student() {totalStudents++; // 每次创建对象时总数加 1} }
2. static 修饰成员方法(静态方法/类方法)
- 特点:
- 属于类,可通过
类名.方法名
直接调用,无需创建对象。 - 限制:静态方法中不能直接访问实例成员(实例变量、实例方法),只能访问静态成员。
- 属于类,可通过
- 应用场景:
- 工具类设计(如
Math
类、自定义的StringUtils
),提供通用功能,避免对象创建开销。 - 主方法
main
是静态方法,程序入口需直接调用。
- 工具类设计(如
- 示例:
public class Utils {// 静态方法:计算两数之和public static int add(int a, int b) {return a + b;} } // 调用方式:Utils.add(1, 2);
3. 静态方法与实例方法的区别
特征 | 静态方法 | 实例方法 |
---|---|---|
所属 | 类 | 对象 |
调用方式 | 类名.方法名 (推荐) | 对象名.方法名 |
能否访问静态成员 | 能 | 能 |
能否访问实例成员 | 不能 | 能 |
是否存在 this 关键字 | 否 | 是(指向当前对象) |
五、内存模型(详细解析)
Java程序运行时的内存分配遵循特定的模型,主要分为 栈内存(Stack Memory)、堆内存(Heap Memory) 和 方法区(Method Area)(JDK 8及之后称为 元空间 Metaspace)。理解这三部分的作用和数据存储机制,对掌握对象创建、变量作用域及内存管理至关重要。
1. 栈内存(Stack Memory)
作用:
- 存储局部变量(方法内定义的变量、方法参数)和对象引用(如
Star s1
中的变量名s1
)。 - 遵循**先进后出(LIFO)**的栈结构,用于管理方法的调用和执行顺序。
特点:
- 线程私有:每个线程拥有独立的栈空间,线程结束后栈内存自动释放。
- 存储内容:
- 基本数据类型的局部变量(如
int age = 18;
中的age
)。 - 对象引用变量(存储对象在堆内存中的地址,如
s1
指向new Star()
的地址)。
- 基本数据类型的局部变量(如
- 内存大小受限:栈的大小由JVM启动参数配置(默认较小,如1MB),若方法嵌套调用过深易引发 栈溢出(StackOverflowError)。
示例:
public class Test {public static void main(String[] args) {Star s1 = new Star(); // s1 是栈内存中的对象引用,指向堆中的 Star 对象int num = 10; // num 是栈内存中的基本类型变量print(s1, num); // 调用方法时,参数 s1 和 num 压入栈}public static void print(Star s, int n) {// s 和 n 是栈内存中的局部变量}
}
2. 堆内存(Heap Memory)
作用:
- 存储对象实例和数组,是对象创建的唯一区域(通过
new
关键字分配内存)。 - 对象的成员变量(属性)在此分配空间并存储具体数据(如
s1.name = "赵丽颖"
中的name
值)。
特点:
- 线程共享:所有线程均可访问堆内存中的对象。
- 动态分配:内存分配灵活,大小由JVM动态管理(可通过
-Xms
、-Xmx
参数调整)。 - 垃圾回收(GC):JVM定期回收不再被引用的对象,避免内存泄漏。
- 存储内容:
- 对象的实例数据(如
Star
对象的name
、age
等属性值)。 - 数组的元素(如
int[] arr = {1, 2, 3};
中的数组元素)。
- 对象的实例数据(如
示例:
Star s1 = new Star(); // 堆内存中创建 Star 对象,存储属性值
s1.name = "赵丽颖"; // "赵丽颖" 存储在堆中对象的 name 属性里
s1.age = 36; // 36 存储在堆中对象的 age 属性里
- 内存地址:堆中的对象有唯一的内存地址(如
0x15aeb7ab
),栈中的引用变量指向该地址。
3. 方法区(Method Area)
作用:
- 存储类的元数据(字节码文件
.class
)、静态变量(static)、常量(final) 和 方法定义(如方法名、字节码指令)。 - 属于线程共享区域,供全程序访问。
特点(JDK 8及之后):
- 元空间(Metaspace):方法区的实现由永久代(PermGen)改为元空间,内存分配从本地内存(Native Memory)中划分,避免了永久代的内存溢出问题。
- 存储内容:
- 类的结构信息(类名、父类、接口、成员变量和方法的定义)。
- 静态变量(如
public static int totalStudents;
)。 - 字面量(如字符串常量
"赵丽颖"
)和符号引用。 - 方法的字节码指令(如
printTotalScore()
方法的执行逻辑)。
示例:
public class Star {static String country = "中国"; // 静态变量 country 存储在方法区final double PI = 3.14; // 常量 PI 存储在方法区String name; // 成员变量的定义存储在方法区,值存储在堆中public void printInfo() { // 方法定义存储在方法区System.out.println("姓名:" + name);}
}
六、关键总结
- 对象与类的关系:类是模板,对象是实例;通过
new
关键字由类创建对象。 - 封装的核心:隐藏属性,暴露接口,保证数据安全性和代码可维护性。
- static 的作用:实现类级别的数据和方法共享,常用于工具类和全局数据管理。
- 构造器的职责:确保对象创建时成员变量被正确初始化,支持重载以灵活初始化。
相关文章:
JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型:变量(如 int max 15;)。数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复…...

Linux常见指令合集+知识点
Linux有一条设计理念:Linux中一切皆文件;这样的设计理念让Linux可以用一种统一的方式对Linux中的不同文件/设备进行管理;(也就是键盘、显示器等在Linux中也算文件) 文件内容属性,指令一般都是对文件进行操…...

nginx 基于IP和用户的访问
nginx的下载 yum install nginx.x86_64 -y 启动服务 systemctl enable --now nginx.service 查看服务目录 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…...

【Linux】系统程序−进度条
文章目录 一、准备知识1.回车与换行1.1 回车1.2 换行 2. 行缓冲区3. 倒计时程序 二、进度条程序1. 版本1 一、准备知识 在讲解进度条之前,先讲解几个概念 1.回车与换行 1.1 回车 回车:\r 作用:将光标移动到当前行的行首(水平回…...
Axure应用交互设计:动态面板嵌套实现超强体验感菜单表头
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:动态面板嵌套 主要内容:利用动态面板多层嵌套实现菜单表头 应用场景:广泛应用于表单表…...

Linux(6)——第一个小程序(进度条)
目录 一、行缓冲区的概念 二、\r与\n 三、进度条代码书写与展示 1.如何表示进度条是在加载的 2.整体框架 3.书写 3.1makefile: 3.2process.h: 3.3process.c: 3.4main.c: 3.5美化 一、行缓冲区的概念 首先,我们来见一见行缓冲区,…...

CentOS:搭建国内软件repository,以实现自动yum网络安装
centosgit仓库_寂寞沙冷州的技术博客_51CTO博客 yum 很慢 centos yum安装慢_mob64ca1417b0c6的技术博客_51CTO博客 yum配置,文件,命令详解-CSDN博客 yum仓库简介_yum库是什么-CSDN博客 rootwww:/etc/yum.repos.d# pwd /etc/yum.repos.d ###创建下面这个.…...

[Git] 认识 Git 的三大区域 文件的修改和提交
文章目录 认识 Git 的三大区域:工作区、暂存区、版本库工作区、暂存区、版本库的关系流程图解 (概念) 将文件添加到仓库进行管理:git add 和 git commit场景一:第一次添加文件到仓库查看提交历史:git log(进阶理解&…...

RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)
视频讲解: RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头) 总共开发板有4个USB的A口,1个USB的TypeC口,我们插上两个USB3.0的U盘和一个USB2.0的UVC摄像头来进行测试 lsusb -tv 可以看到有3个US…...

【520 特辑】用 HTML/CSS/JavaScript 打造浪漫炫酷的表白网页
一、前言 在 520 这个充满爱意的日子里,程序员该如何用代码表达浪漫?本文将分享一个结合动画特效与交互设计的 520 表白网页案例,通过 HTML/CSS/JavaScript 实现动态爱心、渐变背景、浮动文字等炫酷效果,手把手教你用技术传递心意…...

小米2025年校招笔试真题手撕(二)
一、题目 给一个长度为n的序列和一个整数x,每次操作可以选择序列中的一个元素,将其从序列中删去,或者将其值加一。 问至少操作多少次,可以使操作后的序列(可以为空)中数字之和是x的倍数。 输入描述&#…...
弱网服务器群到底有什么用
在当今数字化的时代,大家都在追求高速、稳定的网络体验,但你是否想过,弱网服务器群其实也有着不可小觑的作用。让我们来聊聊什么是弱网服务器群。简单来说,它是一组在网络条件相对较差情况下运行的服务器集合。 弱网服务器群组是一…...

部署Gitlab-CE with Docker私有云环境
应用环境 Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64) Docker version 28.1.1, build 4eba377 文章目录 拉取容器镜像生成Run脚本参数解读实例脚本环境配置管理员密码遗忘服务邮箱配置邮件测试 运维问题集锦(1) 端口映射关系(2) 服务日志(3) 分支受保护 项目操作…...
拉普拉斯高斯(LoG)滤波器掩模的注意事项
目录 问题: 解答: 一、高斯函数归一化:消除幅度偏差 1. 归一化的定义 2. 为何必须归一化? 二、拉普拉斯系数和为零:抑制直流项干扰 1. 拉普拉斯算子的特性 2. 系数和不为零的后果 三、直流项如何影响零交叉点&…...

铠大师:让用户畅享多元应用,助力鸿蒙生态发展
在全球信息技术产业格局加速重构的背景下,中国科技力量正以开放包容的姿态重塑操作系统生态范式。 5月19日,华为在成都举办的nova14系列及鸿蒙电脑新品发布会上,正式对外发布搭载了鸿蒙系统的笔记本电脑HUAWEI MateBook Pro与HUAWEI MateBoo…...
RocketMQ核心特性与最佳实践
目录 1. 引言 2. RocketMQ核心特性 2.1 架构演进 2.2 核心组件 2.3 消息模型 2.4 高级特性 3. RocketMQ与其他MQ产品选型对比 3.1 功能特性对比 3.2 适用场景对比 3.3 选型建议 4. RocketMQ部署最佳实践 4.1 部署模式选择 4.2 硬件配置建议 4.3 操作系统优化 4.4…...
springboot配置redis lettuce连接池,以及连接池参数解释
文章目录 前置基本配置参数解释 前置 javaspringbootredislettuce 连接池 有很多连接池,比如 jedis,lettuce,redission,springboot 默认使用 lettuce 连接池 lettuce 连接池的特点是:一个 lettuce 连接可以被多个线…...

基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统
详细视频:【基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统。-哔哩哔哩】 https://b23.tv/zfqLWPV...

如何使用AI搭建WordPress网站
人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域,许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一,WordPress 的人工智能插件越来越多也就不足…...
打破双亲委派模型的实践:JDBC与Tomcat的深度解析
一、JDBC如何打破双亲委派模型 1. JDBC SPI机制的核心矛盾 Java数据库连接(JDBC)是打破双亲委派模型的经典案例,其根本原因在于基础类库需要加载实现类的矛盾: 核心接口位置:java.sql.Driver等接口位于rt.jar中,由启动类加载器…...
《打破枷锁:Python多线程GIL困境突围指南》
GIL,这个Python解释器层面的独特机制,虽在一定程度上守护了内存管理的秩序,却也成为了多线程并行的紧箍咒,限制了Python在多核处理器上的性能发挥。今天,让我们深入剖析GIL的本质,探寻突破这一枷锁的有效策…...

Java并发编程:全面解析锁策略、CAS与synchronized优化机制
一、六种锁策略场景化解析 1. 乐观锁 vs 悲观锁:图书馆借书的两种策略 核心差异:对资源是否会被抢占的预期不同。 乐观锁(假设冲突概率低) → 行为:直接去书架上拿书(围绕加锁要做的工作更少)…...

2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp
2025第三届黄河流域网络安全技能挑战赛–Crypto–WriteUp Crypto sandwitch task from Crypto.Util.number import * import gmpy2 flag bflag{fake_flag} assert len(flag) 39 p getPrime(512) q getPrime(512) n p * q e 0x3 pad1 beasy_problem pad2 bHow_to_so…...

[爬虫知识] IP代理
相关实战案例:[爬虫实战] 代理爬取:小白也能看懂怎么用代理 相关爬虫专栏:JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 引言:爬虫与IP封锁的攻防战 对网络爬虫而言,遇到的一个较棘手的问题就是封IP:请…...

6个月Python学习计划 Day 1 - Python 基础入门 开发环境搭建
6个月Python学习计划:从入门到AI实战(前端开发者进阶指南) 🎯 今日目标 理解 Python 的背景和用途安装 Python 开发环境熟悉基本语法:变量、数据类型、打印输出动手编写第一个 Python 程序 🧠 学习内容详…...

GraphPad Prism工作表的基本操作
《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism中包含5种工作表,每种工作表的基本操…...
Maven插件之docker-maven-plugin
介绍 在持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了实现…...

成年后还能学习多少知识,由大脑的这个数量决定
撰文|Anne Trafton 编译|郑添惺 审校|clefable 麻省理工学院(MIT)的一些神经科学家发现,成年的大脑中含有数百万个“静默突触”(silent synapses)。它们是神经元之间未成熟的神经突…...
Flask 会话管理:从原理到实战,深度解析 session 机制
1、Flask中session 的实现原理:服务器与客户端的协作 HTTP 协议是无状态的——服务器无法区分两次请求是否来自同一用户。这意味着,用户登录后跳转到其他页面时,服务器会“忘记”用户身份。 为解决这一问题,Web 开发中引入了会话…...

MySQL连接错误解决方案:Can‘t connect to MySQL server on ‘localhost‘ (10038)
错误描述 当您尝试连接MySQL数据库时,可能会遇到以下错误提示: 这个错误表明客户端无法连接到本地MySQL服务器。 可能的原因 MySQL服务未启动 MySQL配置问题 防火墙或安全软件阻止连接 端口被占用或未正确配置 网络连接问题 解决方案 方法一&am…...