Java开发从入门到精通(七):Java的面向对象编程OOP:语法、原理、this、构造器

Java大数据开发和安全开发

  • (一)Java的面向对象编程
    • 1.1 什么是面向对象
    • 1.2 面向对象和面向过程的区别
    • 1.3 面向对象开发设计特征
    • 1.4 面向对象语法
      • 1.4.1 先创建对象模板
      • 1.4.2 实例化对象
      • 1.4.3 对象又该怎么理解?
      • 1.4.4 对象在计算机中的执行原理
    • 1.5 类和对象的一些注意事项
      • 1.5.1 多个变量指向同一个对象,需要注意什么?
      • 1.5.2 如果某个对象没有任何变量指向它了,需要注意什么?
    • 1.6 this
    • 1.7 构造器

(一)Java的面向对象编程

1.1 什么是面向对象

在 Java 中,面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将程序设计的重点放在对象和它们之间的关系上。对象是程序
中用来表示现实世界中的实体或概念的实体,例如人、动物、汽车、账户等。

1.2 面向对象和面向过程的区别

面向对象和面向过程是两种不同的编程范式,它们在编程思路和代码组织方式上有所不同。

  • 面向过程编程(Procedure-OrientedProgramming)是一种以过程为中心的编程方式,它将问题分解为一系列步骤或函数,并按照顺序执行这些步骤来解决问题。在面向过程编程中,程序由一系列函数组成,每个函数执行一个特定的任务。
  • 相比之下,面向对象编程强调以对象为中心,将问题抽象为对象,并通过对象之间的交互来解决问题。在面向对象编程中,程序由一系列对象组成,每个对象具有自己的属性和行为。

以下是面向对象编程和面向过程编程之间的一些主要区别:

  • 编程思路:面向对象编程更注重模拟现实世界中的事物和关系,将问题抽象为对象;而面向过程编程更注重问题的步骤和算法。
  • 代码组织:面向对象编程将代码封装在对象内部,通过对象之间的交互来组织代码;而面向过程编程将代码组织为一系列函数。
  • 数据封装:面向对象编程将数据和相关的操作封装在一起,对象对其内部数据进行保护;而面向过程编程中,数据通常以全局变量或参数的形式在函数之间传递。
  • 代码重用:面向对象编程通过继承和多态性实现代码重用;而面向过程编程中,代码重用通常通过函数的调用和参数传递来实现。
  • 可维护性:面向对象编程的代码更容易理解和维护,因为它更贴近现实世界的概念;而面向过程编程的代码可能更容易理解和维护,因为它更关注问题的步骤和算法。

1.3 面向对象开发设计特征

  • 开发的过程:其实就是不断的创建对象,使用对象, 指挥对象 ,做事情。
  • 设计的过程:其实就是在管理和维护对象之间的关系。

面向对象的特征:

  • 封装(encapsulation)
  • 继承(inheritance)
  • 多态(polymorphism)

面向对象编程的优点

  • 提高代码复用性。
  • 使用者无需关心具体细节。
  • 转变程序员角色,更加符合人的思维习惯。

1.4 面向对象语法

  • 创建对象模板,用来供不同的对象调用
  • 然后开发一个一个的对象,把数据交给对象,再调用对象的方法来完成对数据的处理
  • 属性: 对应类中的成员变量。
  • 行为: 对应类中的成员函数。

类的语法格式:

  • 定义类其实在定义类中的成员(成员变量和成员函数)
public class Student {  //声明类String name;  //定义成员变量public void printTotalScore() {  //成员方法System.out.println();}
}

面向对象案例解释:

  • 计算机是用来处理数据的
  • java使用变量来存储单个数据,数组存储多个数据
  • 在处理波妞的数据时需要先创建波妞对象,再赋值数据给她,这就需要用到OOP

在这里插入图片描述

1.4.1 先创建对象模板

创建类模板,直接接受各类对象数据进行处理

public class Student {String name;double chinese;double math;public void printTotalScore() {System.out.println(name + "的总成绩是:" + (chinese + math));}public void printAverageScore() {System.out.println(name + "的平均成绩是:" + (chinese + math) / 2.0);}
}

1.4.2 实例化对象

实例化对象向模板传递不同的对象数据,让模板来处理,然后返回我们要的结果

public class Test {public static void main(String[] args) {// 目标: 面向对象编程快速入门。// 1、创建一个学生对象,封装播妞的数据Student s1 = new Student();s1.name = "播妞";s1.chinese = 100;s1.math = 100;s1.printTotalScore();s1.printAverageScore();// 2、再创建一个学生对象,封装播仔的数据Student s2 = new Student();s2.name ="播仔";s2.chinese = 59;s2.math = 100;s2.printTotalScore();s2.printAverageScore();}
}
  • 这种编程套路是怎么出来的?有什么好处呢?

在这里插入图片描述

