张小飞的Java之路——第七章

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


1. 对象

诸小亮:“师弟,从现在开始,我们就要讲解Java基础中最重要的部分了——面向对象

张小飞:“对象? 不会是学这个之前还得找个对象吧?”

诸小亮:“当然不是了,此对象非彼对象,不过既然说起这个,我很好奇,你就没有打算什么时候成家?”

“还没女朋友,成什么家呀!”张小飞笑了笑说道。

“没女朋友?谁信啊,你是没有固定的女朋友吧”诸小亮鄙视道

“什么女朋友呀,只是关系稍微比你们好一些而已!”张小飞说道。

“不会是你的眼光太高了吧?”

“不是我的眼光高,而是感觉现在找个贤妻良母类型的实在是太难了。”

“那你说说你的要求,我看看我认识的和你嫂子那边有没有符合条件的!”诸小亮看着张小飞问道。

“你不是还没结婚的吗?”张小飞诧异的问道

“嗯…,这也快了,不要转移话题,说说你的要求”

“长相不必太好,有气质就行;身材不必太辣,能耐看就行;个性不必太鲜明,温柔一点就行;不用太过勤劳,会洗衣做饭就行,手艺不必太棒,能吃好就行;不必太过贤惠,知道照顾家就行;不用太过尊重,知道孝敬父母就行;学问不必太高,知道怎么教育下一代就行。你说我的要求高吗?”张小飞看着身边的诸小亮说道。

“喂,怎么了,醒醒,发什么呆呀!”张小飞推了推发呆的诸小亮。

“滋~~!”诸小亮嘎巴了两声嘴,然后看着张小飞,道:“老弟,你的要求……老哥我只能祝福你了。”

“怎么,你的意思是说我的要求很高?” 张小飞看着对方道。

“不是很高,是‘相当’高。你说的那些听似简单,可是你要面对现实,现在的女孩儿各个都是掌上明珠,有几个能有咱们老妈那样手艺的。不说高难度的,就是炒个菜都能把可乐当酱油。”

“听师兄的话似乎深有感触呀”张小飞笑眯眯的看着诸小亮说道。

“哎,曾经沧海难为水!我记得大学时你跟晶晶…”诸小亮叹了口气说道。

“别,你可饶了我吧。关系好归关系好,这个和感情是两码事!”刘星看着对方说道

“你可真难伺候!那…”

“停停停,师兄,我才二十五,还很年轻,我都没操心,你担心什么。以后不准跟我说这个话题!”

“好,好~~!现在的年轻人呀~~!”

“切~,你也就比我大一岁,别玩深沉了,看见美女都眼直!”张小飞鄙视道

“你小子,就没有点好话?”诸小亮推了张小飞一把笑着说道。

“师兄,你太帅了!这话行吗?”张小飞崇拜的说道

“行,太行了!”

“可我却要昧着良心说,真是太痛苦了~~!”

“你小子~~~”

“好了,师兄,咱还是接着讲吧”

“行吧,我说到哪里了?”

2. 面向对象

张小飞:“您刚才说到 ‘此对象非彼对象’,具体是什么意思?”

诸小亮:“我说的对象:指的是一个个具体的事物,有句俗语:‘万物皆对象’,听过没有?”

“额…,没有,举个例子吧”

“好吧,比如:把这个电脑关机,你是不是很容易明确是哪个电脑?”

“这当然,不过我觉得不用关了,你都把它拍坏了”

“。。。。。,别扯淡,其实‘这个电脑’就是一个对象

“这就是 ‘对象’? 那,鼠标、键盘、显示屏等也都是一个个对象?”

“没错,记住:对象:就是一个个具体的事物,万物皆对象”诸小亮严肃的说到

“明白,我一定记住”

张小飞接着问:“那,面向对象又是什么意思?”

诸小亮:“面向对象:是一种解决问题的思考方式

“。。。。。。,说点儿人话吧”

“不要急,在说‘面向对象’之前,你的得先明白什么是‘面向过程’”

“那什么又是‘面向过程’呢?” 张小飞继续问

“面向过程——是另一种解决问题的思考方式”

