Java自学(三)面向对象编程

目录

什么是面向对象

举例

this关键字和构造器

实体类

电影小案例


什么是面向对象

我们日常生活中谈到一个事物,总会描述它的性质与行为,这个事物也就是 ”对象”。比如一个学生对象,他的属性有姓名、学号、成绩......他的行为有上课、吃饭、睡觉.......将一个对象及其行为封装起来便于描述表达,这就是面向对象的思想。

举例

先在右边创建一个学生类,其成员变量有name, ID, grade,成员方法有分别获取3个属性的3种方法。

再在左边将对象模板实例化,也就是将抽象的学生类型抽象成具体的一名学生。针对实例化出的每一名学生可以设置不同的属性参数,并调用其成员方法。

在成员变量初始化时可以赋初始值,当然这么做没有意义,默认一开始成员变量是有初值的。

我们来看一下具体的实现过程:

 

this关键字和构造器

 这一块学了C++后再看感觉太亲切了,this 是为了避免变量重名而产生的。

这不能这么写吧?因此就有了this关键字。

构造器就类似于C++的构造函数,你不显示的写的话编译器会自动生成一个默认的无参构造器,要是你显示写了一个带参构造器,就不会自动生成,这时最好再自己加一个无参构造器。

构造器方便我们给成员变量赋初始值,这样可以不用在方法内部或者外部创建对象的时候赋值,而是直接调用构造器进行赋值。

 

实体类

什么是实体类?————它仅仅是用来保存数据的Java类,可以用它来创建对象。

它的成员变量必须私有,并且必须为其提供get , set方法以及无参构造器。

应用场景是针对数据和数据的处理分离,是目前主流的处理方式。

具体案例:

public class Student {private String name;private int ID;private double grade;public Student(String name, int ID, double grade) {this.name = name;this.ID = ID;this.grade = grade;}public Student() {}public 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 getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}
}

 这就是实体类,用来保存数据。

之前我们想打印成绩,或者判断成绩是否合格,是在Student类中定义方法,现在可以在创建一个StudentOperator类来描述该动作。

//StudentOperator类public class StudentOperator {private Student s;public StudentOperator(Student s){this.s = s;}public void passGrade(){if(s.getGrade() >= 3.0){System.out.println(s.getName()+s.getID()+"成绩合格");}else{System.out.println(s.getName()+s.getID()+"成绩不合格");}}
}
//Test类public class Test {public static void main(String[] args) {Student s1 = new Student("张三",2021,3.0);StudentOperator operator = new StudentOperator(s1);operator.passGrade();}
}

结果: 

电影小案例

//Movie classpackage demo;public class Movie {private int ID;private String name;private double price;private double score;public Movie() {}public Movie(int ID, String name, double price, double score) {this.ID = ID;this.name = name;this.price = price;this.score = score;}public int getID() {return ID;}public void setID(int ID) {this.ID = ID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}
}
//MovieOperator classpublic class MovieOperator {private Movie[] movies;public MovieOperator(Movie[] movies){this.movies = movies;}public void Print(){System.out.println("打印全部电影信息");System.out.println("--------------------");for (int i = 0; i < movies.length; i++) {Movie m = movies[i];System.out.println(m.getName()+" "+m.getID()+" "+m.getScore()+" "+m.getPrice());System.out.println("--------------------");}}public boolean searchMovie(int ID){for (int i = 0; i < movies.length; i++) {Movie m = movies[i];if(ID == m.getID()){System.out.println(m.getName()+" "+m.getID()+" "+m.getScore()+" "+m.getPrice());return true;}}System.out.println("查找失败,电影不存在");return false;}
}
//Test classpublic class Test {public static void main(String[] args){Movie[] movies = new Movie[3];movies[0] = new Movie(001,"你的名字",39.9,8.9);movies[1] = new Movie(002,"天气之子",29.9,8.0);movies[2] = new Movie(003,"铃芽之旅",25.8,8.7);MovieOperator m = new MovieOperator(movies);Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入数字 0, 1,2以选择相应的小程序");int r = sc.nextInt();switch(r){case 0:System.out.println("退出程序");return;case 1:m.Print();break;case 2:System.out.println("请输入你要查找的电影编号");int id = sc.nextInt();boolean flag = m.searchMovie(id);break;default:System.out.println("输入不合法的数字,请重新输入");break;}}}
}

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

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

相关文章

装饰器模式详解和实现(设计模式 二)

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将对象添加到现有对象中&#xff0c;以提供额外的功能&#xff0c;同时又不影响其他对象。 实现示例 1.定义一个接口或抽象类&#xff0c;表示被装饰对象的公共接口 //抽…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置&#xff1b; 采用注解的方式可以让我们 固化配置&#xff0c;降低代码编写复杂度、减少配置错误情况的发生&#xff0c;提升编码调试的效率、提高业务的可用性。 为什么说“降低…

QT编译报错stdlib.h:No such file or directory

如图&#xff0c;需要将第19行&#xff0c;INCLUDEPATH /usr/include 注释掉 原因分析&#xff1a; 在Ubuntu的CSTDLIB中&#xff0c;使用的是#include_next下“stdlib.h” &#xff0c;自行增加/usr/include 把include_next的顺序打乱&#xff0c;造成编译错误。但是在cento…

