Java类与对象

文章目录

  • 引出
  • 概念
  • 快速入门
  • 对象内存布局
  • 属性概念
  • 创建对象访问属性
  • 对象分配机制
  • 成员方法
    • 🦖注意事项和细节

引出

在这里插入图片描述

●看一个养猫猫问题

张老太养了两只猫猫: 一只名字叫小白, 今年3岁, 白色. 还有一只叫小花, 今年100岁, 花色. 请编写一个程序, 当用户输入小猫的名字时, 就显示该猫的名字, 年龄, 颜色. 如果用户输入的小猫名字错误, 则显示 张老太没有这只猫咪.

●使用现有技术解决 Object01.java

import java.util.Scanner;public class Object01 {//编写一个main方法public static void main(String[] args) {/*张老太养了两只猫猫: 一只名字叫小白, 今年3岁, 白色. 体重, 爱好还有一只叫小花, 今年100岁, 花色. 请编写一个程序, 当用户输入小猫的名字时, 就显示该猫的名字, 年龄, 颜色. 如果用户输入的小猫名字错误, 则显示 张老太没有这只猫咪.//思路分析1.单独定义变量 -> 不利于数据的管理(你把一只猫的信息拆解)2.创建Scanner对象, 接收用户输入*///代码实现//第一只猫信息String cat1Name = "小白";int cat1Age = 3;String cat1Color = "白色";//第二只猫信息String cat2Name = "小花";int cat2Age = 100;String cat2Color = "花色";Scanner myScanner = new Scanner(System.in);System.out.print("输入小猫的名字: ");String catName = myScanne r.next();//数组 ==> (1)数据类型体现不出来  (数组是多个相同类型数据的组合)//		   (2)只能通过[下标]获取信息, 造成变量名字和内容的对应关系不明确//		   (3)不能体现猫的行为//第1只猫信息String[] cat1 = {"小白", "3", "白色"}; cat1[]String[] cat2 = {"小花", "100", "花色"};}  
}

●现有技术解决的缺点分析

不利于数据的管理
效率低 ⇒ 引出我们的新知识点, 类与对象
有很多书视频甚至还提到哲学,道家思想,形而上思想,才引出类与对象, 其实没那么复杂. java语言设计设去设计类与对象, 其实是特别简单的思想.

java设计者 引入类与对象(OOP), 根本原因就是现有的技术, 不能完美地解决新的需求

其实就是这么一点东西, 但是往往我们会把一些技术理解的过于神秘, 跟着学有关系~ 跟道家思想有关系~ 都是没有意思的

概念

一个程序就是一个世界, 有很多事物 (对象[属性, 行为])

●类与对象的关系示意图

在这里插入图片描述
1.把一种事物的共性(属性)提取出来,形成的一个叫做类的数据类型.

2.这个数据类型就是我们自定义的数据类型谁定义的? 程序员定义的
在这里插入图片描述

快速入门

●面向对象的方式解决养猫问题 Object01.java

public class Object01 {//编写一个main方法public static void main(String[] args) {//使用OOP面向对象解决//实例化一只猫[创建一只猫对象]//解读//1.new Cat() 创建一只猫//2.Cat cat1 = new Cat(); 把创建的猫 赋给 cat1//3.cat1 就是一个对象(猫对象)Cat cat1 = new Cat();cat1.name = "小白";cat1.age = 3;cat1. color = "白色";cat1.weight = 2;//创建第二只猫, 并赋给 cat2//cat2也是一个对象(猫对象)Cat cat2 = new Cat();cat2.name = "小花";cat2.age = 100;cat2.color = "花色";cat2.weight = 3;//怎么访问对象的 属性 呢System.out.println("第一只猫信息: " + cat1.name + " " + cat1.age + " " + cat1.color + " " + cat1.weight);System.out.print("第二只猫信息: " + cat2.name + " " + cat2.age + " " + cat2.color + " " + cat2.weight);}  
}//使用面向对象的方式解决养猫问题
//定义一个猫类 -> 自定义的数据类型
class Cat {//属性String name;//名字int age;//年龄String color;//颜色double weight;//体重//行为}

●类和对象的区别和联系

通过上面的案例和讲解我们可以看出:
1)类是抽象的, 概念的, 代表一类事物, 比如人类, 猫类…, 即它是数据类型
2)对象是具体的, 实际的, 代表一个具体事物, 即 是实例
3)类是对象的模板, 对象是类的一个个体, 对应一个实例.

对象内存布局

●对象在内存中的存在形式

在这里插入图片描述

属性概念

●属性/成员变量