“。。。。。。,你可真无聊” 张小飞无语道

“哈哈,好了,我们正式说,首先提出一个问题:‘我饿了,要吃饭’,这应该怎么办?”

“这还用问?当然是点外卖了” 张小飞说道

“有没有其他方法呢?”

“那就,自己做呗”

“不错,不过,自己做点外卖,哪种方便呢?”

“师兄,不要问这么弱智的问题好不好,当然是:点外卖方便了”

“为什么呢?”

张小飞白了他一眼,说到:“自己做,需要 买锅、买菜、洗菜、炒菜、吃饭、刷碗等,太麻烦”

“不错,现在告诉你:面向过程 就相当于自己做,面向对象 就相当于点外卖

“嗯?为什么这么说?”

诸小亮:“面向过程:需要自己一步步的做很多事情,而且还要解决中间可能出现的问题”

  • 用编程的话来说:需要自己创建一个个方法去解决对应的问题
  • 这就是:面向过程的思考方式,强调的是一个个的功能

“面向对象:不需要自己做很多事情,只要找到一个能够帮自己解决问题的人,就够了”

  • 用编程的话来说:找到一个能够解决问题的对象就行了
  • 这就是:面向对象的思考方式,强调的是具备某些功能的对象

张小飞:“让我想想…,把饭店看作一个对象,它具备做饭的功能,所以我直接去饭店就行了…”

诸小亮:“再举个例子,你原来是不是老让人家给你带饭?”

张小飞:“是啊…,哦,我明白了,带饭的人也是对象,它具有‘带饭’的功能”

“不错,你说的很对”

“师兄,按你的意思来说,生活中处处都是面向对象”

“是啊,所以才说:万物皆对象

3. 类

诸小亮:“明白了面向对象,我们接着说 ——

张小飞:“类,又是什么意思?”

“类:就是种类、类别的意思,在 Java 中用 class 表示”

“哦~,原来是这个意思,不过跟 Java 有什么关系呢”

“通过之前的学习,我们知道:人们创造计算机的目的就是想用二进制代表世间万物,最终解决现实中的问题”

“没错,是这样的”

“不过,在解决问题前,总得先用计算机语言描述一下现实生活中的事物吧”

“额…,有道理,不过怎么描述呢?”

“我们先用人类语言去描述,现实生活中,描述事物无非就是描述事物的属性和行为”

  • 属性:就是有什么
  • 行为:可以做什么,有什么功能
  • 比如,人:有身高、体重等属性; 也具备:说话、行走、吃饭等行为

“这个我明白,不过跟 有什么关系?”张小飞问道

“在 Java 中,通过类 ,也就是class来描述事物,给你一张图,你先看看”

在这里插入图片描述

“这…,这就算是用 class 描述人类了?”

“是啊,怎么,太简单了?”

“确实,超乎我的想象,这么来说:heigh、weight就是属性,eat、run、talk就是行为”

“没错,不过在 Java 中 它们统称为:成员“

  • 属性:是成员变量
  • 行为:是成员方法

4. 类 和 对象

张小飞:“之前说的 对象 和 类 有关系吗?”

诸小亮:“是的,之前说:对象是一个具体的事物,准确来说:对象是某类事物中的个体

张小飞:“我想想…,‘人’是一个类别,钢铁侠、美国队长等都是这个类别中的个体”

诸小亮:“没错,一个对象,必定属于某个类别,也就是某个 class

如果用具体代码来表示:

在这里插入图片描述

张小飞:“原来如此”

诸小亮:“那么,我们总结一下:”

  • 类(class):是对现实中某种事物的描述
    • 注意:创建类时,类名的首字母一般大写
  • 对象(Object):是某类事物中的个体

5. 对象详解

1. 对象的建立和使用

张小飞:“还有一个问题,上面图片中的 new People() 是创建对象吗?”

诸小亮:“没错,Java 中一般都使用 new 关键字创建对象,比如:”

在这里插入图片描述

“另外,使用对象也很简单,比如:”

在这里插入图片描述

结果:

image.png

“师兄,这个 ironMan 也是变量吗?”

