封装

来源:互联网 发布:画蜡烛图 软件 编辑:程序博客网 时间:2024/04/28 10:54
1、面向对象
       举例   大象装进冰箱
       面向过程   存储大象 打开冰箱  关上冰箱
       面向对象    冰箱打开  冰箱存储  冰箱关闭
       对于面向过程思想,强调的是过程(动作)。
       对于面向对象思想,强调的是对象(实体)。
       自己举例  
       假如你开了一个店,你每天必须负责与顾客的交流,推销你的产品让顾客接收,然后收银,当夜晚关店,直到明天开门营业,由于生意不错你想多开几家类似的店,但是你一个人也忙不过来,这时你可以考虑到,找人帮你看店,你让这个人每月完成多少的任务量,不然走人。你只负责店里面的收入与每月的发放工资。此时你有执行者变成指挥者,你招聘就体现了面向对象的思想,而员工如何完成他们的任务量跟你没有任何关系,只是每个月完成你规定的任务量,至于怎么完成你没有必要知道,此时就是封装。
       其实一个函数就是最小的封装体。

2、面向对象的特点
        面向对象就是一种常见的思想,符合人们的思考习惯。
       面向对象的出现,将复杂的问题简单化;
       面向对象的出现,让曾经的过程中的执行者,变成了对象中的指挥者。
       有对象调用对象,没对象创建对象,并且后期维护对象之间的关系。

3、类与对象
       类:用java语言对现实生活中事物的描述,通常只关注两方面,一个是属性,一个是行为,只要明确该事物的属性和行为并定义在类中即可。
       对象就是类这种事物实实在在存在的个体。
       定义类其实就是定义类中的成员。
       成员:成员变量-----属性, 成员函数------行为。


4、对象的内存分布


       成员变量与局部变量的区别
       1、成员变量定义在类中,整个类都可以访问,而局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
       2、成员变量存在与堆内存的对象中,局部变量存在与栈内存的方法中
       3、成员变量随着对象的创建而存在随着对象的消失而消失,局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
       4 、成员变量都有默认的初始化值,局部变量没有默认的初始化值。
       注意:如果成员变量如局部变量同名,则优先使用局部变量,一个方法进栈,先在自己里面找当前的变量,如果没有,再去调用对象中去找。


5、匿名对象
       没有名字的对象,其实就是定义对象的简写格式。当对象对方法仅进行一次调用的时候,尽可以简化匿名的对象,匿名对象可以作为实际参数进行传递。

6.基本数据类型与引用数据类型



7、封装(Encapsulation)
       封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
       好处:将变化隔离,便于使用,提高重用性,提高安全性。
       原则: 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
        private:私有,是一个权限修饰符,用于修饰成员,私有的内容只在本类中有效  .将成员变量私有化,对外提供对应的set ,get方法对其进行访问。提高对数据访问的安全性。
        注意:私有仅仅是封装的一种体现而已。函数就是一个最小的封装体。


8、构造函数(Constructor)
       函数名和类名相同。没有返回值类型。注意:没有返回值类型不等同于void,void也是一种返回值类型。用于给对象初始化。
       如果一个类没有定义构造函数,系统会有一个默认的空参数的构造函数,如果定义了一个 指定的构造函数,默认的就不存在了。

        构造函数中可以有return, 但是不常用,因为构造函数是给对象初始化的,在用户输入时对数据进行校验 。


9、构造函数与一般函数的区别
        对象创建时,就会调用与之对应的构造函数,给对象进行初始化,只调用一次。而一般函数在对象需要此功能时才调用,可以多次调用。在描述事物时,事物已具备一些内容,这些都定义在构造函数中,可以有多个构造函数,用于给不同对象的初始化,以重装的形式体现的。
       构造函数没有返回值,为什么不用void?
       没有返回值类型不等同于void,void也是一种返回值类型。当你不知道这个函数要返回什么时,可以用void代替。
       构造函数已经初始化了对象?为什么还要set方法?
       因为对象在初始化的时候只能初始化一次,如果后天要修改某些属性,但是类中的属性有私有了不能直接的访问,这个时候我们可以通过set方法间接的访问。
       private的作用?
       用private修饰只能在一个类中访问,这个是一个权限的问题,不然不能访问,只有通过此类的共有方法,间接的访问类中的属性和private的方法。类如何被私有了,这个类不为人知,别人不可能用它(不知道怎么使用它),但是内部可以被private修饰,此时类是一个成员。
       一般函数不能直接调用构造函数?
       构造函数给对象初始化的,如一般函数调用构造函数,必须先有对象才行。因为对象可以调用构造函数。(但是构造函数可以调用构造函数,因为都是给对象初始化的。)


