写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
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 关键字创建对象,比如:”
“另外,使用对象也很简单,比如:”
结果:
“师兄,这个 ironMan 也是变量吗?”
“是的,不过比较特殊,称为:对象类型变量 或 引用类型变量,在 Java 中一个 class 就是一种类型”
“引用类型?为什么这么说?”
“这就需要,我们就需要聊点儿底层——内存相关的知识了”
2. 内存分配
张小飞:“对象还跟内存有关系?”
诸小亮:“是的,我们先看一些基础知识”
1. 基础知识
诸小亮:“内存:也称内存储器和主存储器,是CPU和以及与硬盘之间的桥梁”
诸小亮:“你知道为什么需要内存吗?”
张小飞:“了解过一些:其实CPU可以直接从硬盘上获取数据,但是CPU处理数据的速度太快,而硬盘速度太慢,就像去餐厅吃饭,厨师老半天做一个菜,端上来 3 秒就被吃完了,然后就等着”
诸小亮:“是这个道理,不过最初为了提高效率,先在 cpu 中设计了缓存,速度很快,
但是,CPU中的缓存空间很有限,根本存不了多少数据,而成本很高
于是就在CPU缓存和硬盘之间又加入了:内存
内存的速度和成本在CPU缓存和硬盘之间,容量也更容易扩充,很合适的数据桥梁”
诸小亮接着说:“运行程序时,把要用到的数据先写入内存,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);
}
}
结果:
“师兄,People@512ddf17 这是什么鬼东西?”
“想知道为什么又这样的输出,就得了解一下Java 中的内存结构”
2. Java内存结构
1. 介绍
诸小亮:“电脑中,所有程序运行的时候都会占用内存,Java 程序运行时把占用内存划分成几个部分,不同的部分存储不同的数据,其中最常见的就是栈和堆”
- 栈:是一块内存区域,存储局部变量,在方法中定义的变量都是局部变量
- 堆:也是一块内存区域,比栈大,存储对象,java中,只要是对象,都存在于堆中
张小飞:“不对啊,刚才不是说 ironMan 是个变量吗?照你这么说,它到底是局部变量还是对象?”
诸小亮:“上面代码,严格来说 ironMan 不是对象,new People(); 才是对象,ironMan可以看作是对象的名字,但是一般我们都称呼:ironMan 这个对象”
张小飞:“原来是这样”
诸小亮:“另外,需要注意:数组也是对象”
“数组也是?”
“它也是通过 new 关键字创建的,可以认为是一种特殊的对象”
“好的,我记下了”
2. 压栈
诸小亮:“java中,执行方法时,会把方法加载到栈中,这叫:压栈,比如:”
张小飞:“可以画图演示一下吗?”
诸小亮:“没问题,上面代码在执行时,是这样的:”
张小飞:“原来 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. 封装、继承、多态
张小飞:“师兄,接下来讲什么?”
诸小亮:“今天就不讲了,你好好熟悉一下刚才的知识,明天开始——面向对象的三大特征”
“什么三大特征?”
“面向对象的三大特征——封装、继承、多态,你最好今天预习一下”
“行,我一定好好看”