java面向对象编程入门

一、前言:

在Java中,面向对象编程(Object-Oriented Programming, OOP)是一种核心的编程范式。Java的设计和开发都是基于面向对象的思想。面向对象编程的主要目的是提高代码的可重用性、灵活性和可维护性。以下是Java面向对象编程的一些关键概念和特点:
面向对象编程的基本特性:
封装 (Encapsulation):封装是将数据和对数据的操作绑定在一起的过程,并对外部隐藏内部实现细节。在Java中,通过使用访问控制符(如private, protected, public)以及构造器、getter和setter方法来实现封装。
继承 (Inheritance):继承允许创建一个新类(子类)继承现有类(父类)的属性和方法。这有助于减少代码重复并建立类之间的层次结构。
多态 (Polymorphism):多态是指一个接口可以有多种不同的实现方式。在Java中,可以通过方法重载(overloading)和方法覆盖(overriding)来实现多态。
抽象 (Abstraction):抽象是通过抽象类和接口来实现的,它允许定义行为而不关心具体的实现细节。
 

二、类

1、类是java中重要的数据类型(引用数据类型),是组成java程序的基本要素。它封装了一类对象数据和操作。

package 复杂数组对象练习;public class Student {private String name;private int age;private int id;public Student() {}public Student(String name, int age, int id) {this.name = name;this.age = age;this.id = id;}public String getName() {return name;}public int getAge() {return age;}public int getId() {return id;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setId(int id) {this.id = id;}}

以上是一个Student类的定义 ,在进行实例化的时候有两种方式:1、空参构造public Student() {}+set方法,这个需要我们在另一个文件中对每一个属性进行stu.setName("zhangsan"),等初始化操作,比较麻烦。2、全参构造public Student(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;}这个需要我们在另一个测试文件中,在Student stu =new Student("zhangsan",19,001)时传递参数。

不过这个2种方式在以后都会使用到。例如,如果我现在需要把张三的id修改成002,那我们就不用在重新写变全参构造里面的参数,而是直接写,stu.setId("002")这一步就相当于修改了id。

三、面向对象综合练习

首先,我们在每一个文件中只定义类,public 。继续引用·上面的Student类

package 复杂数组对象练习;public class Student {private String name;private int age;private int id;public Student() {}public Student(String name, int age, int id) {this.name = name;this.age = age;this.id = id;}public String getName() {return name;}public int getAge() {return age;}public int getId() {return id;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setId(int id) {this.id = id;}}

到此,我们Student类就定义完成了。不过如果,你使用的是idea的话,这一步可以有快捷键alt+insert,可以一键生成。

(2)、开始编写Student_Test测试类

package 复杂数组对象练习;public class Student_Test {public static void main(String[] args){Student stu1=new Student("zhangsan",18,1);Student stu2=new Student("lisi",19,2);Student stu3=new Student("wangwu",20,3);}

这一步先完成三个学生初始化。然后我们在把这个三个学生的信息存在数组中,不过这里需要注意数组的数据类型是引用数据类型Student

       Student  [] arr={stu1,stu2,stu3};

这样我们就把对象存在数组中,此时arr数组是对象数组。

接下来,我们继续分析要求1:添加一个学生,对其学号做判断,那如果id不存在那就添加这名学生的信息,如果id重复就提升,重新修改学的id,那对于添加学生的信息而言,又有判断,这个数组是不是已经满了,如果满了,那就扩大数组,如果没满那就正常添加。

假设,我们现在的数组是这样的(上面的那个数组不算)。显然,这里的数组已经满了,而我们知道,数组是不可变数据类型,所以我们只能重新建一个数组来存储第四位同学的信息。

        Student [] arr=new Student[3];arr[0]=stu1;arr[1]=stu2;arr[2]=stu3;

 这个时候我们可以在写一个方法在main方法的下面;

public static Student[] new_arr(Student[]arr){
//创建一个新的数组
Student [] new_arr=new Student [arr.length+1];
for(int i=0;i<arr.length;i++){
new_arr[i]=arr[i];}
return new_arr;
}

很明显,这块实现了把老数组扩大1,生成一个新的数组来存下stu4对象的信息。

接下来,我需要对学号进行一致性判断,如果存在相等的id那简单直接打印重新修改id即可。如果不一样那就直接添加。

public static blooean contains(Student[]arr,int id){
for(int i=0;i<arr.length;i++){
//把arr数组中所有的对象通过循环来放到stu中
Student stu =arr[i];
//保证stu不会是空的
if(stu!=null){
int sid=stu.getId();
if(sid=stu.getId()){
return true;}
}
}return false;}

然后,我们需要判断数组是不是已经满了,需要我们写一个方法来判断

public static int get_count(Student[]arr){int count=0;
for(int i=0;i<arr.length;i++){
Student stu =arr[i];if(stu!=null){
count++;
}
}
return count;}

 

 最后,我们需要打印一下信息:这块再写一个方法来完成

public static void print_arr(Student[] arr){for (int i = 0; i < arr.length; i++) {Student stu=arr[i];if ( stu!=null ){System.out.println(arr[i].getId()+" "+arr[i].getName()+" "+arr[i].getAge());}}}

完成版(要求1和2):

package 复杂数组对象练习;public class Student_Test {public static void main(String[] args){Student [] arr=new Student[3];Student stu1=new Student("zhangsan",18,1);Student stu2=new Student("lisi",19,2);Student stu3=new Student("wangwu",20,3);//把元素赋值给数组arr[0]=stu1;arr[1]=stu2;arr[2]=stu3;//1.再次添加一个学生,并在添加的时候做一个学号判断Student stu4=new Student("zhaoliu",21,4);//唯一性判断//已经存在,那就不添加//如果不存在,那就添加boolean flag=contains(arr,stu4.getId());if (flag){System.out.println("已经存在了");}else {
int count=get_count(arr);
if ( count==arr.length ){//扩充数组,在老的数组上+1Student[] new_arr=create_arr(arr);new_arr[count]=stu4;print_arr(new_arr);
}
else {//没有存满,直接加,由于拿到的count是数组中已经有的元素,所以可以不用在重新获取索引,//相当于下一个元素的直接索引arr[count]=stu4;//添加完成之后,遍历数组打印信息print_arr(arr);}}//如果数组存满了,那只能扩容在老数组+1}public static  boolean contains(Student [] arr,int id){for (int i = 0; i < arr.length; i++) {Student stu=arr[i];//获取数组中学生的idif(stu!=null){int sid=stu.getId();if ( sid==id) {return true;}}}      return  false;}public static int  get_count(Student[]arr){int count=0;for (int i = 0; i < arr.length; i++) {if ( arr[i]!=null ) {count++;}}return count;}public static  Student[] create_arr(Student[] arr){Student new_arr[]=new Student[arr.length+1];for (int i = 0; i < arr.length; i++) {//把老数组复制到新数组new_arr[i]=arr[i];}return new_arr;}public static void print_arr(Student[] arr){for (int i = 0; i < arr.length; i++) {Student stu=arr[i];if ( stu!=null ){System.out.println(arr[i].getId()+" "+arr[i].getName()+" "+arr[i].getAge());}}}//获取索引public static int get_index(Student[]arr,int id){for (int i = 0; i < arr.length; i++) {//依次获取每一个学生的对象Student stu=arr[i];if(stu!=null){int sid=stu.getId();if ( sid==id ){return i;}}}return -1;}}

四、学习面向对象的注意事项:

学习面向对象编程(OOP)时,特别是在Java中,有一些重要的注意事项可以帮助你更好地理解和应用这一编程范式。
1. 理解类和对象:
类是对象的抽象,它定义了对象的结构和行为。
对象是类的具体实例,每个对象都有自己的状态和行为。
2. 合理定义类的属性和方法:
根据需求确定类的特性和行为。
类的属性(字段)用于存储对象的状态。
类的方法用于定义对象的行为。
3. 注意封装性:
将类的内部实现隐藏起来,只暴露必要的接口。
使用访问控制符(如private、protected、public)来控制对类成员的访问。
提供公共的getter和setter方法来访问私有字段。
4. 方法定义:
定义方法时如果有返回值,至少需要有一个有效的return语句。
方法的逻辑应当清晰,尽量避免过长的方法。
5. 代码的可读性和可维护性:
使用有意义的命名约定。
保持代码整洁,遵循良好的编程实践。
添加适当的文档注释。

 

 

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

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

相关文章

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron 大家好我是csdn的red润 Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#x…

LeetCode每日一题_3143.正方形中的最多点数

解题思路&#xff1a;自己&#xff1a;先把points里的点拿来求出坐标系的离原点最远的点&#xff0c;然后根据最远距离新建一个数组&#xff0c;然后把points的点都在新建的数组上标记出来。然后再便利从边长为0的正方形开始&#xff0c;里面是否有重复的标签。但是代码写不出来…

vulhub-wordpress

1.打开wordpress关卡&#xff0c;选择简体中文 添加信息——点击安装WordPress 安装完成——登录 点击外观——编辑主题 可以加入一句话木马&#xff0c;但是我写入的是探针文件 也可以去上传一个带有木马的主题 上传之后会自动解压 1.php就是里面的木马文件

数据结构与算法 - 堆

1. 建堆 Floyd建堆算法作者&#xff08;也是之前龟兔赛跑判环作者&#xff09;&#xff1a; ①找到最后一个非叶子节点②从后往前&#xff0c;对每个节点执行下潜 一些规律 一棵满二叉树节点个数为2^h - 1&#xff0c;如下例中高度h 3节点数是2 ^ 3 - 1 7非叶子节点范围为…

PMP--冲刺--敏捷中的角色职责与3个工件--题干关键词

文章目录 敏 捷 中 的 角 色 职 责 与 3 个 工 件--题干关键词说明题目 敏 捷 中 的 角 色 职 责 与 3 个 工 件–题干关键词 角色职责 1、产品负责人&#xff1a;题干关键词 “优先级排序、与客户沟通、下次迭代做什么、接受或拒绝用户故事”。 2、Scrum Master&#xff1a;题…

uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战

样式 <view class="withdraw-section"><text class="section-title">提现金额</text><view class="amount-options"><view v-for="(item, index) in list" :key="index" class="amount-opt…

学习Java的日子 Day59 学生管理系统 web1.0版本

Day59 学生管理系统 web1.0 1.项目需求 有两个角色&#xff0c;老师和学生&#xff0c;相同的功能提取到父类用户角色 2.数据库搭建 设计学生表 设计老师表 插入数据 (超级管理员) 设计学科表 3.项目搭建 处理基础页面&#xff0c;分包&#xff0c;实体类&#xff0c;导入数据…

【初学人工智能原理】【12】循环:序列依赖问题

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub&#xff1a;1571859588/xiaobai_AI: 零基础入门人工智能 (github.com)&#xff0c;可以找到对应课程的代码 正文 对于…

LabVIEW水下根石监测系统

开发了一种基于LabVIEW平台开发的水下根石监测系统。该系统利用高精度姿态传感器与位移传感器&#xff0c;实现了水下根石状态的实时自动监测&#xff0c;提高了水利工程安全管理的现代化和精细化水平&#xff0c;具有高精度、高稳定性和良好的操作性。 项目背景&#xff1a; …

canvas绘制文本时,该如何处理首行缩进、自动换行、多内容以省略号结束、竖排的呢?

实现如标题所示的这些文本效果&#xff0c;在css看来&#xff0c;不就是一两行css属性。然而&#xff0c;对于canvas来讲&#xff0c;要想呈现这样的文字样式&#xff0c;就没css那么轻松简便了。 既然如此&#xff0c;那为何还要使用对文本支持度不友好的canvas来绘制文字呢&a…

【开发视角】大模型 RAG 检索增强生成究竟是什么

【大白话讲懂】大模型 RAG 检索增强生成 话先说在前面&#xff0c;本文不讲不会讲太多原理&#xff0c;仅面向工程开发&#xff0c;从工作流程的宏观角度进行梳理&#xff0c;旨在快速上手。 RAG 是什么 基本定义 让我们先来解释名词&#xff0c;看看宏观框架。 RAG 的意思…

科普文:微服务之SpringBoot性能优化器动态线程池【Dynamic-Tp】特性和源码解读

一、简述 gitee地址&#xff1a;https://gitee.com/yanhom/dynamic-tp github地址&#xff1a;https://github.com/lyh200/dynamic-tp dynamic-tp是一个轻量级的动态线程池插件&#xff0c;它是一个基于配置中心的动态线程池&#xff0c;线程池的参数可以通过配置中心配置进…

C++中lambda使用mutable关键字详解

C中lambda使用mutable关键字详解 在《C初学者指南-5.标准库(第二部分)–更改元素算法》中&#xff0c;讲“generate”算法时有下面这段代码&#xff1a; auto gen [i0]() mutable { i 2; return i; }; std::vector<int> v; v.resize(7,0); generate(begin(v)1, begin…

C++ STL在算法题中的常用语法

Vector 1.将vector<int>中的元素全部置换为0 fill(vec.begin(), vec.end(), 0); 2.vector容器是可以直接用比较是否值等的&#xff01; Unordered_set 1. unordered_set的删除&#xff08;count的值也会减少&#xff09; 2.unordered_map中的int默认值是0&#xff0c;…

在Jira中使用AI

Jira已经可以使用AI功能了。 如果您使用的是Jira Cloud&#xff0c;您需要请管理员在管理页面中打开AI功能开关。&#xff08;AI功能在Standard版中未提供&#xff0c;请使用Premium或更高级的版本&#xff09;如果您使用的是自己部署的Jira Data Center&#xff0c;您需要请管…

算法学习day28

一、寻找右区间(二分法) 题意&#xff1a;题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > e…

OpenCV||超详细的灰度变换和直方图修正

一、点运算 概念&#xff1a;点运算&#xff08;也称为像素级运算或单像素操作&#xff09;是指对图像中每一个像素点进行独立、相同的操作&#xff0c;而这些操作不会考虑像素点之间的空间关系。点处理优势也称对比度拉伸、对比度增强或灰度变换等。 目的&#xff1a;点运算…

【EtherCAT】Windows+Visual Studio配置SOEM主站——静态库配置+部署

目录 一、准备工作 1. Visual Studio 2022 2. Npcap 1.79 3. SOEM源码 二、静态库配置 1. 修改SOEM源码配置 2. 编译SOEM源码 3. 测试 三、静态库部署 1. 新建Visual Studio工程 2. 创建文件夹 3. 创建主函数 4. 复制静态库 5. 复制头文件 6. 配置头文件…

链接、装载和库——1 简介

前言 关于个人的读书笔记 第一章 温故而知新 1.1 从hello&#xff0c;world说起 ​计算机在执行hello&#xff0c;world的时候发生了什么&#xff1f; 1.2 万变不离其宗 ​在计算机多如牛毛的硬件设备中。有三个部件最为关键&#xff0c;它们分别是 CPU、内存和 I/O 控制芯…

一次多波束和浅地层处理的经历—信标机出问题?

最近处理多波束和浅地层时&#xff0c;一个从来没有过的问题出现了。 多波束数据(.pds)是由PDS2000采集的&#xff0c;使用设备型号为T50P。浅地层数据(.raw)是有SESWIN采集的&#xff0c;使用设备型号为SES2000 Standard。 1、多波束处理 多波束数据采用CARIS11.3处理的。船…