√ 基本介绍 Object02.java
1.从概念或叫法上看: 成员变量 = 属性 = field字段 (即 成员变量是用来表示属性的, 这里, 统一叫 属性)
2.属性是类的一个组成部分, 一般是基本数据类型, 也可以是引用类型(对象, 数组). 比如我们前面定义猫类 的 int age 就是属性.

public class Object02 {//编写一个main方法public static void main(String[] args) {}
}class Car {String name;//属性, 成员变量, 字段 fielddouble price;String color;String[] master;//属性可以是基本数据类型, 也可以是引用类型(对象, 数组)
}

√ 注意事项和使用细节 PropertiesDetail.java
1)属性的定义语法同变量不同, 实例: 访问修饰符 属性类型 属性名;
   这里简单地介绍一下访问修饰符: 控制属性的访问范围
   有4种访问修饰符 public protected 默认 private, 后面再详细学习
2)属性的定义类型可以是任意类型, 包含基本类型和引用类型

3)属性如果不赋值, 有默认值, 规则和数组一样
   byte 0, short 0, int 0, long 0
   float 0.0, double 0.0
   char ‘\u0000’, boolean false
   String null
4)
在这里插入图片描述

public class PropertiesDetail {//编写一个main方法public static void main(String[] args) {//创建Person对象//p1 是对象名(对象引用)//new Person() 创建的对象空间(包括数据) 才是真正的对象Person p1 = new Person();//对象属性的默认值, 遵守数组的规则/*byte 0, short 0, int 0, long 0float 0.0, double 0.0char ‘\u0000’, boolean falseString null*/System.out.println("当前这个人的信息");System.out.println("age=" + p1.age + " name=" + p1.name + " sal=" + p1.sal + " isPass=" + p1.isPass);}
}class Person {//四个属性int age;String name;double sal;boolean isPass;
}

在这里插入图片描述

创建对象访问属性

●如何创建对象

1.先声明再创建
Cat cat; //声明对象 cat
cat = new Cat(); //创建
在这里插入图片描述
2.直接创建
Cat cat = new Cat();


●如何访问属性
√ 基本语法
对象名.属性名;
cat.name;
cat.age;
cat.color;

对象分配机制

●类和对象的内存分配机制(重要)

√ 看一个思考题 Object03.java
我们定义一个人类(Person)(包括 名字, 年龄)

我们看看下面一段代码
Person p1 = new Person();
p1.age = 10;
p1.name = “小明”;
Person p2 = p1;//把p1 赋给了 p2; 让p2指向p1
System.out.println(p2.age);

请问: p2.age究竟是多少? 并画出内存图.
在这里插入图片描述

public class Object03 {//编写一个main方法public static void main(String[] args) {Person p1 = new Person();p1.age = 10;p1.name = "小明";Person p2 = p1;//把p1 赋给了 p2; 让p2指向p1System.out.println(p2.age); }
}class Person {int age;String name;
}

√ Java内存结构分析

  1. 栈: 一般存放基本数据类型(局部变量)
  2. 堆: 存放对象(Cat cat, 数组等)
  3. 方法区: 常量池(常量, 比如字符串), 类加载信息
  4. 示意图[Person(age, name)]
    在这里插入图片描述

√ Java创建对象的流程简单分析
Person p = new Person();
p.name = “jack”;
p.age = 10;

1.先加载Person类信息(属性和方法信息, 只会加载一次)
2.在堆中分配空间, 进行默认初始化[看规则]
3.把地址赋给 p, p 就指向对象
4.进行指定初始化, 比如 p.name = “jack”; p.age = 10


√ 看一个练习题, 并分析画出内存布局图, 进行分析
//我们看看下面一段代码, 会输出什么信息
Person a = new Person();
a.name = “小明”;
a.age = 10;
Person b;
b = a;
System.out.println(b.name);//小明
b.age = 200;
b = null;
System.out.println(a.age);//200
System.out.println(b.age);//报错

在这里插入图片描述在这里插入图片描述

public class Object03 {//编写一个main方法public static void main(String[] args) {/*Person p1 = new Person();p1.age = 10;p1.name = "小明";Person p2 = p1;//把p1 赋给了 p2; 让p2指向p1System.out.println(p2.age);*/ Person a = new Person();a.name = "小明";a.age = 10;Person b;b = a;System.out.println(b.name);//小明b.age = 200;b = null;System.out.println(a.age);//200System.out.println(b.age);//报错}
}class Person {int age;String name;
}

成员方法

●基本介绍
在某些情况下, 我们需要定义成员方法(简称方法). 比如人类: 除了有一些属性外(年龄, 姓名…), 我们人类还有一些行为比如: 可以说话, 跑步…通过学习, 还可以做算术题. 这时就要用成员方法才能完成. 现在要求对Person类完善.

