黑马程序员技术交流社区

标题: 技术帖 [打印本页]

作者: 我裂开了你呢    时间: 2019-8-21 16:20
标题: 技术帖
       技术的学习
   其实面向对象算是Java最核心的东西,以前在学校的时候就常常听老师说,很多从事很多年开发的工程师也没有完全弄明白到底什么是面相对象,
而短短的几天的学习,我就接触到了面向对象,也就是java最核心的东西。听过老师的悉心的教导,我也总结出了一些我认为的所谓的面向对象的东西
,虽然不一定是完全对的,但是我也希望能够分享出来跟大家交流,互相探讨学习,指正批评。
   1. 类和对象
生活中所有的内容和事物,都可以用一个名词概括:东西
在Java中,所有的内容和事物,也都可以用一个名词概括:对象。       
        万物皆对象。
       

生活中                                        Java中
类别/种类                                类        -        class
东西(具体的某个东西)        对象        -        Object
属性:有什么参数                成员变量
行为:能干什么                        成员方法

生活中:类别和东西的关系
        类别是东西的抽象        //界门纲目科属种
        东西是类别的实体


Java中:类和对象的关系
        类是对象的抽象
        对象是类的实体
       
类的特点:
        类是具有相同属性和行为的一类事物的集合/抽象。
        类是对象的数据类型
        eg:int        1
                人        张三
               
               
               
面向对象
        面向对象是一种思想,一种解决问题的思路
        面向过程:只关注解决问题的过程,而不关注多个解决方法之间的关系等
        面向对象:在寻找解决方案前,先找对象(能解决我问题的对象),让对象来帮我拿出解决方案
       
        面向过程:关注的是解决问题的具体思路
        面向对象:关注的是能解决该类问题的对象
       
       
               
2. 类的定义之成员变量和成员方法
        事物都有固有的属性,在Java中称之为成员变量,定义在类里面方法外面(局部变量定义在方法里面)
        事物都有一些行为,在Java中称之为成员方法,成员方法没有static关键字修饰
        类定义的格式:
        public class 类名{
                成员变量;
                数据类型 成员变量名1;
                数据类型 成员变量名2;
               
               
                成员方法(没有static关键修饰的方法,其他与之前方法的定义格式都一样):
                public 返回值类型 成员方法名1(){……}
                public 返回值类型 成员方法名2(){……}
        }
       
       
        大驼峰(类):第一个单词首字母大写,后面的每个单词首也字母大写
        小驼峰(方法、变量):第一个单词首字母小写,后面的每个单词首也字母大写

       
3. 对象/类的使用
        需要定义一个测试类,测试类中有main方法(程序的入口),
        在main方法中通过创建被测试类的对象来使用其成员变量和成员方法。
       
        对象创建格式:
                类名 变量名/对象名 = new 类名();
                Scanner sc = new Scanner(System.in);
                Random r = new Random();
                Phone p = new Phone();
               
        成员的使用方法:
                对象名.成员(成员变量和成员方法)
                sc.nextInt();                --调用Scanner的成员方法
                r.nextInt();                --调用Random的成员方法
               
       
                Phone p = new Phone();
                p.brand = "华为";                //成员变量的使用
               
               