“是的,不过比较特殊,称为:对象类型变量 或 引用类型变量,在 Java 中一个 class 就是一种类型

“引用类型?为什么这么说?”

“这就需要,我们就需要聊点儿底层——内存相关的知识了”

2. 内存分配

张小飞:“对象还跟内存有关系?”

诸小亮:“是的,我们先看一些基础知识”

1. 基础知识

诸小亮:“内存:也称内存储器主存储器,是CPU和以及与硬盘之间的桥梁”
image.png
诸小亮:“你知道为什么需要内存吗?”

张小飞:“了解过一些:其实CPU可以直接从硬盘上获取数据,但是CPU处理数据的速度太快,而硬盘速度太慢,就像去餐厅吃饭,厨师老半天做一个菜,端上来 3 秒就被吃完了,然后就等着”

诸小亮:“是这个道理,不过最初为了提高效率,先在 cpu 中设计了缓存,速度很快,
               但是,CPU中的缓存空间很有限,根本存不了多少数据,而成本很高
               于是就在CPU缓存和硬盘之间又加入了:内存

内存的速度和成本在CPU缓存和硬盘之间,容量也更容易扩充,很合适的数据桥梁”

image.png
诸小亮接着说:“运行程序时,把要用到的数据先写入内存,cpu从内存读取数据比硬盘快得多,
同时容量也大,可以临时存储一些常用数据,这样大大加快了电脑的运行效率”

张小飞:“明白,明白”

“来,我们尝试一下把对象直接用 println 打印出来”

class People{
	
	double height;
	double weight;
	
	void run(){
		System.out.println("人会行走");
	}
}

class Demo{
	public static void main(String[] args) {
		People ironMan = new People();
		System.out.println(ironMan);
    }
}

结果:
1672835434466.png

“师兄,People@512ddf17 这是什么鬼东西?”

“想知道为什么又这样的输出,就得了解一下Java 中的内存结构

2. Java内存结构

1. 介绍

诸小亮:“电脑中,所有程序运行的时候都会占用内存,Java 程序运行时把占用内存划分成几个部分,不同的部分存储不同的数据,其中最常见的就是栈和堆

  • 栈:是一块内存区域,存储局部变量,在方法中定义的变量都是局部变量
  • 堆:也是一块内存区域,比栈大,存储对象,java中,只要是对象,都存在于堆中

张小飞:“不对啊,刚才不是说 ironMan 是个变量吗?照你这么说,它到底是局部变量还是对象?”

诸小亮:“上面代码,严格来说 ironMan 不是对象,new People(); 才是对象,ironMan可以看作是对象的名字,但是一般我们都称呼:ironMan 这个对象”

张小飞:“原来是这样”

诸小亮:“另外,需要注意:数组也是对象

“数组也是?”

“它也是通过 new 关键字创建的,可以认为是一种特殊的对象”

“好的,我记下了”

2. 压栈

诸小亮:“java中,执行方法时,会把方法加载到栈中,这叫:压栈,比如:”

image.png
张小飞:“可以画图演示一下吗?”
诸小亮:“没问题,上面代码在执行时,是这样的:”

在这里插入图片描述

张小飞:“原来 main 方法也会压栈,不过还是不明白”

诸小亮:“额…,这样吧,简单来说:每个方法都在栈中划出一块区域,用于存放它的变量

“好的,如果方法执行结束呢?”

“当方法执行结束,那就从上到下一个个从栈中移除”

3. 对象在内存的分配

张小飞:“师兄,您刚才说了栈,但是跟对象有什么关系呢?”
诸小亮:“有一些关系,上面 ironMan 这个局部变量是在栈中,但是对应的对象存在堆中,比如:”

在这里插入图片描述

张小飞:“这个…,您解释一下吧”

诸小亮:“来,我解释一下:People ironMan = new People(); 这句代码的含义:”

  • 首先,执行 new People(); 会在堆内存中划分一块儿空间,存储对象的属性
  • 然后,把内存空间的起始地址,赋值给 ironMan 变量
    • 计算机中的内存都是一块一块儿的,每一块内存都有其唯一的地址编号
    • 一个对象可能占用多块连续的内存,所以 ironMan 的值是起始地址

