当前位置: 首页 > article >正文

8、面向对象:类、封装、构造方法

一、类

1、定义

类:对现实世界中事物的抽象。Student

对象:现实世界中具体的个体。张三、李四 这些具体的学生

面向对象的特征:抽象、封装、继承、多态

OOP: Object Oriented Programming(面向对象编程)

类和对象的总结:

1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。

2、对象:真实存在的对象

3、类中包含:

 1)所有对象所共有的特征--属性(静)2)所有对象所共有的行为--方法(动)

4、类是对象的模板,对象是类的具体实例。

5、一个类可以创建多个对象, 同一个类的不同对象,结构相同,数据不同。

//实体类:和数据库表一一对应
public class Student {//属性、字段int id;String name;int age;String gender;
}@Test
public void test1() {Scanner scanner = new Scanner(System.in);int num = 3;//student1:变量、实例、对象Student student1 = new Student();//对象.属性student1.id = 1;student1.name = "张三";student1.age = 23;student1.gender = "男";System.out.println(student1.name);Student student2 = new Student();student2.id = 2;student2.name = "李四";student2.age = 24;student2.gender = "女";System.out.println(student2.name);//构造数组来存储,方便管理:Student[] array = new Student[2];array[0] = student1;array[1] = student2;}
}

在这里插入图片描述

对应的内存模型:

new出来的放在堆里面,类的模板放在方法区
在这里插入图片描述

2、易混淆知识点

int num = 3;
int[] nums = new int[3];
double[] nums = new double[3];
Student student = new Student();  // student :变量、实例、对象
Student[] students = new Student[3];
Teacher teacher = new Teacher();
Teacher[] teachers = new Teacher[3];int、int[]、Student、Student[]这些都是数据类型,数据类型的后面是这种类型的一个变量。
格式: 数据类型  变量
var v;
let v;1.Java是编译型、强类型语言(效率高)
2.JavaScript是解释型、弱类型语言

3、数据类型的默认值

1.int类型默认值是:0
2.double类型默认值是:0.0
3.boolean类型默认值是:false
4.String类型默认值是:null
5.int[]类型默认值是:null
6.Student[]类型默认值是:null
7.boolean[]类型默认值是:null所有引用数据类型的默认值都是null
1.int[] array = new int[3]; 里面的存放默认值是0
2.boolean[] array = new boolean[3]; 里面的存放默认值是false
3.Student[] array = new Student[3];里面的存放默认值是null(Student是一个类,放的就是类的默认值:null)总结:构造一个数组的时候如果没有赋值,那么数组里面放的是这个类型的默认值
@Test
public void test2() {Student student = new Student();System.out.println(student.id);//0System.out.println(student.name);//null
}@Test
public void test3() {int[] array1 = new int[3];boolean[] array2 = new boolean[3];Student[] students = new Student[3];for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}//增强的for循环for (Student student : students) {System.out.println(student);}
}

4、空指针异常

ArrayIndexOutOfBoudsException 数组下标越界异常NullPointerException空指针异常(引用数据类型)
@Test
public void test4() {//NullPointerException空指针异常(引用数据类型)Student student = null;System.out.println(student);//null// null.方法   null.属性 --->空指针异常System.out.println(student.id);//空指针异常
}

二、toString()

1、行为—>方法:

基于上面学生的例子演示方法的调用:
在这里插入图片描述
上述例子是写死的,我们实际应当实现灵活调用:即以前说的,先写死,再改成逗逗加加:

在这里插入图片描述
那么,如果属性很多,进行拼接会很麻烦,解决办法:添加toString()方法生成这些,如下。

2、添加toString():

在这里插入图片描述

//方法:自己手敲的
public String getInfo() {//String str = "[Student: id="+id+",name="+name+",age="+age+",gender="+gender+"]";//return str;return "[Student: id="+id+",name="+name+",age="+age+",gender="+gender+"]";
}//toString()生成的:
@Override
public String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';
}
@Test
public void test44() {Student student = new Student();student.id = 1;student.name = "王五";student.age = 223;student.gender = "男";String info = student.getInfo();System.out.println(info);System.out.println(student.getInfo());System.out.println("-----------");System.out.println(student.toString());//当打印对象的时候,默认就调用了:对象.toString()System.out.println(student);
}

