【从零开始java学习|第十篇】面向对象

目录

一、面向对象介绍

二、类和对象

1. 类(Class):对象的模板

2. 对象(Object):类的实例

三、封装

1. 封装的概念

2. 封装的优势

四、就近原则和 this 关键字

1. 就近原则

2. this 关键字

五、构造方法

1. 构造方法的作用

2. 构造方法的特点

3. 默认构造方法

六、标准的 JavaBean 类

七、对象内存图(三种情况)

1. 单个对象的内存图

2. 两个对象的内存图

3. 两个引用指向同一对象

八、基本数据类型和引用数据类型(面向对象视角)

九、this 的内存原理

十、成员变量和局部变量

总结


一、面向对象介绍

面向对象编程(OOP)是一种以 "对象" 为核心的编程思想,它将现实世界中的事物抽象为程序中的 "对象",通过对象之间的交互完成功能。

与面向过程的区别

  • 面向过程:关注 "步骤",如 "先做什么,再做什么"(例:按步骤实现登录功能)
  • 面向对象:关注 "对象",如 "用户对象"" 登录界面对象 ",通过对象协作完成功能

面向对象三大特征

  • 封装:隐藏对象内部细节,只暴露必要接口
  • 继承:实现类之间的代码复用
  • 多态:同一行为的不同表现形式

优势:代码更易维护、扩展,更符合人类对现实世界的认知。

二、类和对象

1. 类(Class):对象的模板

类是对同一类事物的抽象描述,包含这类事物的属性(数据)和方法(行为)。

// 类的定义:描述"学生"这类事物
public class Student {// 属性(成员变量):学生的特征String name;int age;// 方法:学生的行为public void study() {System.out.println(name + "正在学习");}
}

2. 对象(Object):类的实例

对象是类的具体 "实例",是真实存在的个体。通过new关键字创建对象。

public class Test {public static void main(String[] args) {// 创建对象:类名 对象名 = new 类名();Student stu1 = new Student();// 给对象的属性赋值stu1.name = "张三";stu1.age = 18;// 调用对象的方法stu1.study(); // 输出:张三正在学习// 再创建一个对象(另一个实例)Student stu2 = new Student();stu2.name = "李四";stu2.study(); // 输出:李四正在学习}
}

类与对象的关系:类是模板,对象是根据模板创建的具体实例(如 "汽车图纸" 与 "具体的汽车")。

三、封装

封装是面向对象的三大特征之一,此外还有继承和多态。封装的作用是在拿到一个需求之后,告诉我们如何正确的设计对象的属性和方法。

1. 封装的概念

封装是指隐藏对象的内部细节(如属性值),只通过公共方法对外提供访问和修改的接口。

实现方式

  • private修饰属性(私有属性,仅本类可见)
  • 提供publicgetter(获取属性值)和setter(修改属性值)方法
public class Person {// 私有属性:外部不能直接访问private String name;private int age;// getter:获取namepublic String getName() {return name;}// setter:修改namepublic void setName(String n) {name = n; // 可在此处添加验证逻辑}// getter:获取agepublic int getAge() {return age;}// setter:修改age,添加合法性验证public void setAge(int a) {if (a > 0 && a < 150) { // 年龄必须在合理范围age = a;} else {System.out.println("年龄不合法");}}
}

2. 封装的优势

  • 保护数据安全(如限制年龄范围)
  • 隐藏实现细节(外部无需知道属性如何存储)
  • 便于修改内部实现(不影响外部调用)

3. private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法
  • 被private修饰的成员只能在本类中才能访问

示例:

四、就近原则和 this 关键字

1.局部变量与成员变量

(1). 成员变量(Member Variable)

  • 定义位置:直接在类体中声明,但在任何方法、构造器或代码块之外。

  • 生命周期:随着对象的创建而创建,随着对象的销毁而销毁。

  • 存储位置:存在于堆内存的对象内部。

  • 作用域:整个类内部都可见(受访问修饰符限制)。

  • 默认值:系统会自动赋予默认值(如 int 默认为 0,引用类型默认为 null)。

  • 示例

    public class Dog {String name = "旺财"; // 成员变量
    }

(2). 局部变量(Local Variable)

  • 定义位置:在方法、构造器、代码块或方法的参数列表中声明。

  • 生命周期:从声明处开始,到所在代码块执行结束时销毁。

  • 存储位置:存在于栈内存中。

  • 作用域:仅在声明它的代码块(方法、循环、条件语句等)内部可见。

  • 默认值:没有默认值,必须显式初始化后才能使用。

  • 示例

