java面向对象编程入门

news2025/2/16 2:26:53

一、前言:

在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 ){
    //扩充数组,在老的数组上+1
    Student[] 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];
           //获取数组中学生的id
          if(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.coloradmin.cn/o/1977584.html

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

相关文章

在windows本地机搭建gitlab

在windows本地机搭建gitlab 1. 解决方案2. docker安装gitlab2.1 下载Docker Desktop2.2 安装gitlab的docker2.3 配置gitlab网页2.3 配置gitlab配置文件 3. frp端口转发4. ssh密钥配置5. 运行 1. 解决方案 注&#xff1a;gitlab只有linux版本&#xff0c;并不存在windows版本&a…

小柴带你学AutoSar系列三、标准和规范篇(2)BSWGeneral

BSWDistributionGuide BSW在AUTOSAR架构中的这里哦 BSW Distribution in Multi-Core Systems BSW Functional Clusters BSW功能集群是一组相关功能的模块 BSW functional clusters are groups of functionally coherent BSW modules. The following types of clusters might…

如何搭建云电脑?让数据更安全。。。。。。

上周,微软Windows系统的蓝屏故障对各行各业造成了严重影响。航空业首当其冲,当天所有航班停飞,人员滞留在机场。 酒店业也未能幸免,同样受到波及。 1. 故障分析及解决措施 本次蓝屏事件的导火索是CrowdStrike公司更新的驱动程序。CrowdStrike提供的解决方案相当复杂,用户需要…

JavaFX布局-ScrollPane

JavaFX布局-ScrollPane 常用属性paddingcontentvbarPolicyhbarPolicyfitToWidthfitToHeight 实现方式Java实现 一个容器组件&#xff0c;用于展示那些可能超出窗口尺寸的内容当内容超过容器的大小时&#xff0c;会自动出现滚动条 常用属性 padding 内边距&#xff0c;可以单独…

【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)

一、设备报修工作内容 1.工单管理&#xff1a;设备报修系统可以将设备故障统计为工单并对工单进行汇总管理。将工单数据进行归类&#xff0c;将故障分类进行查看、统计、分析等等。 2.设备状态&#xff1a;工单可通过用户上报设备状态数据进行查看&#xff0c;维修工程师在维…

跟李沐学AI:LeNet

LeNet整体由两部分组成&#xff1a;由两个卷积层组成的卷积编码器、由三个全连接层组成的全连接层密集快。 每个卷积块的基本单元是一个卷积层、一个sigmoid激活函数和平均池化层。每个卷积层使用5x5的卷积核和一个sigmoid激活函数。 这些层将输入映射到多个二维特征输出同时输…

保研机试练习:leetcode算法top200(第二弹)

&#x1f32e;101.对称二叉树&#xff08;简单&#xff09; &#x1f35f;题目描述 &#x1f35f;题目反思 对称二叉树&#xff0c;对每个节点来说&#xff0c;就是当前节点相同&#xff0c;且左右镜像相等。这道题目重点也是在于掌握递归检查树上。 &#x1f35f;代码 /**…

C# 自定义控件无法加载

问题 在做winform开发时自己定义了一个控件&#xff0c;控件在工具箱中显示了&#xff0c;但是拖动到窗体设计器时会提示未能加载工具箱项xxx&#xff0c;将从工具箱中将其删除&#xff0c;如下图所示: 点击确定后&#xff0c;控件会从工具箱中移除。 解决方法 将 生成>…

深信服的云桌面操作简要

看了深信服的云桌面操作手册&#xff0c;讲真&#xff0c;我是没有耐心看的&#xff0c;656页&#xff0c;我是云桌面管理员&#xff0c;为了管理也必须耐着性子去看&#xff0c;但我看了40页就看不下去了&#xff0c;太啰嗦了。 深信服的技术人员安装好服务器后给我实际演示操…

【C++题解】1351. 买公园门票

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1351. 买公园门票 类型&#xff1a;简单穷举 题目描述&#xff1a; 某公园门票价格为&#xff1a;成人票 8 元 / 张&#xff0c;儿童票 3 元 / 张&#xff1b;某旅游团来公园游玩&…

Memcached未授权访问漏洞

Memcached未授权访问漏洞 Memcache能够提供临时数据存储服务&#xff0c;可以提高网站的整体性能&#xff0c;但由于memcache安全设计缺陷&#xff0c;默认开放的端口是11211&#xff0c;导致不需要密码就可以访问&#xff0c;攻击者可以直接连接服务器的11211端口获取数据库中…

GIt最新教程通俗易懂

Git学习笔记 一、Git版本控制分类1.1 本地版本控制1.2 集中版本1.3 分布式版本控制系统1.5 Git和SVN的区别二、Git的历史 三、Gti基础学习3.1 Git的基础学习3.2 启动Git 3.3 Git基本的配置3.3.1 配置文件相关位置 四、Git基本理论&#xff08;核心&#xff09;4.1 Git 的工作流…

vue echarts 柱状图和折线图的组合

柱状图和折线图的组合代码如下&#xff1a; <template><div><div id"barLineChart" ref"barLineChartRef" style"width: 100%; height: 450px"></div></div> </template><script> import * as echar…

【收录率高丨最快会后3-4个月EI检索 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议&#xff08;ICOCT 2024&#xff09;&#xff0c;该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来&#xff0c;ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一&#xff0c;聚焦最前沿的技术进展与未来发展趋势…

C/C++大雪纷飞代码(完整代码)

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C++实现的大雪纷飞代码,一起来看看吧! 系列推荐 序号目录直达链接1爱心代码C/C++爱心代码(完整代码)_爱心代码编程c++语言-CSDN博客2李峋同款跳动的爱心C/C++李峋同…

详解高性能中间件Iceoryx在ROS2中的使用

文章目录 0. 概述1. 系统架构对比1.1 移除 Master 节点1.2 引入 DDS 系统1.3 跨平台支持 2. DDS 系统的引入2.1 RMW 概述2.2 QoS&#xff08;质量服务策略&#xff09; 3. ROS2安装与配置3.1 一键安装3.2 官网教程 4. [ROS2 底层切换 Iceoryx 官方实现](https://github.com/ros…

安全与效率并重:利用PowerShell脚本实现SQL Server网络配置的自动化监控与日志

目录 脚本概述 步骤实现 注意事项 创建一个PowerShell脚本&#xff0c;用于自动发现并记录SQL Server上所有连接的网络配置细节&#xff0c;包括端口、协议和安全性设置&#xff0c;是一个非常实用的操作&#xff0c;特别是在需要定期审计或新服务器部署时。以下是一个创意性…

【深度学习】【框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

实体业短视频基础剪辑:拍摄剪辑实用10大技巧+剪辑全集(29节)

课程目录 01.第一节|找对标.mp4 02.第二节|快速提取对标音乐.mp4 03.第三节|踩节拍.mp4 04.第四节|导入镜头.mp4 05.第五节|调节比例.mp4 06.第六节|变速.mp4 07.第七节|添加字幕.mp4 08.第一节|推镜头.mp4 09.第二节|拉镜头.mp4 10.第三节|下摇镜头.mp4 11.第四节|…