黑马程序员_Java基础Day05_面向对象之封装(Done)
------- android培训、java培训、期待与您交流! ----------
Day05开始接触到了Java核心部分——“面向对象”。
面向对象是一种思考思想,是相对于早期的“面向过程”而言的。
比如:把大象放进冰箱需要哪些步骤?
①打开冰箱;②把大象放进去;③关闭冰箱。
在这个描述中,我们强调的是“过程”,注重的是过程中所涉及到的行为、功能(打开==>存储==>关闭)。所以这是一个面向过程的方法。
但是,我们发现,无论是“打开”、“存储”、“关闭”,我们操作的都是“冰箱”,这些都是“冰箱”这类事物所具备的行为。换句话说,有了冰箱,就有了这一系列的功能。即这些功能被封装在了冰箱这个事物当中。因此,我们只要得到了冰箱这类事物,就自然能够得到“打开”、“存储”、“关闭”这些功能。这样就是面向对象的思想。
由此可见面向过程强调的是功能,而面向对象强调的具有(封装了)一系列功能的一类事物。
面向对象思想是符合人们思考习惯的一种思想,它将复杂的问题简单化,将程序员从执行者变为指挥者。
开发的过程就是找对象、创建对象、适用对象,并维护对象之间的关系。如果没有对象,那么就自己创造一个对象来使用。
类与对象的关系:类是对现实生活中事物的描述,而对象就是这类事物实实在在存在的个体。
描述对象就是提取对象中共性内容的过程,在Java中是以“类”的形式体现的;对象是通过new操作符产生的一个实体,这个实体在堆内存中。
以通过图纸生产汽车为例,理解类与对象的关系,如下图:
这里图纸就相当于Java中的类,通过图纸生产出来的汽车,就是Java中的对象。
描述事物的过程能够就是定义类的过程。而描述事物就是在描述事物的属性和行为。属性对应的是类中的变量;行为对应的是类中的方法(函数)。属性和行为又共同称为类中的成员,即:成员变量和成员方法(函数)。
class Car//定义一个Car类(描述汽车),相当于图纸
{String color = "red";//定义汽车颜色并初始化int num = 4;//定义汽车轮胎数并初始化void run()//定义汽车功能,展示颜色和轮胎数{System.out.println("color="+color+"...num="+num);}
}
class CarDemo
{public static void main(String[] args) {Car c = new Car();//生产汽车。使用new操作符,将汽车从抽象的图纸(类)变为具体的实体(对象)c.color = "green";//更改汽车颜色。更改的是实物(对象)而不是图纸(类)c.run();//调用run();方法}
}
成员变量与局部变量的区别:
①作用范围:
成员变量===>整个类中有效;
局部变量===>函数中或者语句中;
②内存中存储位置:
成员变量===>堆内存中,随着对象的建立而存在,随着对象的消失而消失;
局部变量===>栈内存中,方法被调用或语句执行用时存在,当方法调用完,或语句执行结束后,自动释放;
③初始化值:
成员变量有默认初始值;
局部变量没有默认初始值,使用前必须赋值;
匿名对象就是“没有名字的对象”,是对象的一种简写形式。
匿名对象使用方式:
①当匿名对象的方法仅调用一次时,可使用匿名对象来完成,这样写比较简化。但是,当需要对对象进行多次/多个成员调用时,必须使用new操作符创建对象后使用;
②匿名对象可以调用属性,但是这样毫无意义;
③可以将匿名对象作为实际参数进行传递。
面向对象三个特征:封装,继承,多态
封装(Encapsulation)
封装的概念:隐藏对象的属性和细节,仅对外提供公共访问方式。
封装带来的好处:将变化隔离,方便使用,提高重用性,提高安全性。
举个生活中的例子:
我们去汽车修理厂修汽车,我们需要做的仅仅是把汽车交给修理人员;过几天后过去取回修理好的汽车并付钱即可。而具体汽车如何修理的,整个修理的过程是什么样子,修理用到了什么材料、什么零件...这些我们都没有必要知道。
这就是汽车修理厂把修理汽车的过程给封装隐藏了起来,仅仅提供了一个收费口,人们把车开来付钱即可。
封装原则:
①把不需要对外提供的部分隐藏起来;
②把属性都隐藏,提供公共方法对其访问。
(函数就是Java中最小的封装体)
private关键字
private私有:权限修饰符,用于修饰类中的成员(成员变量或成员函数)
私有仅在本类中有效;将类中的成员私有后,类以外即便建立了对象,也不能直接访问。
私有仅仅是封装的一种表现形式,封装!=私有。
private修饰成员变量,将其私有化,对外提供set*** 和 get*** 方法对其访问。
并且,通过使用语句,可以限制set***的条件,从而实现对访问的数据进行控制(使其符合实际情况)提高代码的安全性、健壮性。
class Person//定义Person类
{private int age;//定义int型成员变量age,并将其封装在类中,让外界不能直接访问。public void setAge(int age)//对外提供访问方法,并根据实际情况对age的取值进行限制{if (age>=0 && age<=130){this.age = age;show();}elseSystem.out.println("输入了非法age");}public int getAge()//对外提供访问方法{return this.age;}void show(){System.out.println("age="+age);}
}class PersonDemo
{public static void main(String[] args) {Person p = new Person();//创建Person对象p.setAge(200);//使用Person类提供的方法,对age进行操作}
}
运行结果:
构造函数
构造函数也是函数,是有特殊功能的函数。所以,具备函数的一般性质。
构造函数特点:
1.函数名与所在类类名一致;
2.没有返回值类型;(是没有,并不是返回值为void)
3.由于第2点的存在,所以也不可以写return语句。
构造函数的作用:
给对象进行初始化。对象一建立,就会调用与之对应的构造函数。当一个类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数。
类名(){}
当函数中自定义了构造函数后,默认的构造函数就没有了。
构造函数具备重载的特性,方便给不同的对象进行初始化。
在运行方面,构造函数与一般函数不同:
构造函数是在对象一建立就运行,给对象初始化。一般方法是对象调用时才开始执行,目的是给对象添加功能。
对象一建立,构造函数只运行一次;一般方法(函数)可被对象多次调用。
根据构造函数的作用,可知,一般将事物的特有属性,特有行为定义在构造函数中。
构造代码块
作用:给对象进行初始化。对象一建立就运行,并且,优先于构造函数执行。构造代码块中定义的是不同对象共性的初始化内容。
构造代码块与构造函数的区别:
构造代码块是给所有对象统一初始化;而构造函数是给对应的对象初始化。
如下面代码,定义游戏角色,角色具备初始等级(lv)和初始装备(equip),并且每个角色生成时,都会说同样的话。
class Player
{private String equip;private int lv;{System.out.println("银鳞胸甲5G一件。");//角色共性初始化内容,定义在构造代码块中。}Player()//①{System.out.println("equip="+equip+"---lv="+lv);}Player(String e)//②{equip = e;System.out.println("equip="+equip+"---lv="+lv);}Player(int l)//③{lv = l;System.out.println("equip="+equip+"---lv="+lv);}Player(String e,int l)//④{equip = e;lv = l;System.out.println("equip="+equip+"---lv="+lv);}//①至④定义了具备不同初始化内容的四种Player。
}
class PlayerDemo
{public static void main(String[] args) {Player p1 = new Player();Player p2 = new Player("霜之哀伤");Player p3 = new Player(70);Player p4 = new Player("银鳞胸甲",80);}
}
代码运行结果:
【this关键字】
this代表其所在函数所属对象的引用。谁调用this所在函数,this就代表哪个对象。
在类内部,成员间的调用都是由对象来完成的。只不过平时定义的时候,省略了"this."。通过this可以区别成员变量和局部变量。
当定义类中的功能时,该函数内如果需要使用到调用该函数的对象时,用this来表示该对象。
如果本类功能内部使用到本类对象时,都用this表示。
this可用于在构造函数间进行互相调用("内部语言":this语句)。this语句只能定义在构造函数的第一行。因为初始化动作要先执行。
黑马程序员_Java基础Day05_面向对象之封装(Done)相关推荐
- 黑马程序员_java基础笔记(03)...面向对象
1:面向对象的概念,2 : 类和对象的关系,3 : 封装,4 : 构造函数,5 : this关键字,6 : static关键字, 7 : 单例设计模式,8 : 继承,9 : 抽象类,10 : 接口,1 ...
- 黑马程序员_Java基础面向对象
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
- 黑马程序员_java基础笔记(15)...银行业务调度系统_编码思路及代码
---------- ASP.Net+Android+IOS开发..Net培训.期待与您交流!---------- 1,面试题目:银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内 ...
- 黑马程序员_java基础笔记(06)...集合
---------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------- JavaApi(其实就是java给我们提供的已经定义好的对象.工具对象:集合框架) ...
- 黑马程序员_Java基础_前期准备02-1
---------------------------------------- JavaEE+云物联.期待与您交流!----------------------------------------- ...
- 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式
GUI(Graphical User Interface)(图形用户接口):用图形的方式,来 显示计算机操作的界面,这样更方便更直观 CLI(Conmand line User Interface)( ...
- 黑马程序员_Java基础_this,super,static,final关键字
一,this关键字 1,当成员变量和局部变量重名时,可以使用this关键字来区分. this关键字代表的是本类对象,this一般是在一个函数中,哪个对象在调用this所在的函数,this就代表哪个对象 ...
- 黑马程序员_Java基础[16]_多态1
---------- android培训 . java培训 .期待与您交流! ---------- [[多态]] instanceof 定义:某一种事物的多种存在形态 [[instanceof 关 ...
- 黑马程序员_Java基础GUI
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
最新文章
- 微信小程序学习Course 8 本地缓存API
- 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
- Delphi 2009 新增单元 Character[2]: IsLetter、IsUpper、IsLower、IsDigit、IsNumber
- PIE SDK影像坏线修复
- POJ 3280 Cheapest Palindrome(DP 回文变形)
- PCB task_struct 数据结构 (转:http://blog.csdn.net/jurrah/article/details/3965437)
- P5135-painting【组合数学】
- LeetCode 478. 在圆内随机生成点(概率)
- rebuild myself rebuild my world
- 区块链必读的书_最好的区块链:5条必读
- Unity Android 动态更新 Assembly-CSharp.dll
- Hibdernate入门
- 【web素材】04—40款个人主页简历网页模板及企业单页
- 宝塔面板无法安装php,宝塔面板安装php失败
- mysql清理碎片_清除MySQL表空间碎片详细方法
- 无法访问Windows7默认共享的解决方法
- netbeans java中文_NetBeans添加中文javadoc
- idea 内存溢出问题
- Shiro介绍(四):定义自己的安全域Realm
- 38. 字符串的排列
热门文章
- 亚马逊 work hard, have fun, make history
- Android Studio-个推-实现简单聊天(三)
- 超好用的Android高亮引导库
- java抓取并保存图片_利用JAVA抓取网站的所有图片并保存于本地
- 帮我写个定时抢票软件
- Matlab Robotics project 1 phase 1 <Experiment Recording>
- 《数字经济全景白皮书》中国银行业场景金融生态建设分析2022 发布
- el-tree自定义节点内容使用svg和文本
- 16.网络爬虫—字体反爬(实战演示)
- 数据可视化实战:数据处理