zoukankan      html  css  js  c++  java
  • 黑马程序员第一阶段3.面向对象第5天

    -------------------- android培训java培训、期待与您交流!--------------------

    面向过程 
           在一个结构体中定义窗口的大小,位置,颜色,背景等属性,对窗口操作的函数与窗口本身的定义没有任何关系,如HideWindow,MoveWindow,MinimizeWindow,这些函数都需要接受一个代表要被操作的窗口参数,是一种谓语与宾语的关系 。


    面向对象
           定义窗口时,除了要指定在面向过程中规定的那些属性,如大小,位置,颜色,背景等外,还要指定该窗口可能具有的动作 ,如隐藏,移动,最小化等。这些函数被调用时,都是以某个窗口要隐藏,某个窗口要移动的语法格式来使用的 ,这是一种主语与谓语的关系。
    面向对象的三大特征

    • 封装  (Encapsulation)
    • 继承  (Inheritance)
    • 多态  (Polymorphism)

    类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。

    面向对象程序设计的重点是类的设计,而不是对象的设计。

    类的定义
         
    类可以将数据封装在一起,其中成员变量表示类的属性,成员方法表示类的行为。定义类就是要定义类的属性与行为。

    • class Person
      {
               int age;
               void shout()
               {
                        System.out.println(“oh,my god! I am “ + age);
               }
      }
      age是类的属性 ,也叫类成员变量 。
      shout是方法也叫类的成员函数。
      shout方法可以直接访问同一个类中的age变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。 

    象的产生
           
    Person p1 = new Person();     等号左边定义了一个Person类型的变量p1,右边用new关键字创建了一个Person类的实例(对象),p1就是这个对象的引用句柄,引用句柄是在栈内存中分配的,对象是在堆中分配的

    • Person p1 = new Person();执行完后的内存状态 
      图片

     成员变量的默认初始化

    • 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的都是变量类型都是引用类型的变量,如上面的Person及前面讲过的数组。
      成员变量可由系统自动初始化,而在方法定义的变量必须手动初始化。
      成员变量的默认初始化值表:
      ________________________________
      成员变量类型      |    初始值
      byte                            0
      short                           0
      int                               0
      long                            0L
      float                            0.0F
      double                        0.0D
      char                            '\u0000'(表示空)
      boolean                       false
      All reference type        Null
      ________________________________ 

    对象的生命周期 
    如果一个变量是用作指向一个数组或一个对象的句柄,那么这个变量的类型就是引用数据类型

    当没有引用变量指向某个对象时,这个对象就会变成垃圾,不能再被使用。

    图片

    图片

    图片

    “==”运算符与equals()方法的区别

    • ==是比较栈内存中的内容是否相等(也就是比较两个变量的值是否相等)
      equals是比较堆内存中的内容是否相等(也就是比较两个对象的内容是否相等)
      图片
       如上图中:str2==str1 结果为 false    str1=str3 结果为 true    str2.equals(str1) 结果为 true
      每个类中都有equals方法,是从object类继承来的。

      Sting字符串是对象

      数组是在堆内存中分配的,也可当成对象来看待。所以用==来比较两个数组是否相等是不对的,数组中没有equals方法,可用java.util.Arrays.equals(数组1,数组2)来比较两个数组。

    匿名对象

    • 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象, 如:new Person().shout();
    • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个函数调用

     实现类的封装性

            为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。
    一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。

    private变量只能被内部类使用,不能被外部的类使用,有一种例外,如下:

    • 在一个类中定义了一个private成员变量age,然后产生了这个类的两个实例d1、d2,则在d1对象的方法中可以访问d2对象中的私有变量age,代码如下:
      class Person
      {
              private int age=-1;
               void aa(Person a)
               {
                        System.out.println(a.age);
               }
      }
      class bbc
      {
               public static void main(String[] args) 
               {
                        Person d1=new Person();
                        Person d2=new Person();
                        d1.aa(d2);   //在这里d1对象的aa方法中访问了d2对象中的私有变量age
                }
      }
    • 只有在方法内才能出现访问另一个对象的私有变量的语句,如下代码是错误的:
      class Person
      {
              private int age=-1;
               void aa(int age)
               {
                        System.out.println(age);
               }
      }
      class bbc
      {
               public static void main(String[] args) 
               {
                        Person d1=new Person();
                        Person d2=new Person();
                        d1.aa(d2.age);   //不是在方法内不能出现访问私有成员变量的语句,所以这里会报错
                        System.out.println(d2.age);   //这句也是错的
               }
      }

    类的封装所带来的优点

    • 隐藏类的实现细节;
    • 让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
    • 便于修改,增强代码的可维护性;
    • 可进行数据检查
      例子:
      class Person
      {
              int  age ;
              void shout()
              {
                      System.out.println("您的年龄是:" + age)
              }
              pubic static void main(String args[ ])
              {
                      Person  p = new Person();
                      p.age = -30;    
                      p.shout();
              }
      }
      如果有人把年龄输入为负数,很明显是不对的,可以修改如下:
      class Person
      {
              private int  age ;
              public int setAge(int age)
              {
                      if(age<0)
                              return;
                      this.age = age ;
              }
              public int getAge()
              {
                      return age;
              }
              void shout()
              {
                      System.out.println("您的年龄是:" + age)
              }
              pubic static void main(String args[ ])
              {
                      Person  p = new Person();
                      p.setAge = -30;    
                      p.shout();
              }
      }
      经过这样的封装之后,负数的年龄将不会被赋值给age。还有两个数相除,除数不能为0也可用这方法。
    -------------------- android培训java培训、期待与您交流!--------------------
  • 相关阅读:
    格式化代码
    hexdump命令
    shell中+,*,[:space:]的用法
    Linux下安装Android的adb驱动-解决不能识别的问题
    android launcher3 home页简易分析
    LINUX 内核代码 errno 错误代码提示 /include/asm/errno.h
    关于mtk Android打开串口权限问题
    关于android MTK相机L版本,切换屏幕比例后,分辨率随之改变,但重新进入相机后原有分辨率不再生效问题
    关于android应用闪屏的几种情况
    Android 笔记
  • 原文地址:https://www.cnblogs.com/runwind/p/4454761.html
Copyright © 2011-2022 走看看