4. 对象的内存图
        直接打印对象,打印的是对象的地址值
                System.out.println(s);        //com.itheima_03.Student@f6d7a8
               
                [I@a9d2c4
                        [        数组
                        [[        二维数组
                        I         数组中元素类型(如果是引用数据类型,前面会加一个L,然后类型是完整的类型名<包含包名和类型>)
                        9d2c4        内存中地址值(16进制的hash值)
               
                com.itheima_03.Student@f6d7a8
                        com.itheima_03.Student         完整的类型名(完整的类名<包名和类名>)
                        f6d7a8        内存中地址值(16进制的hash值)
                       
                       
                对象的引用        存在栈内存中,其值是所指向对象的地址值(对象引用就是指向该对象的变量)
                对象本身        存在堆内存中,对象中成员变量的值有默认初始化值
                                        int        0
                                        String        null
                                       
                main方法执行的时候首先进栈,main方法中调用的其他方法,被调用的时候进栈,调用结束后就弹栈(结束)。
               
                多个对象的成员方法相同,但是成员变量却独立拥有。
               
               
                结论:
                        多个引用指向同一个对象,通过任何一个引用修改对象内容/值,其他引用对应内容或值会同时发生改变。
                       
                       

                                引用个数        对象个数       
        情况一                1                        1                        一个引用指向一个对象,通过引用可以修改/使用对象
        情况二                2                        2                        两个引用分别指向了自己的对象,通过每个引用只能
                                                                                修改自己指向的对象,不会影响另外一个对象
        情况三                2                        1                        两个引用指向了同一个对象,可以理解成为
                                                                                该对象起了两个名字,任意一个名字就可以直接修改/使用对象。
                                                                                对象被修改后,通过任意一个名字读取该对象,结果值都是修改过的。
                                                                                       
5. 成员变量和局部变量的区别
        成员变量:定义在类中方法外的变量
        局部变量:定义在方法内或者方法声明上的变量
       
        区别:                                成员变量                                局部变量
                定义位置                见上
                内存中位置                堆内存中                                栈内存中
                初始化值                有默认初始化值                        没有默认初始化值,必须先定义、赋值后,才能使用
                生命周期                随着对象的创建而创建        随着方法的调用(进栈)而创建
                                                随着对象的消失而消失        随着方法的调用结束(弹栈)而消失
                                               
                                               
       
        成员的定义没有顺序,因为执行顺序由调用的顺序决定。
       
6. private
        是一个访问权限修饰符
        能修饰成员(成员变量和成员方法)
        作用:保护成员不被外界直接访问。被private修饰的成员只能在本类中被直接访问
                其他类中想要使用该程序员,就需要通过制定的方法来使用
               
        设置值:public void set变量(形式参数){}        通过该方法设置成员变量的值
        获取值:public 返回值类型 get变量()                通过该方法可以获取成员变量的值
       
        为了安全起见,我们可以在set方法中(setter)进行判断限定
        但是,一般不建议这样做:
                javabean - 实体类        实体类一般只包含基本的成员变量和变量的getter/setter,
                        这里的setter和getter最好是标准的,没有任何修改的。
                -30的年龄是属于业务逻辑问题,就业务逻辑层做判断排除,实体类一般用作实例化对象并且存储该对象的数据
               
               
        编码思想:
                高内聚,低耦合
                一个方法只干一件事
                age        设置age --setAge(int a)          == s.name = 10
                        获取age值 --int getAge()  == s.name
                       
                       
                       
        实体类外获取|设置实体类成员变量的方式
                第一种(成员变量的访问权限修饰符不能是private)
                        设置 s.name = 值
                        获取 s.name
                       
                第二种(成员变量被private修饰后,因为被private修饰后,外界不能直接访问该成员)
                        设置s.setName(值)
                        获取 s.getName()
                        这种方式是java推荐的,建议重点掌握
                       
                第三种(非标准类成分,只能获取不能设置)
                        show()       
                        根据自己的思路展示成员变量的值
                       
7. this关键字
        this用于指代成员变量
        当方法中局部变量和成员变量不重名时,不需要使用this
        当方法中局部变量和成员变量重名时,需要在成员变量前面添加this关键字。解决的是局部变量隐藏成员变量的问题,没有该问题也可以使用this,但是没有意义。
       
        this代表的是当前对象
                谁调用当前方法,当前方法内的this只得就是谁。
               
8. 封装
        面向对象三大特征:封装、继承、多态
       
        封装的原则:
                将成员变量私有化,避免外部程序直接访问,可以通过指定的公共方法访问(getter、setter)
        封装的好处:
                成员变量不能被直接访问,提高了代码的安全性
                使用方法进行操作,提高了代码的复用性
               
        以上是我对面向对象以及他的特征的基本总结。欢迎大家指正批评!
       






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2