一篇文章带您了解面向对象(java)

news2024/11/16 13:27:08

1.简单理解面向过程编程和面向对象编程

面向过程编程:开发一个一个的方法,有数据需要处理,我们就可以调用方法来处理。

package com.web.quictstart;

public class demo1 {
    public static void main(String[] args) {
        totalScore("张三", 65, 68, 35);
        averageScore("张三", 65, 68, 35);
    }

    public static void totalScore(String name, double chinese, double math, double english) {
        double total = chinese + math + english;
        System.out.println("姓名:" + name + ";" + "总分:" + total);
    }

    public static void averageScore(String name, double chinese, double math, double english) {
        double averageScore = (chinese + math + english) / 3;
        System.out.println("姓名:" + name + ";" + "平均分:" + averageScore);
    }
}

面向对象编程:开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。

package com.web.quictstart;

public class student {
    String name;
    double chinese;
    double english;
    double math;

    public void totalScore() {
        double total = chinese + math + english;
        System.out.println(name + "总分:" + total);
    }

    public void averageScore() {
        double averageScore = (chinese + math + english) / 3;
        System.out.println(name + "平均分:" + averageScore);
    }
}
package com.web.quictstart;

public class studentTest {
    public static void main(String[] args) {
        student student1 = new student();
        student1.name="张三";
        student1.chinese=90;
        student1.math=99;
        student1.english=92;

        student1.totalScore();
        student1.averageScore();
    }
}

2.面向对象编程的好处

我们可以理解世间万物都是对象。要什么功能去找谁就好了。比如要汽车的数据,去赵汽车这个对象就好了,这样更加能够符合人类的思维,让编程更加简单,更加直观。

3.对象在程序中长什么样呢?

注意:在这里,笔者借用了培训机构传智研究院的张泽华老师和徐磊老师的讲解思路,在此,笔者十分感谢两位老师的辛苦付出,帮助广大学子在编程的路上解决疑惑)其实我们可以把对象理解为一种特殊的表格,这张表格长成什么样子那就要看对象长成什么样子,我们去调用这个对象,就可以说是往这个对象里面填写表格。new 一个就有一张表格。那么这张表又从哪里来的呢?首先,我们需要先去设计这张表,类就是来设计这张表的,也就是说类是对象的设计图,类里面的变量用来说明可以处理什么数据,类里面的方法主要是用来描述对象有什么功能,也就是说对数据处理进行什么样的处理。

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

先把类加载到方法区,执行main方法,main方法提取到栈内存中执行,new对象后,把类也加载到方法区,变量是放在方法里面的,所以会在main方法中开辟一块变量空间,new 出来的对象会放在堆内存,在堆内存里面开辟一块空间,用来代表该对象,也可以理解为这块空间是一张表。那么这个对象也就会有一个地址,然后按照类的变量和方法开辟变量空间,变量装的是默认值。除了这些还会有一个类的地址,类的地址会指向方法区的类,让后会把对象的地址交给栈内存的mian方法的对象。然后栈内存的对象按照这个地址去找栈内存的对象,然后把那些值赋值给那些默认值。

如果只是看这样的文字分析肯定是看不懂的,我们不如来画一张图来进行理解,我们用上面学生案例来进行画图。

 

注意:当堆内存中的对象,没有被任何变量引用(指向)时,他就会被判定为内存中的“垃圾”。

Java存在自动垃圾回收机制,会自动清除垃圾对象。

5.this

this是什么?

就是一个变量,可以用在方法中,用来指向当前对象。哪个对象调用方法,this就指向哪个对象,也就是拿哪个对象。

package com.web.quictstart.this_demo;

public class Student {
    public void printThis(){
        System.out.println(this);
    }
}
package com.web.quictstart.this_demo;

public class demo1 {
    public static void main(String[] args) {
        Student student1 =new Student();
        student1.printThis();
        System.out.println(student1);

        Student student2 = new Student();
        student2.printThis();
        System.out.println(student2);
    }
}

 

我们可以看到,this输出的地址值和调用它的对象的地址值是一样的。学生对象去调用方法的时候,它会把自己对象的地址传给这个方法的this接收,那么方法就会输出this输出的就是学生对象的地址了。

this的使用场景?

主要是用来解决:对象的成员变量与方法内部的变量名称一样的时候,导致访问冲突问题的。

package com.web.quictstart.this_demo;

public class Book {
    private String name;
    private double price;

    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;
    }
}

 

6.构造器

构造器语法:

public class Student {
    /**构造器*/
    public Student(){
        ...
	}
}

构造器有什么特点?

创建对象时,对象会去调用构造器。

package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();

    }
}
package com.web.quictstart.constructor;

public class Student {
    public Student() {
        System.out.println("无参数构造器被执行了。。。");
    }

    public Student(String name,double score){
        System.out.println("有参数构造器被执行了");
    }
}