10、this关键字
       当成员变量和局部变量重名,可以用关键字this来区分。This代表对象,代表当前的对象,既所在函数所属的那个对象的引用,谁调用所在的函数,this就代表那个对象。
       this也可以用于在构造函数中调用其他的构造函数。只能定义在构造函数的第一行,因为初始化动作要先执行。如果将this()定义在后面,第一次初始化之后,有调用构造函数,将前面的结果覆盖了。
       一个类中函数之间的相互调用,其实省略了this。


11、static关键字
       static 是一个修饰符,用于修饰成员,static修饰的成员被所有的对象所共享,优于对象的存在,它是随着类的加载而存在。可以被类名.静态的成员调用。
       成员变量与静态变量的区别
       生命周期不同。 静态变量随着类的加载而存在,类的消失而灭亡。就是虚拟机的结束,而成员变量随着对象的加载而存在,对象的消失而消亡。
        静态变量可以被类名访问,也可以被对象访问,但成员变量只能被对象访问。
       静态变量存在方法区中,对象的共有数据,而成员变量存储在堆中,对象的特有数据。
       静态变量相当于类变量,成员变量就是实体的变量。
       注意事项;
       静态只能访问静态(非静态可以访问静态和非静态),因为静态随着类的加载而加载,优先于对象。
       不可以使用this和super,因为静态随着类的加载而加载。不需要对象。

12、静态代码块
       随着类的加载而执行,而且执行一次,给类进行初始化。
       不是所有的对象都是通过构造函数初始化的,静态代码快也可以初始化。如下:
       static {num=10,num*=3,……}
       static  int  num=10;只能做一次动作。
       类的代码块 {……},给所以的对象初始化,而构造函数是给对应的对象初始化,类的代码块(通用性),构造函数(针对性)
       如果我们有一段代码想在别人使用某个类的时候就运行, 而且只运行一次, 那么就可以写在静态代码块中.

13、主函数
       格式是固定的
       被Jvm锁识别和调用。
       Public  :权限必须是最大的
       Static :不需要对象的,直接用主函数所属类名调用即可。
       Void:  主函数没有具体的返回值。
       Main:函数名,不是关键字,只是一个Jvm识别的固定格式。
       String [] args:这是主函数的参数列表,是一个数组的形式。

14、静态什么时候用?
       静态变量
       当分析对象中所具备的成员变量的值都是相同时,这时这个成员就可以被静态修饰,只要数据在对象中不同的,就是对象的特有数据,对象不需要做修改,只需使用即可,不需要存储在对象中,定义成静态。
       静态函数
       函数是否用静态修饰,就参考一点,就是该功能是否有访问到对象中的特有数据,简单说就是,从源代码看,该功能是否访问非静态的成员变量,如果需要,该功能就是非静态的,不需要,就可以将该功能定义成静态,当然,也可以定义成非静态,但是非静态需要被对象调用,而仅仅创建对象调用非静态的,但是没有访问特有数据的方法,该对象的创建是没有意义的。
       如果一个方法不用访问非静态成员,那么就可以定义为静态的,这样使用者就不需要创建对象,直接用类名调用。静态方法通常是作为工具方法或者一个可以产生对象的方法被声明,目的是为了让调用者更方便的使用,不必创建对象。

15、单态设计模式(SingletonPattern)
       设计模式
       在编程过程中我们经常会遇到一些典型的问题或需要完成某种特定需求,而这些问题和需求前人也曾经遇到过,他们经过大量理论总结和实践验证之后优选出的代码结构、编程风格、以及解决问题的思考方式,这就是设计模式(Design pattern)。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。
       单态设计模式
       单态设计模式(Singleton pattern)就是要保证在整个程序中某个类只能存在一个对象,这个类不能再创建第二个对象。

       两种设计模式的代码:
       饿汉式(加载类就有对象)


       饿汉式(先判断对象是否存在,不在创建,在直接使用)

       从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,使用的场合根据具体环境和个人习惯吧