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

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

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

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也就是类,也称为对象的设计图 (或者对象的模板)也就是表的设计者 整个代码就是写了一个表的模板

在这里插入图片描述

  • class + student 表示设计的表是一个学生表
  • string+ 变量 表示表的字段内容
  • viod + 方法 表示怎么处理表的数据

在这里插入图片描述

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

在这里插入图片描述

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.0
    double 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就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Palworld幻兽帕鲁管理员操作手册

Palworld幻兽帕鲁管理员操作手册 大家好我是艾西,在我们搭建完幻兽帕鲁服务器后肯定会涉及到后期的维护比如:角色修改,帕鲁修改,异常删除,公会修改,清理玩家,清理建筑,存档迁移等数…

寄存器(内存访问)

文章目录 寄存器(内存访问)1 内存中字的存储2 DS和[address]3 字的传送4 mov、add、sub指令5 数据段6 栈7 CPU提供的栈机制8 栈顶超界的问题9 push、pop指令10 栈段 寄存器(内存访问) 1 内存中字的存储 CPU中,用16位寄…

域内令牌窃取

前言 有这样一种场景,拿到了一台主机权限,是本地管理员,同时在这台主机上登录的是域管成员,这时我们可以通过dump lsass或通过 Kerberos TGT ,但是这是非常容易被edr命中的。 本文就通过令牌窃取进行研究&#xff0c…

MySQL 篇-深入了解事务四大特性及原理

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 事务的概述 2.0 事务的特性 2.1 原子性 2.2 一致性 2.3 持久性 2.4 隔离性 2.4.1 脏读问题 2.4.2 不可重复读问题 2.4.3 幻读问题 3.0 事务的四个隔离级别 3.1…

Apache DolphinScheduler-3.2.0集群部署教程

集群部署方案(2 Master 3 Worker) Apache DolphinScheduler官网:https://dolphinscheduler.apache.org/zh-cnApache DolphinScheduler使用文档:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.0截止2024-01-19,最新版本:3…

【学一点儿前端】vue3+vite不能使用require引入包的问题(require is not defined)

问题 今天本来想简单敲个码,结果遇到一个报错:require is not defined 原因 查了各方资料,原因如下: 前端有很多的工具包是commonjs的写法,只能用require引入,而vitevue3构建的项目不能使用require&…

Gemma: Open Models Based on Gemini Research and Technology

Gemma: Open Models Based on Gemini Research and Technology 相关链接:arxiv 关键字:Gemma、Google DeepMind、open models、language understanding、reasoning 摘要 这项工作介绍了Gemma,一系列轻量级、最先进的开放模型,基于…

C++中的STL-string类

文章目录 一、为什么学习string类?1.1 C语言中的字符串 二、准库中的string类2.2 string类2.3 string类的常用接口说明2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.5 string类对象的修改操作2.7 string类非成员函数2.8 模拟实现string 一、为什么…

Python环境搭建 -- Python与PyCharm安装

一、Python安装 我们先找到Python的官方网站,在浏览器中搜索Python即可,然后进入Python官网 点击Downloads,选择对应匹配的操作系统 点进去之后,Python的版本分为稳定的版本和前置版本,前置的版本就是还没有发行的版本…

接口自动化测试思路和实战 —— 编写线性测试脚本实战!

接口自动化测试框架目的 测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本,让公司的测试工程师都可以开展自动化测试)。 自动化测试框架根据思想理念和深度不同,渐进式的分为以下几种: 线性脚本框架 模块…

室内定位在数字化中的应用

随着数字化经济的迅速发展,室内定位技术正逐渐成为一个不可或缺的重要组成部分。它不仅能够提升用户体验,还能够帮助企业实现更精准的市场定位和营销策略。本文将探讨室内定位在数字化经济中的应用及其带来的优势。 首先,室内定位技术在商业…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

Python3虚拟环境之pipenv

pipenv是python官方推荐的包管理工具&#xff0c;集成了virtualenv, pip和pyenv三者的功能。集合了所有的包管理工具的长处&#xff0c;自动为项目创建和管理虚拟环境。 安装 pip install pipenv在Pycharm中使用 修改Pipfile的安装源参数url&#xff0c;改为https://pypi.tun…

基于Python的中医药知识问答系统设计与实现

[简介] 这篇文章主要介绍了基于Python的中医药知识问答系统的设计与实现。该系统利用Python编程语言&#xff0c;结合中医药领域的知识和技术&#xff0c;实现了一个功能强大的问答系统。文章首先介绍了中医药知识的特点和传统问答系统的局限性&#xff0c;然后提出了设计思路…

如何在Windows系统部署Plex影音站点并实现公网访问内网媒体库

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

《鸟哥的Linux私房菜》第6章——总结与习题参考答案

目录 一、 简介 二、一些新了解的指令 1.touch- 修改文件时间或创建新文件 2.umask-新建文件/目录的默认权限 3.文件隐藏属性 4.文件特殊权限 5.file-观察文件类型 三、简答题部分 一、 简介 本章介绍了一些常用的文件与目录指令&#xff0c;包括新建/删除/复制/移动/查…

devops-git【部署及配置】

1、安装Git Linux做为服务器端系统&#xff0c;Windows作为客户端系统&#xff0c;分别安装Git&#xff1a; 【服务器端】 输入git --version 若出现 -bash:git:command not found则需要安装git&#xff1b;服务器端&#xff1a;输入yum -y install git安装完后&#xff0c;…

java枚举与模拟方法

枚举 枚举的定义 枚举算法&#xff08;穷举算法&#xff09;&#xff0c;这种算法就是在解决实际问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能性&#xff0c;最后推导出结果 优点 简单粗暴&#xff0c;他暴力的枚举所有可能&…

[ROS 系列学习教程] rosbag C++ API

ROS 系列学习教程(总目录) 本文目录 一、rosbag::Bag1.1 常用接口1.2 其他接口 二、rosbag::View2.1 常用接口2.1.1 代码示例 rosbag 的 C API 主要有两个类&#xff0c;用于写bag文件的Bag类&#xff0c;和用于读bag文件的View类。 一、rosbag::Bag 用于写bag文件。 头文件…

变量直接赋值、浅拷贝、深拷贝、递归、异常

对象拷贝(对象存在堆中) 变量直接赋值 赋值 就是一个&#xff0c;比如let obj2obj1 这就是赋值&#xff0c;只是把栈中存储的值&#xff0c;赋值给另一个变量 把obj1在栈中的地址&#xff0c;赋值给obj2 <script>let str hellolet str2 str //把str的值,赋值给str2.也…