Java类与对象

news2024/11/26 18:54:11

文章目录

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

引出

在这里插入图片描述

●看一个养猫猫问题

张老太养了两只猫猫: 一只名字叫小白, 今年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;//属性, 成员变量, 字段 field
    double 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 0
	     float 0.0, double 0.0
	     char ‘\u0000’, boolean false
	     String 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指向p1
		System.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指向p1
		System.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);//200
		System.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 = 5
 		p1.cal02(10);//调用cal02方法, 同时给n = 10

 		//调用getSum方法, 同时num1=10, num2=20
 		//把 方法 getSum 返回的值, 赋给 变量 returnRes
 		int 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-1000
		2.定义一个变量 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.coloradmin.cn/o/1056270.html

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

相关文章

Qt自定义菜单

Qt开发过程中&#xff0c;弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式&#xff0c;如查想要自己的设计界面就没法使用默认的Action项了&#xff0c;因此我们得用自定义的QMenu。 本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget QWidgetAction来实现。Q…

代码随想录 Day8 栈(FILO)与队列(FIFO) LeetCode T232 用栈实现队列 LeetCodeT225 用队列实现栈

题目详细思路来自于:代码随想录 (programmercarl.com) 栈和队列都是大家不陌生的数据结构,我们之前的栈和队列一般是用数组或链表来实现的 , 这里我们给出实现方式,用于帮助更好的理解. 1.用链表实现栈 /* 基于链表实现的栈 */ class LinkedListStack { private ListNode sta…

记录我的网站的上线的全过程

我的网站开发全过程记录: 提示: 大部分是cv代码,少部分样式进行了修改和借鉴,主要花费时间在部署上面,出现的问题 开始: 三个博主: 在掘金上认识了搜狐前端-- 英杰 , 掘金链接:yingjieweb 的个人主页 - 动态 - 掘金 偶然间看见了英杰的网站,感觉非常不错,产生自己弄的想法,…

mybatis-spring集成数据库连接池开启注解式开发

目录 1. 引入依赖包 2. 集成配置文件 2.1 开启注解式开发 2.2 spring引入外部配置文件 2.3 数据库连接池 2.4 spring整合mybatis 2.5 自动代理 3. 注解式开发的几个常用注解 4. spring-test 附录一&#xff1a;spring常用注解 1. 引入依赖包 <!--spring整合mybat…

【面试经典150 | 矩阵】旋转图像

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地旋转方法二&#xff1a;翻转代替旋转 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带…

Mac安装Ecplise产品报错:dose not contain the JNI_CreateJavaVM symbol

1. 絮絮叨叨 工作中需要借助Ecplise Memory Analyzer (MAT)分析dump文件&#xff0c;直接下载、安装、运行MAT报错 询问同事后&#xff0c;同事说可以先安装Ecplise&#xff0c;再以插件的形式安装MAT下载、安装好Eclipse&#xff0c;点击运行仍然报错&#xff0c;且错误信息一…

区块链3.0时代 基于GoMars构建的新概念TravelFi能否注入新力量?

区块链技术进入3.0时代 后疫情时代&#xff0c;全球数字化进程不断加快&#xff0c;世界范围内的移动通信、互联网技术及各类数字化应用的社会普及率也正在快速提升&#xff0c;疫情推动了互联网经济的增长&#xff0c;也让数字经济的价值开始显现。 数字经济一词的由来至今已经…

2023最新注册小程序以及云开发环境的创建

前言&#xff1a; 我们前面虽然可以用测试号创建小程序,但是测试号有很多功能会受限,比如我们接下来要讲的云开发,必须是注册小程序后才可以使用, 一&#xff0c;注册小程序 官方注册文档&#xff1a; 产品定位及功能介绍 | 微信开放文档 (qq.com)https://developers.weixin.…

servlet 线程模型 异步

在 servlet 3.0 之前&#xff0c;请求与线程的对应关系是1:1&#xff0c;对应jvm与操作系统的线程的关系。 https://jcp.org/en/jsr/detail?id315 https://jcp.org/en/jsr/detail?id340 从 servlet 3.0 开始&#xff0c;开始有了异步相关功能 容器线程池与业务线程池开始单独…

第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

第五十二天| 第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 一、300. 最长递增子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-increasing-subsequence/ 题目介绍&#xff1a; 给你一个整数数组 nums &#xff…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

指定vscode黏贴图片路径(VSCode 1.79 更新)

指定vscode黏贴图片路径(VSCode 1.79 更新) 设置中搜索"markdown.copyFiles.destination" 点击AddItem,配置你的key-value&#xff0c;完成。

VUE2项目:尚品汇-axios二次封装请求以及VUEX的状态管理库

上一篇&#xff1a;VUE2项目&#xff1a;尚品汇VUE-CLI脚手架初始化项目以及路由组件分析&#xff08;一&#xff09; 目录 axios二次封装API接口管理与解决跨域API接口管理nprogress进度条配置 VUEX状态管理库三级分类动态背景颜色防抖三级联动跳转路由分析 axios二次封装 项…

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

网络运营和电子商务有什么区别

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 一个同学他问我&#xff0c;他说学网络运营的话&#xff0c;它是不是电子商务里面的这个东西&#xff1f;像电子大…

二十六、设置时序电路初始状态的方法(初始值设置)(时序电路置数)2

方法2 在理解方法1的化简(1)这个方法后,又可以想到输入触发器R和S两个输入端的信号也无非就是0和1。那么直接用LOAD这个信号接在R和S两个输入端上即可。 先用开关判断触发器的R和S是低电平触发还是高电平触发(下图触发器可以直接看出为低电平触发,但是实际用管子搭建的触…

【那些年写过的愚蠢代码】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…