package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student("张三",99.8);

    }
}

构造器的常见应用场景?

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

package com.web.quictstart.constructor;

public class Student {
    String name;
    double score;

    public Student() {
        System.out.println("无参数构造器被执行了。。。");
    }

    public Student(String name, double score) {
        System.out.println("有参数构造器被执行了");
        this.name = name;
        this.score = score;
        System.out.println("姓名:" + name + ":" + "成绩:" + score);
    }
}
package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student("张三",99.8);
        
    }
}

类在设计的时候,如果没有写构造器,java会为类自动生成一个无参构造器的。

但是,如果我们定义了有参构造器,java就不会帮我们的类自动生成无参构造器了,但是还是建议写一个无参构造器。

7.封装

什么是封装?

就是说,用类设计对象处理某一个事物的数据的时候,应该把要处理的数据,以及处理这些这些数据的方法,设计到一个对象中。

封装的设计规范

合理的隐藏(private),合理的暴露(public)。

代码演示:

package com.web.quictstart.constructor;

public class Student {
    private String name;
    private double score;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        if (score >= 0 && score <= 100) {
            this.score = score;
        } else {
            System.out.println("传入的分数不在范围内");
        }
    }
}

 

package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student();
        student.setName("张三");
        student.setScore(-5);

        System.out.println(student.getName());
        System.out.println(student.getScore());
    }

}

8.JavaBean实体类

什么是实体类?

就是一种特殊的类,这个类的所有变量都需要私有,并且都需要对外提供相对应的get和set方法。类中必须要有一个公共的无参构造器。

package com.web.quictstart.javabean;

public class Student {
    //成员变量必须私有的
    private String StudentName;
    private Integer age;
    private char sex;
    private double score;

    //必须要有一个公开的无参构造器
    public Student() {
    }

    public Student(String studentName, Integer age, char sex, double score) {
        StudentName = studentName;
        this.age = age;
        this.sex = sex;
        this.score = score;
    }

    public String getStudentName() {
        return StudentName;
    }

    public void setStudentName(String studentName) {
        StudentName = studentName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
package com.web.quictstart.javabean;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.setStudentName("张三");
        student.setAge(19);
        student.setScore(99.3);
        student.setSex('男');
        System.out.println(student.getStudentName());
        System.out.println(student.getAge());
        System.out.println(student.getScore());
        System.out.println(student.getSex());
    }
}

实体类的应用场景?

实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。

9.成员变量和局部变量的区别

区别成员变量局部变量
类中的位置不同类中、方法外常见于方法中
初始化值不同有默认值,不需要初始化赋值没有默认值,使用之前必须完成赋值
内存位置不同堆内存栈内存
作用域不同整个对象在所归属的大括号中
生命周期不同与对象共存亡随着方法的调用而生,随着方法的运行结束而亡

注意:本文章是笔者的学习笔记,因为笔者的能力有限,如果您在浏览或者运行代码的时候发现了问题,还请您在评论区留言,笔者在看到后会在第一时间解决,谢谢。

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

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

相关文章

05 JavaScript学习:语法

JavaScript 是一种动态类型的脚本语言&#xff0c;广泛用于网页开发和构建交互式网页。JavaScript 的语法相对简单&#xff0c;但功能强大&#xff0c;它可以在客户端执行&#xff0c;并与HTML和CSS一起构建交互式的网页。 JavaScript 字面量 在 JavaScript 中&#xff0c;字…

CUDA编程---线程束洗牌指令

从Kepler系列的GPU&#xff08;计算能力为3.0或更高&#xff09;开始&#xff0c;洗牌指令&#xff08;shuffle instruction&#xff09;作为一种机制被加入其中&#xff0c;只要两个线程在相同的线程束中&#xff0c;那么就允许这两个线程直接读取另一个线程的寄存器。 洗牌指…

实验 3--表的基本操作与数据查询

文章目录 实验 3--表的基本操作与数据查询4.3.1 实验目的4.3.2 实验准备实验内容1.在 SSMS 中向数据库 YGKQ 中的表插入数据。2.使用 T-SQL 语句向 YGKQ 中的表插入数据。3.在 SSMS 中删除数据库 YGKQ 中的表数据。4.使用 T-SQL 语句删除数据库 YGKQ中的表数据。5.在 SSMS 中修…

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …

《C语言深度解剖》(9):深度剖析数据在内存中的存储

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

ubuntu22.04 CH340/CH34x 驱动安装

CH34x驱动地址&#xff1a;CH341SER_LINUX.ZIP - 南京沁恒微电子股份有限公司 1、卸载旧驱动&#xff08;如果存在&#xff09; sudo rmmod ch341.ko 2、解压进入 driver 目录 unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver 3、编译 make 可能错误&#xff1a; make[1]…

Linux的学习之路:18、进程间通信(2)

