黑马程序员_Java面向对象1_封装

时间:2023-01-28 03:44:09

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、特点:

  1. 函数名与类名相同。
  2. 不用定义返回值类型。
  3. 不可以写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等关键字
    • 主函数是静态的

实例变量和类变量的区别:

  1. 存放位置:
    1. 类变量随着累的加载而存在于方法区中。
    2. 实例变量随着对象的建立而存放在堆内存中。
  2. 生命周期:
    1. 类变量生命周期最长,随着类的消失而消失。
    2. 实例变量的生命周期随着对象的消失而消失。

静态有利有弊:利:对对象的共享数据单独空间进行存储,节省空间,没有必要对每一个对象都存储一份,可以直接被类名调用。弊端:生命周期过长。访问出现局限,只能访问静态。

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的对象使用这些工具方法,对数组进行操作。发现了以下问题:

  1. 对象是用于封装数据的,可是ArrayTool对象并未封装特有数据。
  2. 操作数组的每一个方法都没有用到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)

该句话都做了些什么?

  1. 因为new用到了Person.class文件,所以会先找到Person.class文件并加载到内存中。
  2. 执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
  3. 在堆内存中开辟空间,分配内存地址。
  4. 在堆内存中建立对象的特有属性,并进行默认初始化。
  5. 对属性进行显示初始化。
  6. 对对象进行构造代码块初始化。
  7. 对对象进行对应的构造函数初始化。
  8. 将内存地址付给栈内存中的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种设计模式。

单例设计模式:解决一个类在内存中值存在一个对象。

想要保证对象唯一。

  1. 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
  2. 还为了让其他程序可以访问到该类对象,在本类中自定义一个对象。
  3. 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

这三步怎样用代码去体现呢?

  1. 将构造函数私有化。
  2. 在类中创建一个本类对象。
  3. 提供一个方法可以获取到该对象。

对于事物该怎么描述还怎么描述。对需要将该事物的对象保证在内存中的唯一时,就将以上的三步加上即可。

  • 饿汉式:对象先初始化,Single类一进内存,就已经创建好了对象。(s = new single)定义单例,建议使用饿汉式。
  • 懒汉式:对象式方法被调用时,才初始化的。也叫做对象的延时加载。Signle类进内存,对象还没有存在。只有调用了getInstance方法时,才建立对象。(s = null) 缺点:当多个程序同时调用时会创建多个对象,不能保证对象的唯一性。

黑马程序员_Java面向对象1_封装的更多相关文章

  1. 黑马程序员_Java面向对象_异常

    6.异常 1.异常: 就是程序在运行时出现不正常的情况.问题也是现实生活中一个具体的事物,也可以通过Java的类进行描述,并封装成对象.Exception和Error的子类名都是以父类名作为后缀名. ...

  2. 黑马程序员_Java面向对象_内部类

    6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...

  3. 黑马程序员_Java面向对象3_多态

    5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...

  4. 黑马程序员_Java面向对象2_继承

    4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...

  5. 黑马程序员_Java面向对象_包

    7.包 7.1包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称是:包名.类名. 包也是一种封装形式. 利用命令行自动生成文件夹格式:D:\jav ...

  6. 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表

    \day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...

  7. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

  8. 黑马程序员_Java基础组成

    Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...

  9. 黑马程序员_Java泛型

    泛型 概述: ClassCaseException:类型转换异常. 代码中不加泛型,编译没问题,运行可能会发生异常.但是用户解决不了,这样程序就存在安全隐患.所以我们希望在编译时期就能看出问题,程序员 ...

随机推荐

  1. android内部培训视频_第四节(1)_异步网络操作

    第四节(1):异步网络操作  一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...

  2. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  3. 48种CIFilter

    48种CIFilter     CIAdditionCompositing     //影像合成 CIAffineTransform           //仿射变换 CICheckerboardGe ...

  4. nutch Fetcer阶段详解

    job.setSpeculativeExecution(false); 抓网页阶段,不允许同一个任务运行多次,否则,网页就抓重了 为了充分利用闲置资源,加快map 和 reduce 的执行,于是有Sp ...

  5. JVM最多支持多少个线程?

    JVM最多支持多少个线程? McGovernTheory在*提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Edd ...

  6. python----------装饰器应用练习

    1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码注意:从文件中读出字符串形式的字典,可以用eval('{"name& ...

  7. 使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式

    class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...

  8. EF实现批量插入

    Z.EntityFramework.BulkInsert EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而 ...

  9. vue关闭代码检查eslint

    confing/index.js 文件里面的 useEslint 改成false就可以关闭代码检查了   不过为了代码的规范性,不建议关闭!

  10. ubuntu 语言设置

    1.ubuntu ibus 输入法无法切换拼音 原因未安装中文输入法 sudo apt install ibus-pinyin //安装pinyinwin + space(空格) 切换中文输入法 再用 ...