  • 汽车的数据 找汽车对象处理
  • 手机的数据 找手机对象处理
  • 学生的数据 找学生对象处理
  • 符合人类思维习惯,编程更简单、更直观

1.4.3 对象又该怎么理解?

  • class也就是类,也称为对象的设计图 (或者对象的模板)也就是表的设计者 整个代码就是写了一个表的模板

在这里插入图片描述

  • public class student 表示设计的表是一个学生表
  • string name 表示表的字段内容
  • viod printAverageScore 表示怎么处理表的数据 (求和 平均值)

在这里插入图片描述

  • 对象其实就是一张表
  • 对象本质上是一种特殊的数据结构
  • 实例化对象其实就是给这个表填上数据,
  • 方法就是处理这个成绩 算出这个成绩的平均分 总和

在这里插入图片描述

1.4.4 对象在计算机中的执行原理

程序在执行时先将test.class加载进方法区。接着读取Test类和mian方法到方法区,mian方法是要在栈内存中运行的,所以在栈内存中划出main方法的区域,把mian方法传送过去执行,接着读取发现使用到了学生类,就加载学生类到方法区,包括student的变量和方法,然后是创建s1学生变量,我们说过变量是在栈内存中运行的,所以在栈内存中开辟一个Student s1变量的空间,然后发现S1变量的右边是new 了一个studnet的对象,我们说过new是要在堆内存中运行,所以在堆内存中开辟一个student对象的空间,把对象的变量存储在里面,同时这个空间也会生成对象地址和一个类的地址,类地址指明当前对象是由那一个对象创建出来的,所以类对象会指向student.class 类,而S1存储就是对象的地址,所以当调用类方法时首先会按照s1指向的对象地址找到是哪个对象,然后再有对象地址找到类地址,由类地址指明是对象是哪个类创建的,在这个类中找到要执行的方法,产生结果
在这里插入图片描述

1.5 类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如: Student、Car…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。
  • 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义)
    在这里插入图片描述
  • 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名.
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。
  • 如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象