摘要 本章主要是说一下命名管道和共享内存 目录 摘要 一、命名管道 1、创建一个命名管道 2、匿名管道与命名管道的区别 3、命名管道的打开规则 4、代码实现 二、system V共享内存 1、共享内存 2、共享内存函数 三、代码 四、思维导图 一、命名管道 1、创建一个命…

企业车辆管理系统平台是做什么的?

企业车辆管理系统平台是一种综合性的管理系统&#xff0c;它主要集车辆信息管理、车辆调度、车辆维修、油耗管理、驾驶员管理以及报表分析等多种功能于一体。通过这个平台&#xff0c;企业可以实现对车辆的全面管理&#xff0c;优化车辆使用效率&#xff0c;降低运营成本&#…

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

进程概述与进程创建

进程概述 程序和进程是计算机科学中的基本概念&#xff0c;它们经常被提到&#xff0c;尤其是在操作系统的上下文中。这两个概念虽然紧密相关&#xff0c;但有明显的区别&#xff1a; 程序&#xff08;Program&#xff09; 程序是指存储在磁盘上的一组指令和数据&#xff0c…

【Vue3】$subscribe订阅与反应

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

STM32标准库编程与51单片机直接写寄存器的区别和联系

简介&#xff1a; 在学完51单片机之后&#xff0c;我们去学习32的时候&#xff0c;会发现编程的方法有很大的区别&#xff0c;让人非常的不适应&#xff0c;但是通过不断的调用相应外设的库函数之后&#xff0c;你也可以去编程STM32&#xff0c;来实现功能&#xff0c;但是你真…

nodejs版本过高导致vue-cli无法启动的解决方案

目录 前言异常现象解决方案总结 前言 之前使用软件管家升级了Nodejs&#xff0c;今天在运行Vue项目的时候老是报错&#xff0c;查了很多资料&#xff0c;最后确定是Nodejs版本过高导致的。 异常现象 E:\project\ry\RuoYi-Cloud\ruoyi-ui>npm run dev> ruoyi3.6.4 dev …

Attention和Transformer灵魂七问

1. 引言 最近&#xff0c;ChatGPT和其他聊天机器人将大语言模型LLMs推到了风口浪尖。这就导致了很多不是学ML和NLP领域的人关注并学习attention和Transformer模型。在本文中&#xff0c;我们将针对Transformer模型结构提出几个问题&#xff0c;并深入探讨其背后的技术理论。这…

实验2 组合逻辑电路与时序逻辑电路设计

实验目的: 1.构建基于verilog语言的组合逻辑电路和时序逻辑电路; 2.掌握verilog语言的电路设计技巧。 3.完成如下功能:加法器、译码器、多路选择器、计数器、移位寄存器等。 实验内容及步骤: 一、实验原理 原理图文件《数字系统设计_sch.pdf》,找到如下两个部分: 图…

Vim编辑器的安装及使用教程

文章目录 1&#xff1a;Ubuntu安装Vim1.1&#xff1a;图形界面安装1.2&#xff1a;命令行安装vim1.3&#xff1a;判断vim是否安装成功 2&#xff1a;vim简介3&#xff1a;vim的三种模式4&#xff1a;vim常用按键说明4.1 命令模式4.2 搜索和替换4.3 复制、粘贴和删除4.4 一般模式…

网络工程师---第十天

ARP表&#xff1a; 提起ARP表必然先想起ARP&#xff08;address resolution protocol&#xff09;协议&#xff0c;地址解析协议。 在实际应用中&#xff0c;我们经常遇到这样的问题&#xff1a;已知一个机器的IP地址&#xff0c;但在实际网络的链路上传送数据帧时&#xff0c;…

20240331-1-基于深度学习的模型

基于深度学习的模型 知识体系 主要包括深度学习相关的特征抽取模型&#xff0c;包括卷积网络、循环网络、注意力机制、预训练模型等。 CNN TextCNN 是 CNN 的 NLP 版本&#xff0c;来自 Kim 的 [1408.5882] Convolutional Neural Networks for Sentence Classification 结…

[ICCV2023]DIR-用于从单个RGB图像重建交互手部的解耦迭代细化框架

这篇论文的标题是《Decoupled Iterative Refinement Framework for Interacting Hands Reconstruction from a Single RGB Image》&#xff0c;作者是Pengfei Ren, Chao Wen, Xiaozheng Zheng, Zhou Xue, Haifeng Sun, Qi Qi, Jingyu Wang, Jianxin Liao。他们来自北京邮电大学…

Nodejs安装与配置--基于Linux系统--RedHat7.9

nodejs安装从未这么简单 1、nodejs版本设置&#xff1f; curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - 其他版本如下&#xff1a; * https://rpm.nodesource.com/setup_16.x — Node.js 16 "Gallium" (deprecated) * https://rpm.nodesource.co…