Java 面向对象基础

目录

  • 1. 面向对象
  • 2. 类与对象
  • 3. 面向对象在内存中的执行原理
  • 4. 类和对象注意事项
  • 5. this 关键字
  • 6. 构造器
    • 6.1 什么是构造器?
    • 6.2 构造器作用
    • 6.3 构造器应用场景
  • 7. 封装性
    • 7.1 什么是封装?
    • 7.2 封装的设计规范
    • 7.3 封装的书写
  • 8. 实体JavaBean


正文开始

1. 面向对象

要想了解面向对象,我们首先要了解对象是什么,咱们这里讨论的可不是你的男/女朋友,而是在 Java 语言中非常重要的知识点。
我们真实生活中,有着各种各样的事物,比如一个人、一棵树、一本书等等。我们编程肯定是为了来解决现实中的问题,所以当我们把构成问题的事物数字化,得到的就是它的“对象”,对象是为了描述某个事物在解决问题中的行为

面向对象编程,就是把解决一个问题所需要的数据和处理方法交给对象,让对象来处理问题。这样开发更符合人类的思维习惯,使得编程更加简单直观。

2. 类与对象

类是对问题共性的描述,而对象是对问题个性的描述。可以将类看作是图纸,对象就是根据图纸做出来的实物。
比如一个类描述的是“人”,包括了“姓名”、“年龄”、“性别”。而依托于这个类,创建出的一个对象“姓名:wwangxu”、”年龄:20“、“性别:男”。这就是通过“人”这张图纸(类),做出了“姓名为wwangxu”的这个实物(对象)。

类由属性和方法组成:

  • 属性:该事物的特征,比如一个人的年龄、性别等。
  • 方法:该事物的行为,比如吃饭、走路、睡觉等。

类必须依托对象才可以使用,而对象的各种操作都是在类中定义的。可以理解为:没法直接使用图纸来进行图纸中的操作,而必须把事物造出来才能操作,并且造出来的实物的使用方法都是在图纸中指出的。

下面我们来看一下类与对象在程序中的具体实现:

// 对象的定义格式
类名称 对象名称 = new 类名称();// 通过对象访问类中的属性
对象名称.属性//通过对象访问类中的方法
对象名称.方法(实参列表)

我们引入一个具体的例子来学习一下:
Student.java

//定义类
public class Student{//类的属性String name;int age;//类的方法public void Judgment(){if(age >= 18){System.out.println("成年了");}else{System.out.println("未成年");}}
}

test.java

public class test {public static void main(String[] args) {//定义对象1Student s1 = new Student();//通过对象访问类中的属性s1.name = "wwangxu";s1.age = 19;//通过对象访问类中的方法s1.Judgment();//定义对象2Student s2 = new Student();s2.name = "xiaoming";s2.age = 15;s2.Judgment();}
}

类的定义有以下要求:

  • 类必须编写在后缀为.java的文件中;
  • 一个.java文件中,可以有多个类,但public修饰的类只能有一个;
  • public修饰的类名必须与其对应的.java文件的文件名相同
  • 同一个包中不能有文件名重复的类

3. 面向对象在内存中的执行原理

想要更深入的了解面向对象,我们就需要学习面向对象编程的过程在内存中是如何实现的

部分 java 程序会存储在以下区域中:

  • :存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
  • :存放new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。
  • 方法区:可以看做是一块独立于Java堆的内存空间,可存储方法。

下面我们根据此图来详细学习(图源黑马程序员课件)
请添加图片描述

  • 主函数中第一句Student s1 = new Student()原理为:

    • Student s1表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1
    • new Student()会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值,同时系统会为这个Student对象分配一个地址值0x4f3f5b24。
    • 栈内存中的变量s1存储的就是这个地址值,再次调用该变量时,就是通过这个地址来找到对象。
  • 当执行s1.name=“播妞”时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为播妞;

  • 当执行s1.printTotalScore()时,先通过s1找到对象的地址,再通过对象找到类的地址,再通过方法区中的方法来执行该方法。

  • 对象 s2 及其他操作同上。

4. 类和对象注意事项