Ubuntu 20.04编译GPMP2过程记录

前言 GPMP2是董靖博士等人在16-17年提出的结合GTSAM因子图框架与Gaussian Processes完成motion planning的一项工作。前身源于Barfoot教授的课题组提出的STEAM(Simultaneous Trajectory Estimation and Mapping)问题及其相关工作。在提出董靖博士提出GPMP2后&#xff0c;borgl…

同步、异步

何为同步、异步&#xff1f; 同步任务&#xff08;synchronous&#xff09; 同步任务指的是&#xff0c;在主线程上排队执行的任务&#xff0c;只有前一个任务执行完毕&#xff0c;才能执行后一个任务&#xff1b;同步任务进栈顺序&#xff1a;先进后出&#xff0c;后进先出&…

网页采集工具-免费的网页采集工具

在当今数字化时代&#xff0c;网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作&#xff0c;网页采集工具都扮演着不可或缺的角色。对于许多用户来说&#xff0c;寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

基于微信小程序的刷题考试系统设计与实现(适用于各类考试类、答题类程序)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

JavaScript Web APIs第二天笔记

Web APIs - 第2天 学会通过为DOM注册事件来实现可交互的网页特效。 能够判断函数运行的环境并确字 this 所指代的对象理解事件的作用&#xff0c;知道应用事件的 3 个步骤 学习会为 DOM 注册事件&#xff0c;实现简单可交互的网页特交。 事件 事件是编程语言中的术语&#xff…

(一)gitblit安装教程

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 前言安装1.下载Java Runtime Requirement 2.设置环境变量3.gitblit内容3.1 gitblit文件夹内容3.2 defaults.properties 主要配置选项 4 配置4.1 准备文件4.2 修改gitblit.properties4.3 修改authori…

基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2015/CEC2018/CEC2023(MATLAB代码)

一、动态多目标优化问题 1.1问题定义 1.2 动态支配关系定义 二、 基于自适应启动策略的混合交叉动态多目标优化算法 基于自适应启动策略的混合交叉动态多目标优化算法&#xff08;Mixture Crossover Dynamic Constrained Multi-objective Evolutionary Algorithm Based on Se…

试图一文彻底讲清 “精准测试”

在软件测试中&#xff0c;我们常常碰到两个基本问题&#xff08;困难&#xff09;&#xff1a; 很难保障无漏测&#xff1a;我们做了大量测试&#xff0c;但不清楚测得怎样&#xff0c;对软件上线后会不会出问题&#xff0c;没有信心&#xff1b; 选择待执行的测试用例&#…

跨类型文本文件,反序列化与类型转换的思考

文章目录 应用场景序列化 - 对象替换原内容&#xff0c;方便使用编写程序取得结果数组 序列化 - JSON 应用场景 在编写热更新的时候&#xff0c;我发现了一个古早的 ini 文件&#xff0c;记录了许多有用的数据 由于使用的语言年份较新&#xff0c;没有办法较好地对 ini 文件的…

map和set的具体用法 【C++】

文章目录 关联式容器键值对setset的定义方式set的使用 multisetmapmap的定义方式insertfinderase[]运算符重载map的迭代器遍历 multimap 关联式容器 关联式容器里面存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。比如&#xff1a;set…

ARP欺骗攻击实操

目录 目录 前言 系列文章列表 全文导图 1&#xff0c;ARP概述 1.1,ARP是什么&#xff1f; 1.2,ARP协议的基本功能 1.3,ARP缓存表 1.4,ARP常用命令 2&#xff0c;ARP欺骗 2.1,ARP欺骗的概述? 2.2,ARP欺骗的攻击手法 3&#xff0c;ARP攻击 3.1,攻击前的准备 3.2,…

【Spring Boot】实战:实现数据缓存框架

🌿欢迎来到@衍生星球的CSDN博文🌿 🍁本文主要学习【Spring Boot】实现数据缓存框架 🍁 🌱我是衍生星球,一个从事集成开发的打工人🌱 ⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者…

Python3 如何实现 websocket 服务?

Python 实现 websocket 服务很简单&#xff0c;有很多的三方包可以用&#xff0c;我从网上大概找到三种常用的包&#xff1a;websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”&#xff0c; 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…

SQL血缘解析原理

根据sql解析获取到表到表, 字段到字段间的关系,即血缘关系。实际上这是从sql文本获取到数据流的过程。 大致步骤如下&#xff1a; 1.sql文本进行词法分析 2.sql语法分析获取到AST抽象语法树 3.访问AST抽象语法树根据语法结构推测出数据的流向,例如create as select from 这种结…

[vue-admin-template实战笔记]

1.克隆项目 git clone gitgitee.com:panjiachen/vue-admin-template.git 2.安装依赖 npm install 3.运行项目就会自动打开网页&#xff0c;并且热部署插件 npm run dev 4.查看代码 //将vue-admin-template拖入到idea中即可查看代码 1)并且发现&#xff0c;常用的东西已经集…

Machine Learning(study notes)

There is no studying without going crazy Studying alwats drives us crazy 文章目录 DefineMachine LearningSupervised Learning&#xff08;监督学习&#xff09;Regression problemClassidication Unspervised LearningClustering StudyModel representation&#xff08…