3.面向对象_封装
3.1面向对象概念
3.1.1理解面向对象
- 面向对象是相对面向过程而言
- 面向对象和面向过程都是一种思想
- 面向过程:强调的是功能行为(执行者)
- 面向对象:将功能封装进对象,强调具备了功能的对象(指挥者)
- 面向对象是基于面向过程的
3.1.2面向对象的特点
- 面向对象三个特征:封装,继承,多态。
- 以后开发:其实就是找对象使用,没有对象就创建一个对象。
- 找对象,建立对象,使用对象,维护对象的关系。
3.2类与对象的关系
3.2.1 类与对象
- 类和对象的关系:类就是对现实生活中事物的描述。对象就是这类事物实实在在存在的个体(通过new操作符所产生的一个实体,这个实体在堆内存当中)。
- 映射到Java中,描述就是class定义的类
- 具体对象就是对应Java在堆内存中用new建立实体。
- 属性对应是类中的变量,行为对应的类中函数(方法)。
- 其实定义类就是在描述事物,就是在定义属性和行为。,属性和行为共同成为类中的成员(成员变量和成员方法)。
- car c = new car();//c就是一个类类型变量。记住类类型变量指向对象。
- 指挥对象:在Java智慧方式是:对象.对象成员()//c.color = "blue";c.run();
3.2.2 成员变量和局部变量
- 成员变量作用于整个类中,局部变量作用于函数中,或者语句中。
- 在内存中的位置:成员变量在对堆内存中,局部变量在栈内存中。
3.2.3 匿名对象
匿名对象是对象的简化形式。(凡是简化的都有局限性,例如三元运算符。)
匿名对象两种使用情况:
- 当对对象方法仅进行一次调用时。//new car().num = 5;如果对一个对象进行多个成员调用,必须给这个对象进行起个名字。
- 匿名对象可以作为实际参数进行传递。//show(new Car());
3.3封装
- 封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 好处:
- 将变化隔离。
- 便于使用。
- 提高重用性。
- 提高安全性。
- 封装原则:
- 将不需要对外提供的内容都隐藏起来。
- 把属性都隐藏,提供公共方式对其访问。(直接访问会造成安全隐患//age=-20)
private关键字
- 私有,权限修饰符,用于修饰类中得成员变量和成员函数,私有只在本类中有效。
- 将属性私有化以后,类以外即使建立了对象也不能进行访问,就在本类中提供对外的访问方式,通常是set和get两种。
- 凡是set的返回值类型都是void,并带参数。get类型与返回值一致,不带参数。
- 注意:私有仅仅是封装的一种变现形式。
- 之所以对外提供访问方式,是因为可以在访问方式中添加逻辑判断等语句,对访问的数据进行操作提高代码的健壮性。
3.4构造函数
1、特点:
- 函数名与类名相同。
- 不用定义返回值类型。
- 不可以写return语句。(void是一种返回值类型,代表没有具体结果返回。)
2、作用:对象一建立就会调用与之对应的构造函数,给对象进行初始化。
3、注意:1、默认构造函数的特点 2、多个构造函数是以重载的形式存在的
4、构造函数的小细节:当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。
5、构造函数和一般函数在写法上有不同。在运行上也有不同:构造函数是在对象一建立就运行,给对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。一个对象建立,构造函数只运行一次。而一般方法可以被对象调用多次。
6、什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
7、构造代码块作用:给对象进行初始化,对象一建立就运行,而且优先于构造函数执行。//"{ }"什么都没有,就一大括号。构造代码块中定义的是不同对象共性的初始化内容。
8、构造函数和构造代码块的区别:构造代码块是给所有对象进行初始化,构造函数是给对应对象进行初始化。
9、构造函数是可以被私有化的,一旦一个类中所有构造函数被私有化,就代表这个类不可能被创建对象。因为构造函数不能被初始化。
3.5this关键字
1、this是用于区*部变量和成员变量同名的情况。
2、this代表她所在函数所属对象的引用,哪个对象在调用this所在的函数,this就代表哪个函数。
3、应用:当定义类中功能时,该函数内部要用到调用该函数对象时,这时用this来表示这个对象。
4、this关键字在构造函数间调用//this.name = name this(name)=new person(name)
5、this语句只能定义在构造函数的第一行。//this();因为初始化要先执行,
3.6static(静态)关键字
3.6.1 static
- static关键字
- 是一个修饰符,用于修饰成员(成员变量(类变量)和成员函数)
- 被修饰后的成员具备以下特点
- 随着类的加载而加载(静态会随着类的消失而消失,生命周期最长)
- 优先于对象存在(存在方法区、共享区、数据区)
- 被所有对象所共享
- 可以直接被类名调用(类名.静态成员)
- 使用注意
- 静态方法只能访问静态成员
- 静态方法中不可以写this、super等关键字
- 主函数是静态的
实例变量和类变量的区别:
- 存放位置:
- 类变量随着累的加载而存在于方法区中。
- 实例变量随着对象的建立而存放在堆内存中。
- 生命周期:
- 类变量生命周期最长,随着类的消失而消失。
- 实例变量的生命周期随着对象的消失而消失。
静态有利有弊:利:对对象的共享数据单独空间进行存储,节省空间,没有必要对每一个对象都存储一份,可以直接被类名调用。弊端:生命周期过长。访问出现局限,只能访问静态。
3.6.2 主函数:public staitic void main (String [] args)
主函数是一个特殊的函数,作为程序的入口,是固定格式的,可以被jvm调用。
主函数的特点:
- public:代表着该函数访问权限是最大的。
- static:代表着主函数随着类的加载就已经存在了。
- void:主函数没有具体的返回值。
- main:不是关键字,是一个特殊的单词,被jvm识别。
- (String [] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
- jvm在调用主函数时,传入的是new String [0]
- D:\java0217\day06\java MainDemo haha hehe heihei//往主函数传进三个参数。
3.6.3 静态什么时候使用
要从两方面下手:因为静态修饰的有成员变量和成员函数。
什么时候定义静态变量?
当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据定义成非静态存在于堆内存中。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
静态的应用:每一个程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
虽然可以通过ArrayTool的对象使用这些工具方法,对数组进行操作。发现了以下问题:
- 对象是用于封装数据的,可是ArrayTool对象并未封装特有数据。
- 操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。
这时就考虑,让程序更严谨,是不需要对象的。可以将ArrayTool中的方法都定义成static的,直接通过类名调用即可。
将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象的。为了更严谨,强制该类不能建立对象。可以通过将构造函数私有化完成。//private ArrayTool(){}
3.6.4 帮助文档得制作javadoc
接下来,把javadoc.class文件发送给别其他人,其他人只要将该文件设置到classpath路径下就可以使用该工具类,但是该类中到底定义了多少个方法,对方却不清楚,因为没有使用说明书。
开始制作程序的说明书,java的使用说明书由注释来完成。/**这是一个对数组进行操作的工具类。*/
- @auther 张三
- @version v1.1
凡是用public修饰符修饰的功能都用文档注释,都可以被文档注释所提取。/**获取一个整形数组中的最大值。@param arr 接受的是一个int类型的数组 @return 会返回一个该数组中的最大值。*/
格式:javadoc -d myhelp -auther -version (-d:目录的意思 myhelp:有就入没就建一个 -authe:作者 -version:版本)注意:类必须是public修饰符修饰,权限要足够大。
默认构造函数的权限是随着类的变化而变化的(注意不写才是默认的构造函数!!)
API(application program interface 应用程序接口)
3.6.5 静态代码块
格式: static{静态代码块得执行语句。}
特点:随着类的加载而执行,只执行一次,并优先于主函数,用于给类进行初始化的。(只有用到类中的内容类才会被加载。)
静态代码块(给类进行初始化的)-->构造代码块(给对象进行初始化的)-->构造函数(给对应对象进行初始化的)
3.7 对象的初始化过程
3.7.1person p = new person("zhangdan",20)
该句话都做了些什么?
- 因为new用到了Person.class文件,所以会先找到Person.class文件并加载到内存中。
- 执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
- 在堆内存中开辟空间,分配内存地址。
- 在堆内存中建立对象的特有属性,并进行默认初始化。
- 对属性进行显示初始化。
- 对对象进行构造代码块初始化。
- 对对象进行对应的构造函数初始化。
- 将内存地址付给栈内存中的p变量。
3.7.2对象调用成员过程p.setname("lisi")
栈里面会先开辟主函数的空间p,对内存里new了一个对象实体,把内存地址值传给p,p.setname会在栈内存中开辟局部变量name的空间,每一个非静态的方法都有自己所属,为this的引用,方法被p调用,所以this的值为p的值,“lisi"就付给p对象的name。
- 非静态前面省略的是(this.),静态前面省略的是(类名.)。
3.7单例设计模式
设计模式:解决某一问题最行之有效的方法。Java中有23种设计模式。
单例设计模式:解决一个类在内存中值存在一个对象。
想要保证对象唯一。
- 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
- 还为了让其他程序可以访问到该类对象,在本类中自定义一个对象。
- 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
这三步怎样用代码去体现呢?
- 将构造函数私有化。
- 在类中创建一个本类对象。
- 提供一个方法可以获取到该对象。
对于事物该怎么描述还怎么描述。对需要将该事物的对象保证在内存中的唯一时,就将以上的三步加上即可。
- 饿汉式:对象先初始化,Single类一进内存,就已经创建好了对象。(s = new single)定义单例,建议使用饿汉式。
- 懒汉式:对象式方法被调用时,才初始化的。也叫做对象的延时加载。Signle类进内存,对象还没有存在。只有调用了getInstance方法时,才建立对象。(s = null) 缺点:当多个程序同时调用时会创建多个对象,不能保证对象的唯一性。
、
黑马程序员_Java面向对象1_封装的更多相关文章
-
黑马程序员_Java面向对象_异常
6.异常 1.异常: 就是程序在运行时出现不正常的情况.问题也是现实生活中一个具体的事物,也可以通过Java的类进行描述,并封装成对象.Exception和Error的子类名都是以父类名作为后缀名. ...
-
黑马程序员_Java面向对象_内部类
6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...
-
黑马程序员_Java面向对象3_多态
5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...
-
黑马程序员_Java面向对象2_继承
4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...
-
黑马程序员_Java面向对象_包
7.包 7.1包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称是:包名.类名. 包也是一种封装形式. 利用命令行自动生成文件夹格式:D:\jav ...
-
黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
\day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...
-
黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
-
黑马程序员_Java基础组成
Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...
-
黑马程序员_Java泛型
泛型 概述: ClassCaseException:类型转换异常. 代码中不加泛型,编译没问题,运行可能会发生异常.但是用户解决不了,这样程序就存在安全隐患.所以我们希望在编译时期就能看出问题,程序员 ...
随机推荐
-
android内部培训视频_第四节(1)_异步网络操作
第四节(1):异步网络操作 一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...
-
wifi基础知识整理
转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...
-
48种CIFilter
48种CIFilter CIAdditionCompositing //影像合成 CIAffineTransform //仿射变换 CICheckerboardGe ...
-
nutch Fetcer阶段详解
job.setSpeculativeExecution(false); 抓网页阶段,不允许同一个任务运行多次,否则,网页就抓重了 为了充分利用闲置资源,加快map 和 reduce 的执行,于是有Sp ...
-
JVM最多支持多少个线程?
JVM最多支持多少个线程? McGovernTheory在*提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Edd ...
-
python----------装饰器应用练习
1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码注意:从文件中读出字符串形式的字典,可以用eval('{"name& ...
-
使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式
class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...
-
EF实现批量插入
Z.EntityFramework.BulkInsert EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而 ...
-
vue关闭代码检查eslint
confing/index.js 文件里面的 useEslint 改成false就可以关闭代码检查了 不过为了代码的规范性,不建议关闭!
-
ubuntu 语言设置
1.ubuntu ibus 输入法无法切换拼音 原因未安装中文输入法 sudo apt install ibus-pinyin //安装pinyinwin + space(空格) 切换中文输入法 再用 ...