• 一脚踩进java之基础篇12——面向对象


    一、面向过程和面向对象

    1.1 面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

      1) 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。

      例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。

      2)  面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

      例如,公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

    1.2 面向对象的好处

      通过生活中的真实场景使用面向对象分析完之后,我们开始分析面向过程和面向对象的差异做出总结:

      1) 面向对象思维方式是一种更符合人们思考习惯的思想

      2) 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。

      3)  面向对象思维方式将复杂的问题简单化。

    二、类与对象

    2.1 定义类

      1)定义类的格式

    public class 类名 {
        //可编写0至n个属性
        数据类型 变量名1;
        数据类型 变量名2;
        
        //可编写0至n个方法
        修饰符 返回值类型 方法名(参数){
            执行语句;
    }
    }

      2) 定义汽车类

    public class Car {
        String color;
        int number;
    
        void run() {
            System.out.println(color + ":" + number);
        }
    }

      通过代码的描述,知道类的真正意义就是在描述事物。属性和功能统称为事物中的成员。

      事物的成员分为两种:成员属性和成员功能。

        成员属性在代码中的体现就是成员变量

        成员功能在代码中的体现就是成员方法

      3) 测试类

    public class CarDemo {
        public static void main(String[] args) { 
            /*
             *  测试:Car类中的run方法。
             */
            // 1,创建Car的对象。给对象起个名字。
            Car c = new Car();// c是类类型的变量。c指向了一个具体的Car类型的对象。
            // 2,通过已有的对象调用该对象的功能。格式:对象.对象成员;
            // 3,可以该对象的属性赋值。
            c.color = "red";
            c.number = 4;
            c.run();
        }
    }

    2.2 对象的内存图解

     2.3 类和对象的区别

      1)类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。接下来通过一个图例来抽象描述类与对象的关系,如下图所示。

     在上图中,可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。从上图中可以明显看出对象是根据类创建的,并且一个类可以对应多个对象。

    2.4 成员变量和局部变量

      1)区别一:定义的位置不同

      定义在类中的变量是成员变量

      定义在方法中或者{}语句里面的变量是局部变量

      2)区别二:在内存中的位置不同

      成员变量存储在对内存的对象中

      局部变量存储在栈内存的方法中

      3)区别三:声明周期不同

      成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失

      局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失

      4)区别四:初始化不同

      成员变量因为在堆内存中,所有默认的初始化值

      局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。

    三、封装

    3.1 封装,它也是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态。接下来我们具体学习封装。

      1)  封装表现:

        ①方法就是一个最基本封装体。

        ②类其实也是一个封装体。

      2)从以上两点得出结论,封装的好处:

        ①提高了代码的复用性。

        ②隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

        ③提高了安全性。

    3.2 封装举例

    机箱:

    一台电脑,它是由CPU、主板、显卡、内存、硬盘、电源等部件组长,其实我们将这些部件组装在一起就可以使用电脑了,但是发现这些部件都散落在外面,很容造成不安全因素,于是,使用机箱壳子,把这些部件都装在里面,并在机箱壳上留下一些插口等,若不留插口,大家想想会是什么情况。

    总结:机箱其实就是隐藏了办卡设备的细节,对外提供了插口以及开关等访问内部细节的方式。

    3.3 私有private

    描述人。Person

    属性:年龄。

    行为:说话:说出自己的年龄。

    class Person {
        int age;
        String name;
    
        public void show() {
            System.out.println("age=" + age + ",name" + name);
        }
    }
    
    public class PersonDemo {
        public static void main(String[] args) {
            // 创建Person对象
            Person p = new Person();
            p.age = -20; // 给Person对象赋值
            p.name = "人妖";
            p.show(); // 调用Person的show方法
        }
    }

    通过上述代码发现,虽然我们用Java代码把Person描述清楚了,但有个严重的问题,就是Person中的属性的行为可以任意访问和使用。这明显不符合实际需求。

    可是怎么才能不让访问呢?需要使用一个Java中的关键字也是一个修饰符 private(私有,权限修饰符)。只要将Person的属性和行为私有起来,这样就无法直接访问。

    class Person {
        private int age;
        private String name;
    
        public void show() {
            System.out.println("age=" + age + ",name" + name);
        }
    }

    年龄已被私有,错误的值无法赋值,可是正确的值也赋值不了,这样还是不行,那肿么办呢?按照之前所学习的封装的原理,隐藏后,还需要提供访问方式。只要对外提供可以访问的方法,让其他程序访问这些方法。同时在方法中可以对数据进行验证。

    一般对成员属性的访问动作:赋值(设置 set),取值(获取 get),因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。

    class Person {
        // 私有成员变量
        private int age;
        private String name;
    
        // 对外提供设置成员变量的方法
        public void setAge(int a) {
            // 由于是设置成员变量的值,这里可以加入数据的验证
            if (a < 0 || a > 130) {
                System.out.println(a + "不符合年龄的数据范围");
                return;
            }
            age = a; 
        }
    
        // 对外提供访问成员变量的方法
        public void getAge() {
            return age;
        }
    }

    总结:

    类中不需要对外提供的内容都私有化,包括属性和方法。

    以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。

    注意:私有仅仅是封装的体现形式而已

    3.4 this关键字

      1)成员变量和局部变量同名的问题

    当在方法中出现了局部变量和成员变量同名的时候,那么在方法中怎么区别局部变量成员变量呢?可以在成员变量名前面加上this.来区别成员变量和局部变量

    class Person {
        private int age;
        private String name;
        
        public void speak() {
            this.name = "小强";
            this.age = 18;
            System.out.println("name=" + this.name + ",age=" + this.age);
        }
    }
    
    class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person();
            p.speak();
        }
    }

    3.5 对象的内存解释

    class Person {
        private int age;
        public int getAge() {
            return this.age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    public class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person();
            p.setAge(30);
            System.out.println("大家好,今年我" + p.getAge() + "岁");
        }
    }

     程序执行流程说明:

    1、先执行main方法(压栈),执行其中的 Person p = new Person()

    2、在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量

    3、继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,将30赋值为setAge方法中的“age”变量;执行this.age = age语句,将age变量值30 赋值给成员变量this.age30

    4、setAge()方法执行完毕后(弹栈),回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。

    l  注意:

    n  this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。

    n  上述代码中的 p.setAge(30)语句中,setAge(int age)方法中的this代表的就是p对象。

    3.6 this的应用

    class Person {
        private int age;
        private String name;
        
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void speak() {
            System.out.println("name=" + this.name + ",age=" + this.age);
        }
    
        // 判断是否为同龄人
        public boolean equalsAge(Person p) {
            // 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
            // 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
            /*
             * if(this.age == p.age) { return true; } return false;
             */
            return this.age == p.age;
        }
    }
  • 相关阅读:
    理解WebKit和Chromium: Web应用和Web运行环境
    理解WebKit和Chromium: 网页渲染的基本过程
    【闲谈】我的大学
    使用GDAL将下载的Google卫星图像转为带坐标的tif
    Linux下使用GDAL进行开发(automake使用)
    Linux下编译GDAL
    【Unity技巧】统一管理回调函数——观察者模式
    【Unity技巧】使用单例模式Singleton
    【Unity插件】LitJson杂谈
    理解WebKit和Chromium:Chromium资源磁盘缓存
  • 原文地址:https://www.cnblogs.com/smilehq/p/12818742.html
Copyright © 2020-2023  润新知