“所以,最终输出的是 ironMan 对象在内存中的地址?”
“是的,我具体解释一下输出的含义:”

在这里插入图片描述

People@15db9742 的解释:

  • People:表示这个对象的类型
  • 15db9742:就是这个对象在内存中的地址,这是16进制
  • @:没有意义,就是一个分隔符

“原来是这样,我明白了,那,操作属性就是直接修改它在堆内存中存储的值了?”

“是的,看下图:”

在这里插入图片描述

“其本质:就是修该 ironMan 对象在堆内存中存储的 height 属性的值”

在这里插入图片描述

“另外,因为 ironMan 的值是对象在内存中的地址,所以一般都说 ironMan 指向这个对象

3. 对象的参数传递

诸小亮:“师弟,上面的都能理解吗?”

“当然可以了,您继续吧”张小飞说道

“好的,那就接着说:对象的参数传递

“是把对象最为一个方法的参数?”

“是的,不过需要提前了解两个概念:”

int num = 10;//num是基本数据类型
People p = new People()//p是引用数据类型

张小飞:“这个明白”

1. 普通传递

诸小亮:“那好,首先看——普通类型的传递,先看下面代码:”

public static void main(String[] args) {
    int num = 100;
    setNum(num);
    System.out.println(num);
}

public static void setNum(int n ){
    n = 500;
}

结果:

在这里插入图片描述

张小飞:“???,不太明白您的意思,这个输出有问题?”

诸小亮:“当然没问题,不过你可否解释一下为什么输出的不是500,而是 100 吗?”

“嗯…,首先 num 是 main 方法中的局部变量,n 是 setNum 方法中的局部变量”

“不错,你说的很对,继续”

“执行 setNum(num) 时,把 num 的值赋给了setNum 方法中的局部变量 n,相当于:int n = num; 也就是说现在有两个局部变量,值都是100,比如:”

在这里插入图片描述

“最后,在 setNum方法中 中修改 n 的值,但并不会 main 方法中 num 的值,所以输出是100”

“哈哈,不错,说的全对,其实这种参数传递称为:值传递

2. 类类型参数传递

诸小亮:“咱接着看——类类型参数传递,即:对象类型参数传递”

public static void main(String[] args){
    People ironMan = new People();
    //1. 设置 height 的值
    ironMan.height = 1.0;
    //2. 调用方法,把一个对象作为参数,在里面修该 height 的值
	setPeople(ironMan);
    //3. 最后输出 height
    System.out.println("身高是:"+ironMan.height);

}

public static void setPeople(People man){
    man.height=2.0;
}

结果:

在这里插入图片描述

“师弟,这个输出,你还能解释一下吗?”

“额…,这个,您来解释一下吧”

“好吧,解释这种现象,需要知道 setPeople 方法中 man 的值到底是多少,先修改代码:”

在这里插入图片描述

结果:

在这里插入图片描述

张小飞看到输出后恍然大悟:“我明白了”

诸小亮:“是吗?那你来解释一下吧”

“执行 setPeople(ironMan) 时,把 ironMan 的值赋给了setPeople方法中的 man 变量,

相当于:People man = ironMan; 也就是现在有两个 People 类型的变量,指向堆中的同一对象,比如:”

在这里插入图片描述

诸小亮:“是的,你说的没错”

“那就没跑了,在 setPeople 中,设置 man 的 height 属性,就是设置内存中 height 的值,所以…”

“唉,又让你猜对了”

“师兄,什么叫猜对了,是我真的理解了好不好”

“好好好,你好棒棒,行了吧”诸小亮说道

“这还差不多,不过你列出这两种参数传递的方式,是为了说明什么呢?”

“其实就是告诉你:对象类型参数的本质是:值传递

“明白,我记下了”

6. 封装、继承、多态

张小飞:“师兄,接下来讲什么?”

诸小亮:“今天就不讲了,你好好熟悉一下刚才的知识,明天开始——面向对象的三大特征”

“什么三大特征?”

“面向对象的三大特征——封装、继承、多态,你最好今天预习一下”

“行,我一定好好看”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值