    public void bark() {String name = "小白"; // 局部变量
    }
特性成员变量局部变量
定义位置类中方法外方法、构造器或代码块内
生命周期与对象相同与方法/代码块相同
存储位置堆内存栈内存
作用域整个类(受访问控制修饰符限制)声明它的代码块内
默认值有(系统自动赋值)无(必须手动初始化)
命名冲突处理被局部变量覆盖(就近原则)优先使用局部变量

2. 就近原则

当方法中出现局部变量与成员变量同名时,优先使用局部变量(离引用位置更近)。

因为当局部变量与成员变量同名时,在局部变量的作用域内,局部变量会“遮蔽”成员变量。若需访问被遮蔽的成员变量,需使用 this 关键字。

public class Dog {String name = "旺财"; // 成员变量public void bark() {String name = "小白"; // 局部变量System.out.println(name + "在叫"); // 输出:小白在叫(就近使用局部变量)}
}

3. this 关键字

this代表当前对象的引用,用于:

  • 区分同名的局部变量和成员变量
  • 调用本类的其他方法或构造方法
public class Cat {String name; // 成员变量// 用this区分局部变量和成员变量public void setName(String name) {this.name = name; // this.name指成员变量,name指局部变量}public void eat() {System.out.println(this.name + "在吃"); // this可省略(无同名局部变量时)}
}

五、构造方法

1. 构造方法的作用

初始化对象(给对象的属性赋初始值),在创建对象时自动调用。

2. 构造方法的特点

  • 方法名与类名完全相同
  • 没有返回值类型(连void都不能写)
  • 不能被staticfinal等修饰
public class Book {String title;double price;// 无参构造方法public Book() {System.out.println("创建了一本书");}// 带参构造方法:初始化时直接赋值public Book(String t, double p) {title = t;price = p;}
}// 调用构造方法
public class Test {public static void main(String[] args) {Book b1 = new Book(); // 调用无参构造Book b2 = new Book("Java编程", 59.9); // 调用带参构造}
}

3. 默认构造方法

  • 如果类中没有定义任何构造方法,编译器会自动生成一个无参构造方法
  • 如果手动定义了构造方法,默认无参构造会失效(如需使用需手动添加)

六、标准的 JavaBean 类

JavaBean 是一种规范的类,用于封装数据,遵循以下规则:

  1. 成员变量私有(private
  2. 提供无参构造方法
  3. 提供gettersetter方法
  4. 可根据需要重写toString()(方便打印对象信息)
public class User {// 1. 私有成员变量private String username;private String password;private int age;// 2. 无参构造public User() {}// 3. 带参构造(可选)public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}// 4. getter和setterpublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 5. 重写toString()(可选)@Overridepublic String toString() {return "User{username='" + username + "', age=" + age + "}";}
}

七、对象内存图(三种情况)

1. 单个对象的内存图

栈内存                 堆内存
+----------+          +----------------+
| 引用变量 |          | 对象(User)   |
| u ------+----------> username: null |
+----------+          | password: null|| age: 0        |+----------------+
  • 引用变量(u)存于栈中,指向堆中的对象
  • 对象的属性在堆中,有默认值(引用类型为null,基本类型为对应默认值)

2. 两个对象的内存图

栈内存                 堆内存
+----------+          +----------------+
| u1 ------+----------> username: "张三"|
+----------+          | age: 18        |
| u2 ------+----------+----------------+
+----------+          | username: "李四"|| age: 20        |+----------------+
  • 两个引用变量指向堆中不同对象,属性各自独立

3. 两个引用指向同一对象

栈内存                 堆内存
+----------+          +----------------+
| u1 ------+----------> username: "张三"|
+----------+          | age: 18        |
| u2 ------+----------+----------------+
+----------+          
  • u1u2指向同一对象,修改u1的属性会影响u2

八、基本数据类型和引用数据类型(面向对象视角)

类型存储方式在对象中的表现
基本数据类型栈中直接存值对象的属性值直接存在堆中
引用数据类型栈中存地址,堆中存值对象的属性存地址,指向另一对象
public class Person {int age; // 基本类型:值直接存在Person对象中String name; // 引用类型:存地址,指向堆中的字符串对象
}

九、this 的内存原理

this当前对象的引用,本质上是方法的一个隐藏参数,在创建对象时自动绑定到该对象。

public class Car {String color;public void setColor(String color) {this.color = color; // this指向调用该方法的对象}
}// 调用时
Car c = new Car();
c.setColor("红色"); // 实际执行:setColor(c, "红色"),this就是c

内存中this与对象的引用变量(如c)存储相同的地址,指向堆中的同一个对象。

十、成员变量和局部变量

区别成员变量局部变量
定义位置类中,方法外方法内、方法参数、代码块中
作用域整个类仅在定义的方法 / 代码块中
默认值有默认值(如 int 为 0,对象为 null)无默认值,必须初始化后使用
内存位置堆内存(对象中)栈内存(方法栈帧中)
生命周期随对象创建而存在,随对象销毁而消失随方法调用而存在,随方法结束而消失
public class VariableDemo {int memberVar = 10; // 成员变量public void method() {int localVar = 20; // 局部变量System.out.println(memberVar + localVar);}
}

总结

面向对象编程是 Java 的核心思想,其核心是类和对象:类是模板,对象是实例。通过封装保护数据,利用构造方法初始化对象,遵循JavaBean 规范实现标准化封装。

理解this关键字、成员与局部变量的区别、数据类型的存储差异,以及对象在内存中的表现,是掌握面向对象编程的基础。这些概念为后续学习继承和多态奠定了重要基础。

如果我的内容对你有帮助,请点赞,评论,收藏。接下来我将继续更新相关内容!

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

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

相关文章

Spark算子调优

Spark中可用下面的算子对数据计算进行优化处理&#xff0c;包括&#xff1a; mapPartition&#xff1a;一次处理一个分区数据&#xff0c;能够使用mapPartition的尽量使用&#xff0c;但是使用时会一次性读取整个分区数据到内存&#xff0c;占内存很大&#xff0c;同理还有fore…

码农特供版《消费者权益保护法》逆向工程指北——附源码级注释与异常处理方案

尊敬的审核&#xff1a; 本人文章《码农特供版〈消费者权益保护法〉逆向工程指北——附源码级注释与异常处理方案》 1. 纯属技术交流&#xff0c;无任何违法内容 2. 所有法律引用均来自公开条文 3. 请依据《网络安全法》第12条“不得无故删除合法内容”处理 附&#xff1a;本文…

MQTT 连接建立与断开流程详解(二)

三、核心机制与最佳实践&#xff08;一&#xff09;会话管理与 QoS 保障Clean Session vs 持久会话&#xff1a;在 MQTT 连接中&#xff0c;会话管理是一个重要的概念&#xff0c;其中 Clean Session 和持久会话是两种不同的会话模式。Clean Session&#xff0c;当设置为 1 时&…

[光学原理与应用-332]:ZEMAX - 序列模式与非序列模式的本质、比较

序列模式&#xff08;Sequential Mode&#xff09;与非序列模式&#xff08;Non-Sequential Mode&#xff09;是ZEMAX光学设计软件中的两种核心设计模式&#xff0c;二者在光路定义、分析工具、应用场景等方面存在本质差异。以下是两者的详细比较&#xff1a;一、本质差异光路定…

WeakAuras Lua Script (My Version)

分享下我的WA的简约配置&#xff0c;大多数都是团队框架高亮&#xff0c;辅助大脚DBM监控 表格&#xff1a; WeakAuras Lua Script &#xff1c;BiaoGe&#xff1e;_wa拍卖字符串-CSDN博客 ICC 监控&#xff0c;只要团队框架监控 WeakAuras Lua Script ICC &#xff08;Barne…

【Python+requests】解决Python requests中的ProxyError:SSL版本错误问题详解

解决Python requests中的ProxyError&#xff1a;SSL版本错误问题详解 在使用Python进行网络请求时&#xff0c;很多人都会用到requests库配合代理服务器进行调试或抓包。但有时会遇到令人困惑的ProxyError&#xff0c;尤其是伴随SSLError: [SSL: WRONG_VERSION_NUMBER]这样的错…

基于deepseek的Spring boot入门

一次跟着deepseek记笔记的尝试&#xff0c;由于CSDN没有思维导图&#xff0c;只能按层级记录提问 如果我想知道一个springboot项目的基本结构&#xff0c;比如用到了哪些组件&#xff0c;入口在哪&#xff0c;数据库配置是怎样的 应该从哪里开始 springboot有哪些常用注解 一个…

macOS 15.6 ARM golang debug 问题

前言 最近使用macmini m4在使用golang debug发现一些奇怪的问题&#xff0c;debug到c代码&#xff0c;莫名其妙&#xff0c;而且不知道什么原因&#xff0c;知道搜索查询&#xff0c;才发现是苹果的Command Line Tools 的锅&#xff0c;macOS 15果然是一堆bug&#xff0c;毕竟…

有个需求:切换车队身份实现Fragment的Tab隐藏显示(车队不显示奖赏)

核心实现&#xff1a; 1使用mmkv保存切换的身份 2借助eventbus实现通知Fragment的tab更新private void switchFleet(boolean isMore, EnterpriseInfo enterpriseInfo) {if (isMore) {tvSwitchFleetTitle.setText(getText(R.string.switch_to_other_accounts));} else {tvSwitch…

在 Android Studio 中修改 APK 启动图标(2025826)

在 Android Studio 中修改 Android 12 应用图标可以按照以下步骤进行&#xff1a;1、准备图标资源准备一个启动图标&#xff08;建议使用 SVG 格式或高分辨率 PNG&#xff0c;推荐尺寸为 512x512 像素&#xff09;图标应符合 Android 12 的设计规范&#xff08;自适应图标&…

Linux三剑客grep-sed-awk

linux三剑客-grep、sed、awk 文章目录linux三剑客-grep、sed、awk1.正则表达式1.1正则表达式&#xff1f;1.2应用场景&#xff1f;-谁可以用&#xff1f;1.3正则注意事项&#xff08;避免90%以上的坑&#xff09;1.4正则符号1.5正则VS通配符2.基础正则2.1 ^ 以...开头的行2.2 $…

给某个conda环境安装CUDA 12.4版本 全局CUDA不变

文章目录&#x1f3af; 正确的安装命令&#x1f4cb; 为什么这个命令安全&#xff1f;⚠️ 重要说明&#x1f527; 安装后环境配置方法一&#xff1a;在虚拟环境中设置方法二&#xff1a;使用conda环境变量&#x1f9ea; 验证安装&#x1f4ca; 版本共存确认&#x1f4a1; 额外…

【C++】日期类实现详解:代码解析与复用优化

代码总览与总结// 实现一个完善的日期类 class Date { public:int GetMonthDay(int year, int month){int monthDays[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };// 闰年2月if (month 2 && ((year % 4 0 && year % 100 ! 0) || year % 400 0))return …

零基础json入门教程(基于vscode的json配置文件)

一、什么是 JSON&#xff1f;—— 最核心的概念JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;长得像键值对的集合&#xff0c;用途是存储和传递数据。在 VS Code 中&#xff0c;它常被用来写配置文件&#xff08;比如调试配置…

深入对比分析SpringCloud和Dubbo两大微服务框架的核心架构与特性。

1 微服务架构演进与核心概念1.1 微服务架构的本质微服务架构是一种将单一应用程序划分为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务之间通过轻量级的通信机制进行协作。这些服务围绕业务能力构建&#xff0c;并能够独立部署到生产环境中。微服…

鸿蒙ArkTS 核心篇-14-条件表达式(三目运算符)

目录 根据逻辑条件结果&#xff0c;执行不同的表达式&#xff0c;得到不同结果 DevEco Studio代码实战 ctrl s 日志输出 总结 根据逻辑条件结果&#xff0c;执行不同的表达式&#xff0c;得到不同结果 DevEco Studio代码实战 let num1: number 100 let num2: number 20l…

CDH集成LDAP进行身份验证

前言&#xff1a;在内网环境中部署LDAP并在CDH的hive和impala中集成&#xff0c;其中配置的端口&#xff0c;镜像名&#xff0c;密码等需要根据自己情况进行更改 1、镜像下载 在有网络的服务器上下载镜像或直接下载&#xff0c;这里需要自行配置下docker镜像下载地址 # 下载…

并发编程:Java中的多线程与线程池!

全文目录&#xff1a;开篇语线程的基础概念线程生命周期线程调度线程安全线程池&#xff1a;Executor框架、线程池的管理与调优Executor框架线程池的管理与调优并发工具类&#xff1a;ReentrantLock、CountDownLatch、CyclicBarrier等ReentrantLockCountDownLatchCyclicBarrier…

语义分割一站式到底怎么玩?

语义分割模型&#xff0c;复现或改进、对比实验&#xff0c;&#xff0c;欢迎交流&#xff0c;完爆各种详细需求1、可以接以下语义分割模型dai做 DeepLabV3、PSPnet、HRnet、Segformer、Unet、u2net、cenet、erfnet、hcanet、hiformer、uiunet、nnunet、saunet、unext、dscnet、…

由于不对称GND过孔配置,差分信号过孔上的差模到共模转换

本文研究了靠近高速差分信号过孔的接地过孔的影响以及由此产生的差模到共模的转换。该工作显示了接地 &#xff08;GND&#xff09; 过孔和差分信号之间距离的影响 &#xff08;Diff. SIG.&#xff09;;GND过孔不对称配置的影响;介电厚度和平面之间跃迁次数的影响。 印刷电路板…