●成员方法快速入门 Method01.java
1)添加speak 成员方法, 输出 我是一个好人
2)添加cal01 成员方法, 可以计算从 1 + … + 1000 的结果
3)添加cal02 成员方法, 该方法可以接收一个数n, 计算从 1 + … + n 的结果
4)添加getSum 成员方法, 可以计算两个数的和

public class Method01 {//编写一个main方法public static void main(String[] args) {//方法使用//1. 方法写好后, 如果不去调用(使用), 不会输出//2. 先创建对象, 然后调用方法即可Person p1 = new Person();p1.speak();//调用方法p1.cal01();//调用cal01方法p1.cal02(5);//调用cal02方法, 同时给n = 5p1.cal02(10);//调用cal02方法, 同时给n = 10//调用getSum方法, 同时num1=10, num2=20//把 方法 getSum 返回的值, 赋给 变量 returnResint returnRes = p1.getSum(40, 20);System.out.println("getSum方法返回的值=" + returnRes);}
}class Person {int age;String name;//方法(成员方法)//添加speak 成员方法, 输出 我是一个好人//解读//1. public 表示方法是公开的//2. void : 表示方法没有返回值//3. speak() : speak是方法名 ()是形参列表//4. {} 方法体, 可以写我们要执行的代码//5. System.out.println("我是一个好人"); 表示我们的方法就是输出一句话public void speak() {System.out.println("我是一个好人");}//添加cal01 成员方法, 可以计算从 1 + ... + 1000 的结果public void cal01() {/*可以用循环语句1.循环1-10002.定义一个变量 int sum, 累积求和*/int sum = 0;for (int i = 1; i <= 1000; i++) {sum += i;}System.out.println("cal01方法 计算结果=" + sum);}//添加cal02 成员方法, 该方法可以接收一个数n, 计算从 1 + ... + n 的结果//解读//1. (int n) 形参列表, 表示当前有一个形参 n, 可以接收用户输入public void cal02(int n) {//循环完成int sum = 0;for (int i = 1; i <= n; i++) {sum += i;}System.out.println("cal02方法 计算结果=" + sum);}//添加getSum 成员方法, 可以计算两个数的和//解读//1. public 表示方法是公开的//2. int : 表示方法执行后, 返回一个 int值//3. getSum 方法名//4. (int num1, int num2) 形参列表, 2个形参, 可以接收用户传入的两个数//5. return res; 表示把 res 的值, 返回public int getSum(int num1, int num2) {int res = num1 + num2;return res;}
}

●方法的调用机制原理
画出程序执行过程[getSum]+说明
在这里插入图片描述

●为什么需要成员方法 Method02.java
√ 看一个需求:
请遍历一个数组, 输出数组的各个元素值 int[][] map = {{0, 0, 1}, {1, 1, 1}, {1, 1, 3}};
√ 解决思路1: 传统的方法, 就是使用单个for循环, 将数组输出, 大家看看问题是什么?
√ 解决思路2: 定义一个类 MyTools, 然后写一个成员方法, 调用方法实现, 看看效果又如何.

●成员方法的好处
√ 提高代码的复用性
√ 可以将实现的细节封装起来, 然后供其它用户来调用即可


●成员方法的定义

访问修饰符[public…] 返回数据类型 方法名 (参数列表…) {//方法体
         语句;
         return 返回值;
}

1.形参列表: 表示成员方法输入 cal(int n), getSum(int num1 int num2)
2.返回数据类型: 表示成员方法输出, void 表示没有返回值
3.方法主体: 表示为了实现某一功能代码块
4.return 语句不是必须的
5.温馨提示: 结合前面的示意图, 理解.

🦖注意事项和细节

●注意事项和细节 MethodDetail.java

√ 访问修饰符 (作用是控制 方法使用的范围)
如果不写默认访问修饰符. [有4种: public, protected, 默认, private]

√ 返回数据类型
1.一个方法最多只有一个返回值 [思考, 如何返回多个结果. 可以返回数组]
2.

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

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

相关文章

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

当面试被问到jvm(Java虚拟机)时,如何将面试官引入自己的节奏?

本文目录 前言快问快答抛砖引玉锦上添花好书推荐总结 前言 作为一名Java开发工程师&#xff0c;不管是校招还是社招jvm一定是必问必会的知识点。虽然说真正开发中用到的不多&#xff0c;甚至可以说用不到&#xff08;对于刚入行或者Java初级&#xff09;&#xff0c;但是当面试…

Redis实现API访问频率限制

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ffmpeg、ffplay在线安装,离线导出整个程序,移植到其他服务器使用(linux系统)

环境说明 以ubuntu系统作为说明 在线安装 下面命令会同时安装ffplay和ffmpeg sudo apt-get install ffmpeg怎么验证安装成功&#xff1f; 输入ffmpeg命令 ffmpeg&#xff0c;如图则说明安装成功 转储可执行程序和依赖的文件 找到安装路径&#xff0c;一般在/usr/bin目录…