  • 类名的命名建议使用英文单词,并且每个单词首字母大写,使用驼峰命名法,例如:Student、Apple…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也成为成员方法(对象的行为)
  • 成员本身存在默认值,各类型初始值如下:
类型默认值
byte、short、char、int、long0
float、double0.0
booleanfalse
数组、Stringnull
  • 一个.java文件中,可以有多个 class类,但只能有一个被 public 修饰,且该类名必须与文件名相同
  • 对象与对象之间的数据不会互相影响,但当多个变量指向同一个对象时,多个变量所保存的地址是相同的,此时他们之间会相互影响
  • 如果某个对象没有一个变量引用他,那么该对象无法操作,该对象会成为所谓的垃圾对象

5. this 关键字

在类与对象中,this 关键字较为常用,我们先来了解一下它的含义。

this 就是一个变量,用在成员方法中,可以拿到当前类的对象

在这里插入图片描述
由上图我们可以看到,this 就是拿到我们当前类的对象,它存储的內容与定义对象的变量相同,而且哪一个对象调用成员方法中的 this,this 指向的就是哪个对象。


了解了 this 的含义,那他的使用场景有哪些呢?

当我们的成员方法需要传参时,而这时它的形参名与该类的成员变量名有冲突时,可以使用 this 来避免错误。
例如:

public class Student{// 成员变量// 代表通过所需要的分数double sorce;// 成员方法// 判断是否通过public void checkPass(double sorce){if(sorce > sorce){System.out.println("恭喜你通过了!");}else{System.out.println("很遗憾,你落选了");}} 
}

上述代码我们可以看到一个问题:该成员方法的目的是比较用户传进来的成绩和通过的分数,来判断用户是否通过,但成员方法的形参名与成员变量名有冲突,所以这时就不得不使用 this 关键字,可修改为以下代码:

public class Student{// 成员变量// 代表通过所需要的分数double sorce;// 成员方法// 判断是否通过public void checkPass(double sorce){// this 代表该对象// this.sorce 就代表该对象的成员变量,也就是该类中定义的那个 sorce// 而 sorce 遵循就近原则,代表形参if(sorce > this.sorce){System.out.println("恭喜你通过了!");}else{System.out.println("很遗憾,你落选了");}} 
}

6. 构造器

6.1 什么是构造器?

构造器是一种特殊的方法,但这个方法没有返回值类型,并且方法名必须和类名相同。

例如:

public class Student{public Student() {System.out.prinln("这是一个无参数构造器");}public Student(int age) {System.out.println("这是一个有参数构造器");}
}

6.2 构造器作用

构造器既然与类名相同,也就代表着,当我们创建对象时,对应的构造器也会执行

例如:
在这里插入图片描述
可以看到,当我们创建对象时,根据传参的不同,会执行相应的构造器,换句话说:new 对象就是在执行构造器

6.3 构造器应用场景

构造器是在创建对象时起作用的,所以可以在创建对象时给对象的属性做一些初始化操作,例如:
在这里插入图片描述
可以看到,当我们在创建对象时,通过有参构造器,就可以进行传参并初始化对应的成员变量。

构造器在使用时应注意以下几点:

  • 在一个类中,若不书写构造器,Java 会自动生成一个无参数构造器;
  • 一旦定义了有参数构造器,Java 便不会提供无参数构造器,此时建议自己写一个无参数构造器

7. 封装性

面向对象有三个核心的特性:封装性、继承性、多态性。下面我们来了解以下封装性

7.1 什么是封装?

封装就是用类设计对象处理某一个事物的数据时,把要处理的数据,以及处理数据的方法,都设计到一个对象中去。不恰当的说,就是自己的问题自己解决。

比如:在设计学生类时,我们把学生的各种信息以及需要用到的方法都封装到一个类中。

public class Student {String name;double score;public void CheckPass(){if(score > 60){System.out.println("及格了");}else{System.out.println("没及格");}}
}

7.2 封装的设计规范

封装的设计规范可以总结为:合理隐藏、合理暴露

我们将一系列信息封装成一个类,是为了让用户使用这个类来解决问题,我们更希望用户能够调用一个接口便能解决一个复杂问题,而不是把一个复杂问题交给用户自己去做。就如同车企做一台汽车,车企让用户通过油门、刹车、方向盘等方式来操控汽车,而不是让用户直接控制发动机、点火装置、行车电脑等内部的设备,因为这样不仅操作复杂,还非常危险。

7.3 封装的书写

首先我们介绍一个修饰符private,被该修饰符修饰的变量或者方法,只能在本类中被访问。
例如:

public class Student {private int i = 1;int j = 2;public void Print(){System.out.println(i);// 输出1System.out.println(j);// 输出2}
}class Tree {Student st = new Student();public void Print(){System.out.println(st.i);// 报错System.out.println(st.j);// 输出2}
}

如上述代码所示,private int i就相当于把变量i封装在Student对象的内部,不对外暴露,也就不能直接访问这个变量了。

我们可以通过对外暴露一个方法,通过该方法来间接访问变量,这样既不会直接暴露成员变量,又可以访问它。


例如:

public class Student {private int score;// 赋值public void setScore(double score){this.score = score;}// 获取public void getScore(){return score;}
}

上述代码中,我们将变量score隐藏起来,通过方法setScore(double score)就可以来接收用户的输入,通过方法getScore()就可以来获取变量的值,这样合理隐藏,合理暴露的编程思想使得代码更为安全。

8. 实体JavaBean

在面向对象编程中,我们会经常书写一种特殊的类——实体JavaBean类,它有如下特点:

  • 这个类中的成员变量都要私有,并且要对外提供getXXX、setXXX方法
  • 类中必须要有一个公共的无参的构造器

例如:

public class Student {//所有成员变量都要私有化private String name;private int id;private double score;//类中必须提供一个公共的无参构造器public Student() {}//为每个成员变量提供Getter和Setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}
}

实体类中除了有给对象存取数据的方法,就没有其他功能了,所以实体类的作用就是来封装数据

实际开发中,我们将数据单独通过实体JavaBean类来封装,处理数据的方法又通过另一个类来封装。这样就实现了数据和数据业务处理相分离。

例如:
在这里插入图片描述



本文结束


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

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

相关文章

《华为云主机:1024的惊喜馈赠》

《华为云主机:1024的惊喜馈赠》 一、1024 华为送云主机之缘起(一)特殊日子的馈赠意义(二)华为云主机活动初衷 二、华为云主机领取攻略(一)领取条件全解析(二)具体领取步骤…

第10章 自定义控件

第 10 章 自定义控件 bilibili学习地址 github代码地址 本章介绍App开发中的一些自定义控件技术,主要包括:视图是如何从无到有构建出来的、如何改造已有的控件变出新控件、如何通过持续绘制实现简单动画。然后结合本章所学的知识,演示了一个…

开始使用HBuilderX开发网页

1 给我一个用hbuilderx的理由 首先看一个截图: 现在技术更新太快了,大家伙儿也都用windows10甚至了11了,而我们还在使用熟悉的windows7,这对于编程桌面端没问题的,但是网络编程真实够费劲的了,或者用pytho…

ffmpeg视频滤镜:添加边框-drawbox

滤镜介绍 drawbox 官网链接 > FFmpeg Filters Documentation 这个滤镜会给视频添加一个边框。 滤镜使用 参数 x <string> ..FV.....T. set horizontal position of the left box edge (default "0")y <string&…

单向数据流在 React 中的作用

文章目录 单向数据流在 React 中的作用什么是单向数据流&#xff1f;单向数据流的优势如何实现单向数据流1. 父组件传递 props2. 状态提升 结论 单向数据流在 React 中的作用 什么是单向数据流&#xff1f; 单向数据流是指数据在应用程序中只按照一个方向流动。在 React 中&a…

uniapp学习(008-2 图片模块和分享模块)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第93p-第p103的内容 文章目录 详情页图片问题storage缓存图片网络消耗问题使用计算属性获取详细信息 保存壁纸到…

双十一宠物空气净化器决胜局,希喂、安德迈哪款性价比更高?

秋天到了&#xff0c;新一轮的猫咪换毛季又来了。尽管每天下班很累&#xff0c;但也不得不花上不少时间清理。有时候想偷懒&#xff0c;但身体是第一个反对的。要知道&#xff0c;长期堆积的猫毛除了会破坏家中的干净整洁外&#xff0c;浮毛还会随呼吸进入我们体内&#xff0c;…

工程项目智能化管理平台,SpringBoot框架智慧工地源码,实现工程建设施工可视化、智能化的全过程闭环管理。

智慧工地管理系统的建设以“1个可扩展性平台2个应用端3方数据融合N个智能设备”为原则。以“智、保、安、全”为导向&#xff0c;与工程建设管理信息系统、综合安防平台深度集成&#xff0c;构建统一的标准化工地平台&#xff0c;实现现场人员、车辆、项目、安全、进度等方面的…

springboot 自定义错误页面

自定义错误页面 背景&#xff1a;当我们访问应用程序不存在的接口路径或者参数传递不规范时&#xff0c;springboot 默认提示 如下页面 该页面对用户不友好&#xff0c;我们可以自定义展示错误页来改善。 优化后的简洁效果&#xff0c;可对 html 页面进一步美化&#xff0c;…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤&#xff1a;1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网&#xff1a;https://www.rabbitmq.com/docs 二、开发步骤&#xff1a;…

低代码统一待办:提升任务管理效率的新模式

低代码平台的魔力 低代码平台通过图形化用户界面和简化开发流程&#xff0c;让用户无需具备深厚的编程知识也能快速构建应用程序。这种技术不仅加速了应用开发速度&#xff0c;还大幅降低了开发成本和复杂度&#xff0c;适合各种规模的企业。 构建统一待办系统的优势 集中化管…

itertools模块的combinations很牛

在 Python 中&#xff0c;combinations 是 itertools 模块提供的一个非常有用的函数&#xff0c;用于生成给定序列的所有可能的组合&#xff08;不考虑顺序&#xff09;。combinations 函数可以生成从长度为 r 的所有子集&#xff0c;其中 r 是一个指定的正整数&#xff0c;表示…

React中管理state的方式

使用useState 使用useReducer 既然已经有了useState&#xff0c;为什么还需要useReducer呢&#xff1f; 那么useReducer是如何将解决这些问题的呢&#xff1f; reducer是如何更新state的呢&#xff1f; reducer的工作方式非常类似JavaScript中的reduce方法&#xff0c;随着时…

CSS网页布局综合练习(涵盖大多CSS知识点)

该综合练习就是为这个学校静态网页设置CSS样式&#xff0c;使其变成下面的模样 其基本骨架代码为&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content…

放大器的保护机制

在工作中&#xff0c;使用功率放大器或高压放大器这类精密仪器时&#xff0c;为了保护设备不受伤害&#xff0c;确保设备的稳定性和安全性&#xff0c;在设备上需要设置保护机制。保护机制起着至关重要的作用&#xff0c;可以防止设备因过流、过压、过热等因素而受损。放大器的…

JavaSE笔记4】API、包、String类、Object类

目录 一、API 二、包 2.导入不同包下的同名程序 三、String 1. String类是什么&#xff1f; 2. 如何创建String对象?(常用的四种方法&#xff09; 3. String API a. 遍历字符串 b. 判断字符串内容是否相等&#xff1a; c. 截取子串 d. 替换部分内容 e. 匹配子串 f. 匹配开头字…

「C/C++」C/C++ 之 判断语句

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

nrm的使用

在安装nrm之前&#xff0c;要先完成node.js的安装。 1、nrm的介绍 ‌nrm&#xff08;npm registry manager&#xff09;是一个npm源管理器&#xff0c;允许用户在不同npm源之间快速切换。 关于npm和nvm的介绍&#xff0c;详见文章nvm的使用-CSDN博客。 解释&#xff1a;比如…

芯片上音频相关的验证

通常芯片设计公司&#xff08;比如QUALCOMM&#xff09;把芯片设计好后交由芯片制造商&#xff08;比如台积电&#xff09;去生产&#xff0c;俗称流片。芯片设计公司由ASIC部门负责设计芯片。ASIC设计的芯片只有经过充分的验证&#xff08;这里说的验证是FPGA&#xff08;现场…

【论文分享】通过太阳轨迹和街景图像测量不同街道网络方向的太阳辐射及其时空分布

本次我们给大家带来一篇SCI论文的全文翻译。该论文利用街景数据和太阳轨迹模拟技术&#xff0c;揭示了不同方向街道上的太阳辐射在时空上的差异&#xff0c;为城市的可持续发展提供了更有针对性的策略。 【论文题目】 Measuring solar radiation and spatio-temporal distrib…