package com.qianxin.object;public class Student {
//成员变量String name;  //变量初始值:null   自己设置初始值是没有意义的double chinese;//变量初始值:0.0double math;//变量初始值:0.0
//成员方法public void printTotalScore() {System.out.println(name + "的总成绩是:" + (chinese + math));}public void printAverageScore() {System.out.println(name + "的平均成绩是:" + (chinese + math) / 2.0);}}class Techer(){  //可以有多个类}

1.5.1 多个变量指向同一个对象,需要注意什么?

在这里插入图片描述

1.5.2 如果某个对象没有任何变量指向它了,需要注意什么?

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾
    • Java存在自动垃圾回收机制,会自动清楚掉垃圾对象,程序员不用操心。

在这里插入图片描述

1.6 this

  • this就是一个变量,可以用在方法中,来拿到当前对象
  • 谁调用对象,这个this就是谁

在这里插入图片描述

public class StudentTest {double score;public void printThis(){System.out.println(this);}public void printPass(double score){if (this.score > score){System.out.println("恭喜您,您成功考入了哈佛大学了~~");} else {System.out.println("落选了~");}}
}
public class ThisTest {public static void main(String[] args) {StudentTest s1 = new StudentTest();s1.printThis();StudentTest s2 = new StudentTest();s2.printThis();StudentTest s3 = new StudentTest();s3.printPass(250);}
}

this是怎么获取对象呢
实际上它默认有个参数 (Student this)
在这里插入图片描述

1.7 构造器

在这里插入图片描述

构造器的定义:
在这里插入图片描述
构造器和类同名:

public class GouZaoQi {// 无参数构造器public GouZaoQi() {}// 有参数构造器public GouZaoQi(String name, double score) {}
}

构造器的特点:

  • 创建对象时,对象会去调用构造器
  • 创建对象时,传递值就调用有参数构造器
  • 创建对象时,没有值就调用无参数构造器
public class GouZaoQi {// 无参数构造器public GouZaoQi() {System.out.printn("无参数构造器被触发执行了~");}// 有参数构造器public GouZaoQi(String name, double score) {System.out.printn("有参数构造器被触发执行了~");}
}

实例化对象调用

public class GouZaoQiTest {public static void main(String[] args) {GouZaoQi gzq= new GouZaoQi(); //无参数 创建对象时,没有值就调用无参数构造器}
}
无参数构造器被触发执行了~
public class GouZaoQiTest {public static void main(String[] args) {GouZaoQi gzq= new GouZaoQi("潘仔",99);  //有参数 创建对象时,传递值就调用有参数构造器}
}
有参数构造器被触发执行了~

在这里插入图片描述

创建对象时,同时完成对对象成员变量(属性)的初始化赋值。

public class GouZaoQiTest {public static void main(String[] args) {GouZaoQi gzq= new GouZaoQi("小黑",99);  //初始化赋值。System.out.println(s2.name);System.out.println(s2.score);}
}
// 有参数构造器
public Student(String name,double score){System.out.println("有参数构造器被触发执行了~~");this.name = name;this.score =score;
}

构造器的注意事项

  • 类在设计时,如果不写构造器,Java是会为类自动生成一个无参构造器的
  • 一旦定义了有参数构造器,lava就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了

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

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

相关文章

python:消息推送 - 飞书机器人推送 - 富文本格式

简介:机器人 ( bot ) 是一种自动化的程序,可以用拟人化的身份自动推送消息,或在聊天里与你进行简单的交互。在自动化完成测试任务后,推送测试报告等是一种很常用的收尾工具。 历史攻略: python:消息推送 …

搭建知识管理系统并不复杂,这篇教程来帮你

许多人都有这样的体验:我们抓住的想法和知识总在不经意间溜走,我们想要的信息总是一时无法找到。因此,搭建一个能够系统化、分类和索引存储这些知识的“知识管理系统”是必要的。听上去很专业,其实并不复杂,让我们一步…

单目测距+姿态识别+yolov8界面+车辆行人跟踪计数

yolov5单目测距速度测量目标跟踪(算法介绍和代码) 1.单目测距实现方法 在目标检测的基础上,我们可以通过计算物体在图像中的像素大小来估计其距离。具体方法是,首先确定某个物体的实际尺寸,然后根据该物体在图像中的像…

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展,建筑行业也在不断迈向数字化转型的道路。在这个过程中,BIM(Building Information Modeling,建筑信息模型)技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

TikTok禁令引发数据安全和控制问题

darkreading网站消息,继众议院能源与商务委员会上周通过禁用流行社交媒体平台TikTok的法案后,美国国会于周三投票赞成该法案。该法案规定,任何受“外国”控股的企业需在180天内撤资。 长期以来,TikTok作为字节跳动的子公司&#x…

C#判断素数的方法:试除法 vs 优化的试除法 vs 米勒-拉宾素数检测算法

目录 1.素数也就质数 2. 试除法 3.优化的试除法_1 4.优化的试除法_2 5.优化的试除法_3 6.米勒-拉宾素数检测算法 1.素数也叫质数 一个质数是一个大于1的自然数,只有两个正因数:1和它自身。这意味着如果一个数只有两个正因数,那么它就是…

Google Play上架:谷歌支付政策变更

目录 政策发布时间概括内容付款政策变动内容归纳google付款用户政策政策发布时间 2024 年 3 月 6 日 概括内容 为遵守《数字市场法案》(DMA) 的规定,从 2024 年 3 月 6 日起,我们将更新付款政策,允许开发者将欧洲经济区 (EEA) 的用户引导至其应用之外的平台(包括推广应用…

Swift:.ignoresSafeArea():自由布局的全方位掌握

ignoresSafeArea(_ regions : edges:)修饰符的说明 SwiftUI布局系统会调整视图的尺寸和位置,以避免特定的安全区域。这就确保了系统内容(比如软件键盘)或设备边缘不会遮挡您的视图。要将您的内容扩展到这些区域,您可以通过应用该修…

目标检测——YOLOv4算法解读

论文:YOLOv4:Optimal Speed and Accuracy of Object Detection 作者:Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao 链接:https://arxiv.org/pdf/2004.10934.pdf 代码:https://github.com/AlexeyAB/darkne…

扛着半个互联网前进的core-js,其作者快被钱“拖垮”了。

Core-js 的作者是 Denis Pushkarev,他是一位俄罗斯的 JavaScript 开发者和贡献者。他在 2013 年创建了 core-js 项目,并一直积极地维护和更新这个库。 一、神奇的core-js Core-js 的月均 NPM 下载量为 2.5 亿次,总下载量高达 90 亿次&#xf…

城乡居民基本医疗信息管理系统|基于Springboot的城乡居民基本医疗信息管理系统设计与实现(源码+数据库+文档)

城乡居民基本医疗信息管理系统目录 目录 基于Springboot的城乡居民基本医疗信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、病例管理 2、医院资讯信息管理 3、医院资讯类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…

HTML_CSS练习:HTML注释

一、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>HTML注释</title> </head> <body><marquee loop"1">马龙强<!--下面的输入框是可以滚动的&#x…