完整代码:

package com.situ.day10;public class Student {int id;String name;int age;String gender;//自己写的方法public String getInfo(){String str = "[student:id = "+id+",name = "+name+",age = "+age+"]";return str;}//toString()生成的:@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
package com.situ.day10;import org.junit.Test;public class OPPDemo {@Testpublic void test1(){Student student1 = new Student();student1.id = 1;student1.name = "zhangsan";student1.age = 23;student1.gender = "男";//调用toString()并输出结果System.out.println(student1.toString());Student student2 = new Student();student2.id = 2;student2.name = "lisi";student2.age = 24;student2.gender = "女";//System.out.println(student2.toString());等价于下面这行代码:System.out.println(student2);//即打印对象的时候,默认调用toString()。}
}

补充:
在这里插入图片描述

三、封装 private/get/set

面向对象的封装是一种编程概念和原则,它通过将数据和操作封装在一个对象中,以实现信息隐藏和安全性。

封装使得对象的内部细节对外部不可见,只暴露必要的接口供其他对象进行交互。

//属性私有private,只有类的内部可以访问
private age;// 属性私有,通过get、set方法访问:
public void setAge(int age) {if (age >= 1 && age <= 125) {// The assignment to variable age has no effect// this.age 代表的就是属性agethis.age = age;}
}public int getAge() {// return age;return this.age;
}

完整代码:

package com.situ.day10;public class Student2 {//封装:变量私有化处理:// 添加private,只能在当前类中使用,通过get、set方法访问:private int id;private String name;private int age;private String gender;//右键Generate:添加Getter、Setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if (age >= 1 && age <= 125) {//根据实际情况添加限制this.age = age;}}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}//添加toString方法:@Overridepublic String toString() {return "Student2{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
package com.situ.day10;import org.junit.Test;public class OOPDemo2 {@Testpublic void test1(){Student2 student4 =new Student2();student4.setAge(15);int age = student4.getAge();System.out.println(age);}@Testpublic void test2(){Student2 student5 = new Student2();student5.setId(5);student5.setName("wangwu");student5.setAge(15);student5.setGender("女");System.out.println(student5);}}

四、构造方法

构造方法是new对象时候调用方法,特点:1.方法名和类名一样  2.没有返回值3.在new对象的时候会调用构造方法

在这里插入图片描述

//无参构造方法
//如果不写,Java默认提供这样一个无参构造方法.
//如果你写了任何一个构造方法,Java就不会再提供这个无参构造方法
public Student() {System.out.println("Student.Student()");
}//有参构造方法
public Student(int id, String name, int age, String gender) {this.id = id;//把1这个值赋值给当前new出来的student对象的id属性this.name = name;this.age = age;this.gender = gender;
}Student student = new Student(2, "李四", 24, "男");
System.out.println(student);
1、如果不写任何构造方法,系统默认提供一个无参数构造方法,只是我们看不到而已。
2、如果自己写了任何一个构造方法,不管有参没参,系统就不会提供这个默认无参构造方法。
3、自己写了一个带参数的构造方法,就要把无参数构造方法也要写上。
(后面使用或者学习的一些框架要new这个无参数的构造方法)
构造方法和一般方法的不同:
1、构造方法是在new对象的时候运行,而一般的方法是在对象调用的时候才执行。
2、一个对象的建立,构造方法只执行一次,而一般方法可以被改对象调用多次。

五、作业

1、编写Java程序,模拟简单的计算器。
定义名为Cal的类,其中有两个整型数据成员num1和num2,应声明为私有。编写构造方法,赋予num1和num2初始值,再为该类定义加(add)、减(sub)、乘(multi)、除(div)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。
在main方法中创建Cal类的对象,调用各个方法,并显示计算结果。

package com.situ.day11;public class Cal {private int num1;private int num2;//无参构方法:public Cal(){}//有参构造方法:public Cal(int num1,int num2){this.num1 = num1;this.num2 = num2;}public int add(){int result = num1 + num2;return result;//return num1 + num2;}public int sub(){int result= num1 - num2;return result;}public int multi(){int result = num1 * num2;return result;}public int div(){int result = num1 / num2;return result;}public static void main(String[] args) {//创建对象:Cal cal = new Cal(5,10);System.out.println(cal.add());System.out.println(cal.sub());System.out.println(cal.multi());System.out.println(cal.div());}
}

2、定义长方形类,含:
属性:宽、高(整型);
构造方法3个:(1)无参——宽、高默认值为1;(2)1个参数——宽、高相等;(3)2个参数——宽、高各为参数值。
方法:求周长、面积;
要求:进行测试计算周长和面积。

package com.situ.day11;import org.junit.Test;public class Rect {private int width;private int height;//无参构造方法:public Rect(){}//有参构造方法public Rect(int width, int height) {this.width = width;this.height = height;}//一个参数的构造方法public Rect(int width){this.width = width;this.height = width;}//方法:public int zhouChang(){return (width + height) * 2;}public int mianJi(){return width * height;}//测试:public static void main(String[] args) {Rect rect = new Rect(3,5);System.out.println(rect.zhouChang());System.out.println(rect.mianJi());}}

相关文章:

8、面向对象:类、封装、构造方法

一、类 1、定义 类&#xff1a;对现实世界中事物的抽象。Student 对象&#xff1a;现实世界中具体的个体。张三、李四 这些具体的学生 面向对象的特征&#xff1a;抽象、封装、继承、多态 OOP: Object Oriented Programming&#xff08;面向对象编程&#xff09; 类和对象…...

AI时代IT行业职业方向规划大纲

一、引言 AI时代的颠覆性影响 ChatGPT、Midjourney等生成式AI对传统工作模式的冲击 案例&#xff1a;AI编程助手&#xff08;GitHub Copilot&#xff09;改变开发者工作流程 核心问题&#xff1a;IT从业者如何避免被AI替代&#xff0c;并找到新机遇&#xff1f; 二、AI时代…...

STM32 旋转编码器

旋转编码器简介 旋转编码器&#xff1a;用来测量位置、速度或旋转方向的装置&#xff0c;当其旋转轴旋转时&#xff0c;其输出端可以输出与旋转速度和方向对应的方波信号&#xff0c;读取方波信号的频率和相位信息即可得知旋转轴的速度和方向 类型&#xff1a;机械触点式/霍尔传…...

大模型领域的Scaling Law的含义及作用

Scaling Law就像是一个“长大公式”&#xff0c;用来预测当一个东西&#xff08;比如模型&#xff09;变大&#xff08;比如增加参数、数据量&#xff09;时&#xff0c;它的性能&#xff08;比如准确率&#xff09;会怎么变化。 它能帮助我们提前知道&#xff0c;增加多少资源…...

从 C 到 C++:理解结构体中字符串的存储与操作

对于刚入门 C/C 的程序员来说&#xff0c;字符串的存储和操作可能是个容易混淆的知识点。在 C 中&#xff0c;std::string 提供了非常友好的接口&#xff0c;我们可以轻松地在结构体中使用字符串类型&#xff0c;无需关注底层细节。然而&#xff0c;在 C 语言中&#xff0c;字符…...

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…...

【算法】回溯算法专题③ ——排列型回溯 python

目录 前置小试牛刀回归经典举一反三总结 前置 【算法】回溯算法专题① ——子集型回溯 python 【算法】回溯算法专题② ——组合型回溯 剪枝 python 小试牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 给定一个不含重复数字的数组 nums &#xff0c;返…...

Vue2.x简介

Vue2.x简介 Vue2.x的版本介绍Vue2.x的两大组件库 Vue2.x的版本介绍 Vue2.x是vue.js的第二个主要版本&#xff0c;最初版发布于2016 年&#xff0c;最终版发布于2023年12月24日&#xff08;版本号&#xff1a;2.7.16&#xff0c;版本名&#xff1a;Swan Song&#xff08;绝唱&a…...

FFmpeg:多媒体处理的瑞士军刀

FFmpeg&#xff1a;多媒体处理的瑞士军刀 前言 FFmpeg 是一个功能强大且跨平台的开源多媒体框架&#xff0c;广泛应用于音视频处理领域。 它由多个库和工具组成&#xff0c;能够处理各种音视频格式&#xff0c;涵盖编码、解码、转码、流处理等多种操作。 无论是专业视频编辑…...

Windows编译FreeRDP步骤

1. **安装必要工具** powershell # 安装 Visual Studio 2022 (勾选"C桌面开发"组件) # 安装 CMake: https://cmake.org/download/ # 安装 Git: https://git-scm.com/ 2. **安装依赖项** powershell # 使用vcpkg包管理 git clone https://github.com/Microsoft/vcpk…...

机器学习--学习计划

3周机器学习速成计划 基于「28原则」&#xff0c;聚焦机器学习20%的核心概念&#xff0c;覆盖80%的常见应用场景。计划分为 理论学习 项目实战&#xff0c;每周学习后通过5个递进项目巩固知识。 &#x1f4c5; 第1周&#xff1a;数据与监督学习基础 学习目标&#xff1a;掌握…...

【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索

深度与创新&#xff1a;AI领域的革新者 DeepSeek&#xff0c;这个由幻方量化创立的人工智能公司推出的一系列AI模型&#xff0c;不仅在技术架构上展现出了前所未有的突破&#xff0c;更在应用领域中开启了无限可能的大门。从其混合专家架构&#xff08;MoE&#xff09;到多头潜…...

conda配置channel

你收到 CondaKeyError: channels: value https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main not present in config 错误是因为该镜像源&#xff08;https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main&#xff09;可能没有被正确添加到 Conda 的配置文件中&…...

wordpress每隔24小时 随机推荐一个指定分类下的置顶内容。

在WordPress中实现每隔24小时随机推荐一个指定分类下的置顶内容&#xff0c;可以通过以下步骤实现&#xff1a; 1. 创建自定义函数 在主题的functions.php文件中添加以下代码&#xff0c;用于创建一个定时任务&#xff0c;每隔24小时随机选择一个置顶文章并存储到选项中&…...

python学opencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理

【1】引言 在前述学习过程中&#xff0c;已经探索了取平均值的形式进行图像滤波处理。 均值滤波的具体的执行对象是一个nXn的像素核&#xff0c;对这个像素核内所有像素点的BGR值取平均值&#xff0c;然后把这个平均的BGR值直接赋给像素核中心位置的核心像素点&#xff0c;由…...

OpenAI 再战机器人领域,重组机器人团队

OpenAI重组机器人团队&#xff1f;大家是不是和小编一样&#xff0c;听到这个消息后&#xff0c;脑子里瞬间浮现出科幻电影里机器人满街跑的场景&#xff1f;今天咱们就来看看背后的故事吧~ 作为人工智能领域的领头羊&#xff0c;OpenAI一直以来都在探索和扩展AI技术的深度和广…...

Turing Complete-1位开关

要求如下&#xff1a; 我的思考&#xff1a; 把输入1当作控制信号&#xff0c;把输入2当作输出信号。 通过非门和开关使输入2形成双通道输出&#xff0c; 通道一为输出输入2取反。 通道二为输出输入2本身。 通过输入1来控制两个通道的开闭。...

预防和应对DDoS的方法

DDoS发起者通过大量的网络流量来中断服务器、服务或网络的正常运行&#xff0c;通常由多个受感染的计算机或联网设备&#xff08;包括物联网设备&#xff09;发起。 换种通俗的说法&#xff0c;可以将其想象成高速公路上的一次突然的大规模交通堵塞&#xff0c;阻止了正常的通勤…...

树莓派pico入坑笔记,睡眠

关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 关于在 CircuitPython 中使用警报和浅/深度睡眠的更多信息&#xff0c;请参阅此学习指南。 树莓派pico支持浅睡眠和深度睡眠&#xff0c;其中深度睡眠唤醒后将从boot.py开始运行 支持按时间唤醒和引…...

高并发、高可用的消息队列(MQ)设计与实战

目录 背景与历史消息队列的核心功能高并发、高可用的业务场景消息队列的实用性企业规模与消息队列的选择Java实战案例&#xff1a;基于RabbitMQ的高并发、高可用消息队列 6.1 环境准备6.2 RabbitMQ的安装与配置6.3 Java客户端集成6.4 生产者与消费者实现6.5 高并发处理6.6 高可…...

数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

本文讲SqlServer Express版本在登录的时候&#xff0c; 如何由Windows认证&#xff0c;修改为Sql Server Express认证。 目录 1&#xff0c;SqlServer Express的Windows认证 2&#xff0c;修改为混合认证 3&#xff0c;启用sa 用户 4&#xff0c;用sa 用户登录 下面是详细…...

二分基础两道

Leetcode704: 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出:…...

编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider

​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI,都在用语法树(AST)-CSDN博客 编程AI深度实战:让verilog不再是 AI …...

鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache

OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库&#xff0c;旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍&#xff1a; 1. 核心功能 边播放边缓存&#xff1a;将音视频URL传递给 OhosVideoCache 处理后…...

中间件漏洞之CVE-2024-53677

目录 什么是struts&#xff1f;CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts&#xff1f; 在早期的 Java Web 开发中&#xff0c;代码往往混乱不堪&#xff0c;难以维护和扩展。比如&#xff0c;一个简单的用户登录功能&#xff0c;可能在不同的 Java 类…...

Python玄学

过年期间无聊的看了看DY直播&#xff0c;也是迷上玄学了。突然想着为啥要自己掐指算&#xff0c;我这&#x1f437;脑哪记得到那么多东西啊。然后&#xff0c;就捣鼓捣鼓了一些玩意儿。留个纪念。 注&#xff1a;就是一个玄学推动学习&#xff0c;部分内容不必当真&#xff0c;…...

16.1.STM32F407ZGT6-CAN基础概念

参考&#xff1a; https://blog.csdn.net/sunlight_vip/article/details/128639144 前言&#xff1a; 学习总结CAN的知识点&#xff1a; 1.can是什么&#xff0c;历史由来和背景 2.can的物理层&#xff0c;链路层 3.初始化的流程和关键点 4.波特率怎么设置 5.can id怎么过滤 6…...

记忆化搜索和动态规划 --最长回文子串为例

记忆化搜索 记忆化搜索是一种优化递归算法的方法&#xff0c;通过将已经计算过的子问题的结果存储起来&#xff08;通常使用哈希表或数组&#xff09;&#xff0c;避免重复计算相同的子问题。 本质上是通过缓存中间结果来减少计算的重复性。 动态规划 动态规划是通过将问题分…...

【论文笔记】Fast3R:前向并行muti-view重建方法

众所周知&#xff0c;DUSt3R只适合做稀疏视角重建&#xff0c;与sapnn3r的目的类似&#xff0c;这篇文章以并行的方法&#xff0c;扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战&#xff0c;尤其是在需要跨不同视角实现精确且可…...

cf div3 998 E(并查集)

E : 给出两个简单无向图 &#xff08;没有重边和自环&#xff09;f g . 可以对f 进行 删边 和加边 的操作。问至少操作多少次 &#xff0c;使得 f 和 g 的 点的联通情况相同&#xff08;并查集的情况相同&#xff09; 首先思考删边 &#xff1a; 对于 我 f 图存在边 e &#x…...