javaSE学习-4-类和对象

news2024/11/18 16:38:41

1. 面向对象的初步认知

1.1 什么是面向对象

面向对象编程(OOP)是一种程序设计范式,它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里,一切都被视为对象,这些对象可以拥有数据(成员变量)和行为(方法)。Java 是一门纯粹的面向对象编程语言,几乎所有的代码都是以类和对象的形式存在的。

1.2 面向对象与面向过程

在面向对象编程的思想中,解决问题主要依靠对象之间的交互完成一项任务。

相较之下,面向过程编程更侧重于一系列步骤或操作,通过过程调用来完成任务。

面向对象的优势在于更好地组织和抽象复杂系统,使代码更易扩展、维护和理解。

设计一个简单的图形计算程序,计算不同形状的面积。样设计:

面向过程:

double calculateCircleArea(double radius) {
    return 3.14 * radius * radius;
}

double calculateRectangleArea(double length, double width) {
    return length * width;
}

void main() {
    double circleArea = calculateCircleArea(5.0);
    double rectangleArea = calculateRectangleArea(4.0, 6.0);

    // 进行其他操作...
}
```

定义了两个函数分别用于计算圆和矩形的面积。

在 `main` 函数中调用这些函数来进行计算。

面向对象:


class Circle {
    double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    double calculateArea() {
        return 3.14 * radius * radius;
    }
}

class Rectangle {
    double length;
    double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    double calculateArea() {
        return length * width;
    }
}

void main() {
    Circle circle = new Circle(5.0);
    Rectangle rectangle = new Rectangle(4.0, 6.0);

    double circleArea = circle.calculateArea();
    double rectangleArea = rectangle.calculateArea();

    // 进行其他操作...
}

定义了两个类 `Circle` 和 `Rectangle`,每个类都有自己的属性和方法。

通过创建对象,调用对象的方法来进行计算。这种方式更加面向对象,将数据和相关操作封装在对象内部。

面向对象的设计使得代码更易扩展和维护,特别是在处理复杂系统时表现出更大的优势。

2. 类定义和使用

向对象程序设计(Object-Oriented Programming,OOP)关注的是对象,而对象通常是现实生活中的实体或概念的抽象。在面向对象的思想中,问题的解决主要通过对现实世界中的事物进行建模,将其抽象为程序中的对象。

2.1 简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干嘛)

2.2 类的定义格式

在 Java 中,定义一个类需要使用 class 关键字,具体的语法如下所示:

// 创建类
class ClassName {
    // 字段(属性)或者成员变量
    type fieldName;
    
    // 行为或者成员方法
    returnType methodName(parameters) {
        // 方法体
    }
    
    // 其他字段和方法...
}

2.3 定义一个狗类

class Dogg {
    int age;
    String color;
    String name;
    public void bark() {
        System.out.println(name+"汪汪汪");
    }
    public void wag() {
        System.out.println(name+"摇尾巴");
    }
}

通过对象的引用.访问属性进行赋值

实例化对象

public static void main(String[] args) {
        Dogg dog1 = new Dogg();
        dog1.age = 9;
        dog1.name = "小白";
        dog1.color = "黑色";
        System.out.println(dog1.name);
        dog1.bark();
        dog1.wag();
    }

只要new 就会产生 新的对象, 只要是新的对象, 就是有新的内存

Dogg dog2 = new Dogg();

只需要通过对象的引用 去访问对象的成员变量即可或者是成员方法

可以通过new关键字 实例化多个对象

同一个类可以创建多个实例

dog1, dog都属于引用类型(存储的是对象的地址)

这里在啰嗦一下java中的数据类型

分为两种

  1. 基本数据类型(共八种)
  2. 引用类型 String 数组 类 接口

这里我提出两个问题

其一是: 引用可以指向 引用吗?

dog1 = dog2;

dog2这个引用指向了 dog1?

类似于

int[] arr1 = {1,2,3};
        int[] arr2;
        arr2 = arr1;

类似于复制粘贴

因此这句话有语病错误 引用是不能指向对象的 引用只能指向对象

这两个引用同时指向的是一个对象

dog1dog2都指向相同的对象

这是因为引用存储的是对象的地址,所以它们都引用了相同的对象。

另一个问题是 一个引用可不可以指向多个对象?

不可以 一个引用只能指向一个对象

只能存储一个对象的地址

还有一个问题是以下代码能否代表dog2这个引用指向null对象?

Dogg dog2 = null;

dog2这个引用 不执行任何对象

3. 类的实例化


3.1 什么是实例化

实例化是将一个类作为模板,创建该类的具体对象的过程。通过实例化,我们可以在内存中分配空间,并初始化该对象的属性。实例化的结果就是我们所说的对象或实例。

3.2 类和对象的说明

  1. 类是一个模型: 类是对一个实体进行描述的模型,它定义了这个实体的属性(成员变量)和行为(方法)。类就像是一个蓝图或设计图,规定了实体应该有哪些特征和功能。

  2. 类是一种自定义类型: 类是用户自定义的数据类型,可以用来定义变量。通过类,我们可以创建属于该类型的对象。

  3. 多个对象的实例化: 一个类可以实例化出多个对象。每个对象都是该类的一个实例,拥有相同的属性和方法,但是它们是相互独立的。例如:

    
    
    // 定义一个Person类 
    public class Person { String name; int age; } 
    // 实例化两个Person对象 Person person1 = new Person(); 
    Person person2 = new Person();
    
    

    这里,person1和person2都是Person类的实例,但它们是两个独立的对象。

  4. 类和对象的比喻: 比方说,可以将类比为建筑设计图,它规定了房子应该有哪些特征和结构,但并不是实际的房子。只有当我们使用设计图实例化出具体的房子对象时,才会占用实际的物理空间,存储房子的具体信息。

class MyValue {
    int value;
}

public class Main4 {
    public static void swap(MyValue v1, MyValue v2) {
        int tmp = v1.value;
        v1.value = v2.value;
        v2.value = tmp;
    }

    public static void main(String[] args) {
        MyValue value1 = new MyValue();
        MyValue value2 = new MyValue();
        value1.value = 10;
        value2.value = 20;
        swap(value1, value2);
        System.out.println(value1.value);
        System.out.println(value2.value);
    }
}

基本类型是无法完成交换的, 只有引用类型才能完成交换

 4. this引用

4.1 为什么要有this引用:

在Java中,this是一个关键字,表示当前对象的引用。它主要用于解决类成员变量与方法参数之间的命名冲突。形参名与成员变量名相同,这时可以使用this引用来明确指定操作的是成员变量而不是方法参数。

public class Date {
    public int year;
    public int month;
    public int date;
    public void setDate(int y, int m, int d){
        year = y;
        month = m;
        date = d;
    }
    public void printDate() {
        System.out.println(year+"年"+month+"月"+date+"日");
    }

    public static void main(String[] args) {
        Date date1 = new Date();
        date1.setDate(2021, 12,21);
        date1.printDate();
    }
}

这里代码正常执行输出结果

2021年12月21日

Process finished with exit code 0

那我们把

public void setDate(int y, int m, int d){
        year = y;
        month = m;
        date = d;
    }

改为

public void setDate(int year, int month, int date){
        year = year;
        month = month;
        date = date;
    }

这时的输出

0年0月0日

因为这里的year month date都是局部变量, 形参名与成员变量名相同

这时可以使用this引用来明确指定操作的是成员变量

public void setDate(int year, int month, int date){
        this.year = year;
        this.month = month;
        this.date = date;
    }

改为以上代码就可以正常运行了

Date date1 = new Date();
        date1.setDate(2021, 12,21);
        date1.printDate();
        Date date2 = new Date();
        date2.setDate(1234,1,23);

那怎么区分this是哪个呢

局部变量优先使用 谁调用这个方法 谁就是this

this关键字主要用于引用当前对象的实例。

当存在局部变量与实例变量同名时,使用this关键字可以明确指定操作的是实例变量而不是局部变量。

 当调用 date1.setDate(2021, 12, 21); 时,this指向的是 date1 对象的实例。

而在 date2.setDate(1234, 1, 23); 中,this指向的是 date2 对象的实例。

this指的是调用它的方法所属的对象。

4.2 什么是this引用

  1. 区分实例变量和局部变量: 当方法的参数名和实例变量名相同时,使用this关键字可以明确指定操作的是实例变量。例如,在setDay方法中,this.year表示实例变量,而year表示方法的参数。

  2. 在构造函数中调用其他构造函数: 在一个类的构造函数中,可以使用this来调用同一类的其他构造函数。

    public class Example {
        private int x;
        private int y;
    
        // 构造函数1
        public Example(int x) {
            this.x = x;
            this.y = 0;
        }
    
        // 构造函数2,调用构造函数1
        public Example(int x, int y) {
            this(x);  // 调用构造函数1
            this.y = y;
        }
    }
    

  3. 作为返回当前对象的引用: 在方法中可以使用this作为返回当前对象的引用,以支持方法的链式调用。

public class Example {
    private int x;
    private int y;

    public Example setX(int x) {
        this.x = x;
        return this;
    }

    public Example setY(int y) {
        this.y = y;
        return this;
    }
}

4.3 this引用的特性:

  1. this的类型: this引用的类型是对应类类型的引用。即,this指向的是哪个对象调用,就是哪个对象的引用类型。

  2. this只能在成员方法中使用: this关键字只能在类的成员方法中使用。它不能在静态方法(用static修饰的方法)中使用,因为静态方法与任何实例对象无关。

  3. this只能引用当前对象: 在成员方法中,this关键字只能引用当前对象,不能引用其他对象。它代表调用该成员方法的当前对象。

  4. this是“成员方法”第一个隐藏的参数: 在成员方法中,this被视为第一个隐藏的参数。编译器会自动传递this作为参数给成员方法。当成员方法被调用时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,而this负责接收这个引用。

5. 对象的构造及初始化

5.1 如何初始化对象

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?

2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

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

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

相关文章

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

Matlab智能优化算法学习笔记(一)——粒子群算法、模拟退火算法、遗传算法、蚁群算法

文章目录 粒子群算法△ matlab工具箱粒子群函数○ 代码○○ 手搓代码实现粒子群优化 2个变量&#xff08;xy&#xff09;的粒子群优化尝试 定义函数 绘制网格图&#xff08;用来可视化过程&#xff09; 参数初始化&#xff0c;绘制粒子初始位置 开始迭代过程并绘图 获取结果并绘…

计算机毕业设计—基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理压力&#xff…

[C++] 多态(下) -- 多态原理 -- 动静态绑定

文章目录 1、多态原理2、动态绑定和静态绑定3、单继承和多继承关系的虚函数表3.1 单继承中的虚函数表5.2 多继承中的虚函数表 上一篇文章我们了解了虚函数表&#xff0c;虚函数表指针&#xff0c;本篇文章我们来了解多态的底层原理&#xff0c;更好的理解多态的机制。 [C] 多态…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后&#xff0c;只需要在防火墙里面添加一个白名单&#xff08;ip 或者域名&#xff09;就能访问了。 防火墙添加本机WLAN的IPv4白名单&#xff0c;本地用一个远程工具连接&#xff…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API&#xff0c;为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构&#xff0c;它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同&#xff0c;Stream并不是一个存储数据的数据结构&#xff0c;而是在源数据…

到底该如何优化代码?怎样会使得代码更加糟糕?

文章目录 前言开始语法规范有函数式方法的尽量用判断字符串为空不要自己写equals判定,常量写前面少用魔法值,定义常量无状态方法,可选择定义为类静态 逻辑简化明确主体逻辑语法简化:三元运算符语法简化:Optional方法独立存在的必要性讨论 继续拓展:定义枚举值枚举构建关系枚举构…

【 AI 两步实现文本 转 语音】

基于hugging face 中 XTTS-v2 模型做文本转语音&#xff0c;此模型支持17种语言 1.登录hugging face 官网 https://huggingface.curated.co/ 或者 https://hf-mirror.com/models 找到models处下载XTTS-V2 如果你全程可以联网&#xff08;/huggingface.co&#xff09;直接步骤…

福德植保无人机:让植保工作更轻松

亲爱的读者们&#xff0c;欢迎来到我们的公众号&#xff01;今天&#xff0c;我想和大家分享一个我们生活中不可或缺的东西——福德植保无人机。它不仅改变了我们的植保工作&#xff0c;更提升了工作效率&#xff0c;减少了人工负担。福德植保无人机&#xff0c;一家在植保无人…

MS5602数模转换器可Pin to Pin兼容TLC5602

MS5602是低功率、超高速视频数模转换器。可Pin to Pin兼容TLC5602。MS5602以从DC至20MHz的采样速率将数字信号转换成模拟信号。由于高速工作&#xff0c;MS5602适合于数字电视、电脑视频处理及雷达信号处理等数字视频应用。 MS5602 工作于-40℃至 85℃。 主要特点 8 位分辨率…

面试算法56:二叉搜索树中两个节点的值之和

题目 给定一棵二叉搜索树和一个值k&#xff0c;请判断该二叉搜索树中是否存在值之和等于k的两个节点。假设二叉搜索树中节点的值均唯一。例如&#xff0c;在如图8.12所示的二叉搜索树中&#xff0c;存在值之和等于12的两个节点&#xff08;节点5和节点7&#xff09;&#xff0…

输出26个英文字母 C语言xdoj97

描述&#xff1a; 编写一个程序&#xff0c;分别按正向和逆向输出小写字母。 输入说明&#xff1a; 无。 输出说明&#xff1a; 字母间以空格分隔&#xff0c;正向输出完换行&#xff0c;再逆向输出。 输入样例 无。 输出样例 无。 #include <stdio.h>//输出26个英文字…

【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作

Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了&#xff0c;所以这周开始记录下来&#xff0c;也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐 文章介绍 这篇文章于2018年发表在AAAI&…

评价机器学习模型的指标

为了衡量一个机器学习模型的好坏&#xff0c;需要给定一个测试集&#xff0c;用模型对测试集中的每一个样本进行预测&#xff0c;并根据预测结果计算评价分数。 对于分类问题&#xff0c;常见的评价标准有准确率、精确率、召回率和F值等。给定测试集 &#x1d4af; {(&#x1…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

selenium-wire简介

一.简介 以下来自chatGPT回答&#xff1a; selenium-wire是一个基于selenium的Python库&#xff0c;它扩展了selenium的功能&#xff0c;使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和响应。selenium-wire可以拦截和修改HTTP请求和响应&#xff0c;从而可以在…

【一周安全资讯1216】欧盟就AI监管《人工智能法案》达成历史性协议;赛迪发布《中国网络安全测评服务市场研究报告 (2023)》

要闻速览 1、欧盟就全球首个AI监管《人工智能法案》达成历史性协议 2、我国牵头提出的国际标准《信息技术 网络安全 第7部分&#xff1a;网络虚拟化安全指南》正式发布 3、《粤港澳大湾区&#xff08;内地、香港&#xff09;个人信息跨境流动标准合同实施指引》发布 4、赛迪顾…

三相异步电机动态数学模型推导及矢量控制仿真

文章目录 **原文链接&#xff0c;点击跳转**三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接&#xff…