Neo4j 与 Cypher 基础

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 简介 Neo4j 是用 Java 实现的开源 NoSQL 图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于 GitHub。 与常见的关系型数据库不同&#xff0c;Neo4j 基于图图结构来表示…

10.01

服务器 #include<myhead.h> //键盘输入事件 int keybord_events(fd_set readfds) {char buf[128] "";int sndfd -1; //从终端获取一个文件描述符&#xff0c;发送数据给该文件描述符对应的客户端bzero(buf, sizeof(buf));int res scanf("…

CSP-J第二轮试题-2020年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J2020] 优秀的拆分题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释数据规模与约定 答案1答案2 [CSP-J2020] 直播获奖题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 …

AI伦理与机器道德:人工智能的道德挑战

文章目录 什么是AI伦理和机器道德&#xff1f;1. 隐私保护2. 歧视和不平等3. 透明度和解释性4. 安全性5. 社会影响 AI伦理和机器道德的重要性1. 保护个人权利2. 避免不平等和歧视3. 保持透明和责任4. 促进创新 AI伦理挑战和解决方案1. 隐私保护2. 歧视和不平等3. 透明度和解释性…

C++八股

1、简述一下C中的多态 在面向对象中&#xff0c;多态是指通过基类的指针或引用&#xff0c;在运行时动态调用实际绑定对象函数的行为&#xff0c;与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的&#xff0c;编译器会根据实参类型来选择…

第80步 时间序列建模实战:GRNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用Matlab进行GRNN模型的构建。 使用的数据如下&#xff1a; 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrom…

使用SDKMAN在Linux系统上安装JDK

本文使用的Linux发行版为Rocky Linux 9.2&#xff0c;可以当做CentOS的平替产品。 SDKMAN是一个sdk包管理工具&#xff0c;通过自带的命令可以快速切换软件环境&#xff0c; 官网地址&#xff1a;https://sdkman.io/。 1、安装sdkman&#xff1a; # curl -s "https://ge…

SpringBoot整合RocketMQ笔记

SpringBoot版本为2.3.12.Release RocketMQ对比kafka 学习链接 https://zhuanlan.zhihu.com/p/335216381 代码实战 https://www.cnblogs.com/RedOrange/p/17401238.html Centos安装rocketmq https://blog.csdn.net/chuige2013/article/details/123783612 RocketMQ详细配置与…

【C语言深入理解指针(2)】

1. 数组名的理解 在上⼀个博客我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#x…

C++ - 开散列的拉链法(哈希桶) 介绍 和 实现

前言 之前我们介绍了&#xff0c;闭散列 的 开放地址法实现的 哈希表&#xff1a;C - 开放地址法的哈希介绍 - 哈希表的仿函数例子_chihiro1122的博客-CSDN博客 但是 闭散列 的 开放地址法 虽然是哈希表实现的一种&#xff0c;但是这种方式实现的哈希表&#xff0c;有一个很大的…

【操作系统】了解Linux操作系统中PCB进程管理模块与进程PID

本篇要分享的内容是有关于操作系统中进程的内容。 目录 1.进程的简单理解 2.了解task_struct&#xff08;进程控制模块&#xff09;内容分类 3.task_struct&#xff08;进程控制模块&#xff09;中的PID 4.调用查看PID的函数 1.进程的简单理解 首先我们需要理解的是什么是…

C++指针的使用

文章目录 1.C指针1.1 定义指针1.2 使用指针 2.空指针和野指针2.1 空指针2.2 野指针 3.指针所占空间4.使用const修饰指针4.1 const修饰指针4.2 const修饰常量4.3 const 既修饰指针也修饰常量 5.指针操作数组6.指针做函数参数7.使用指针知识实现冒泡排序 1.C指针 指针其实就是一…

SpringBoot整合数据库连接

JDBC 1、数据库驱动 JDBC&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;即Java数据库连接。简而言之&#xff0c;就是通过Java语言来操作数据库。 JDBC是sun公司提供一套用于数据库操作的接口. java程序员只需要面向这套接口编程即可。不同的数据库厂商&…

Ubuntu配置深度学习环境(TensorFlow和pyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…

计算机竞赛 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

数据结构:复杂度分析

目录 1 算法效率评估 1.1 实际测试 1.2 理论估算 2 迭代与递归 2.1 迭代 1. for 循环 2. while 循环 3. 嵌套循环 2.2 递归 1. 调用栈 2. 尾递归 3. 递归树 2.3 两者对比 3 时间复杂度 3.1 统计时间增长趋势 3.2 函数渐近上界…