面向对象OOP(Object Oriented Programming)

面向对象OOP(Object Oriented Programming)

初识面向对象

面向对象编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据
  • 面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

  • 面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

  • 面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。

  • 面向过程:

    • 优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。

    • 缺点:不易维护、不易复用、不易扩展.

  • 面向对象

    • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .

    • 缺点:性能比面向过程差

对象创建和分析

类与对象的关系

  • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表一个具体的事物。

  • 对象是抽象概念的具体实例

创建与初始化对象

  • 使用new关键字创建对象,

  • new作用:1、创建对象2、调用构造函数;3,、返回对象引用

  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点

    • 1、必须和类名相同

    • 2、必须没有返回类型,也不能写void;

    • 面向对象OOP(Object Oriented Programming)

参考详解链接

面向对象三大特性

  • 封装

    • 该露的露,该藏的藏。设计要求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。

    • 隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性通常,应禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问。这称为信息隐藏

    • 属性私有、get/set

  • 继承

    • 提高代码复用性;继承是多态的前提。

    • 本质是对某一批类的抽象,从而实现对现实世界更好的建模

    • extends的意思是:“扩展”、子类是父类的扩展

    • Java只有单继承,没有多继承!!!

    • 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等

    • 继承关系的两个类,一个为子类(派生类),一个为父类(基类),使用关键字extends来表示

    • 子类和父类之间,从意义上来讲应该具有“is a” 的关系

    • object类(所有类的基类)

    • super:“super.属性 ” 可以调用父类里定义的属性参数****。

      • super调用父类的构造方法,必须在构造方法的第一个。

      • super必须只能出现在子类的方法或者构造方法

      • super和this不能同时调用构造方法

    • this 调用当前类里的属性或行为

      • this:本身调用者这个对象

      • super:代表父类对象的应用

    • 方法重写

      • 都是方法的重写,与属性无关

      • 需要有继承关系,子类重写父类的方法

      • 参数列表必须相同

      • 修饰符范围可以扩大但不可以缩小

      • 抛出的异常可以被缩小但是不能扩大

      • 子类的方法和父类的一致,方法体不同

  • 多态

    • 父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

    • 同一方法可以根据发送对象的不同而采用多种不同的行为方式

    • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。

    • 多态存在的条件

      • 有继承关系

      • 子类重写父类方法

      • 父类引用指向子类对象

    • 多态是方法的多态,属性无。

    • instanceof(类型转换,引用类型)

    • 对象能执行哪些方法看左边的类型,和右边关系不大。

      Student s1= new Student();//s1可以调用重写方法,也可以调用自己的方法;
      Person s2= new Student();//s2调用的方法可以是Student子类重写的方法。
      ?
    • static

      • 用static修饰符修饰的常量或方法可以直接被调用。类加载时一起出现,不用在分配内存空间。

抽象类和接口

  • 抽象类

    • abstract修饰符,可以用来修饰方法,也可以用来修饰类。如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。

    • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

    • 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的

    • 抽象方法,只有方法的声明,没有方法的实现,用来让子类实现

    • 子类继承抽象类,那么就必须实现抽象类没有实现的抽象方法,否则该子类也是抽象类。

    • 抽象类除了不能实例化对象,其他权限与普通类一样

    • 提高开发效率

  • 接口

    • 接口可以实现多继承(一个接口多个实现方式)

    • 抽象类:extends+父类 。类实现接口: implements + 多个/一个接口(实现多继承),实现了接口的类,就要重写接口中的方法。

    • 接口不能被实例化,接口中没有构造方法

    • 面向对象OOP(Object Oriented Programming)

内部类及OOP实战

内部类
  • 成员内部类

    • public class Outer {
          private int id=9;
          public void out(){
              System.out.println("这是外部类的方法");
          }
          class Inner{
              public void in(){
                  System.out.println("这是内部类的方法");
              }
              //内部类可以直接获得外部类的私有属性,并且可以直接调用外部类方法。
              public void getId(){
                  System.out.println(id);
                  out();
              }
          }
      }
      public class Application {
          public static void main(String[] args) {
              Outer ou =new Outer();
              ou.out();//调用外部类方法
              Outer.Inner inner =  ou.new Inner();//内部类的实例化对象,通过外部类引用
              inner.in();//调用内部类方法
              inner.getId();
          }
      }

       

  • 静态内部类

    • 定义之后无法直接访问外部类,静态不可以调用非静态

  • 局部内部类

    • 方法内的类

    • public class Outer {
          public void out(){
             class Inner{//局部内部类
             }
          }
      }

       

  • 匿名内部类

    • public class Test {
          public static void main(String[] args) {
              //没有名字的初始化类,不用将实例保存到变量中
              new Apple().eat();
              new UserService(){
                  @Override
                  public void hello() {
                  }
              };
          }
      }
          class Apple{
              public void eat(){
                  System.out.println("吃苹果");
              }
          }
      interface UserService{
          void hello();
      }

       

面向对象OOP(Object Oriented Programming)

上一篇:浅析@ResponseStatus的作用、属性、用法、底层原理及使用注意事项


下一篇:01-面向对象的理解