面向对象的三大特性

百知教育学习 - 胡鑫喆 - 面向对象的三大特性

一、封装

  • 概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限

  • 访问修饰符:private(可将属性修饰为私有,仅本类可见)

  • 公共访问方法: get/set

    • public String getPassword(){

      return Password;

      }

      public void setPassword(String Password){

      if(Password !=6) return false; // 可在set方法里设置规则

      this.Password=Password;

      }

    *在这里插入图片描述

    • 在这里插入图片描述

二、继承

  • 程序中的继承是类与类特征行为的一种赠与或获得

  • 两个类之间的继承关系,必须满足**“is a”**的关系 子类 is a 父类 一般—特殊

  • 在这里插入图片描述

  • 单继承(extends): 一个类只能有一个直接父类

  • 父类的哪些属性和方法能继承给子类<----> 子类能访问父类的哪些属性和方法?

    ​ 访问修饰符 访问范围 继承性

    ​ private 本类内部 不可继承 私有的

    ​ (default) 本类+同包 同包子类可以继承 默认的

    ​ protected 本类+同包+子类 可以继承 受保护的

    ​ public 公开 可以继承 公开的

    • 在这里插入图片描述
    • 构造方法不可继承
  • 组合/聚合复用原则 :对于违反里氏代换原则的两个类,由于不存在 is a关系,所以不能定义继承,可以用组合的方式实现类的代码复用

    • class PersonA{

      public void teachJava(){

      }

      public void Rob(){

      }

      } 你想让PersonB有teachJava的方法,但是你不能让B继承A,如果继承的话,B也就有A的rob方法。

      class PersonB{ 不能仅仅为了调用方法就继承,继承必须满足is a的关系

      PersonA personA=new PersonA(); 这个时候你可以用PersonA一个对象,通过这个对象调用A的方法

      personA.teachJava();

      }

  • 方法的覆盖override : 子类用特殊的方法实现,替换掉父类继承给它的方法实现

    • 语法 :方法名相同,参数表相同,返回值类型相同。如子类中的public void eat(int a){}与父类public void eat(){}属于重载
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 对象的构造过程

    • 1.分配空间
    • 2.构造父类对象
    • 3.初始化本类属性
    • 4.调用本类构造方法
    • A-----B-----C
      • 1.分配空间
      • 2.初始化A属性
      • 3.调用A构造方法
      • 4.初始化B属性
      • 5.调用B构造方法
      • 6.初始化C属性
      • 7.调用C构造方法
  • super

    • super(); 用在构造方法中,指明调用父类哪个构造方法,必须出现在构造方法的第一行

      如果一个构造方法的第一行不是super(…),也不是this(…)默认代码为super();

    • 语法上并不要求一个类必须要有一个无参的构造器,但是在编程习惯上建议写上

  • super引用 :引用 指向父类对象

三、多态

  • 生活中的多态

    • 在这里插入图片描述
  • 程序中的多态

    • 在这里插入图片描述
  • 多态中的方法覆盖

    • 在这里插入图片描述
  • 多态的应用

    • 在这里插入图片描述
  • 多态: 子类对象可以赋值给父类引用

    • 1.只能对引用调用 其引用类型中声明的方法

    • 2.运行时,根据对象实际类型,调用子类覆盖之后的方法

    • 3.对象类型不变 强制类型转换,用于父类引用赋值给子类引用,无法改变对象类型

    • 引用 instanceof 类名 “判断引用中的对象 是不是 类名” 用作在强制类型转换之前进行类型判断,避免类型转换异常

      • 举例 : 类A有 m1(); m2(); 方法 类B是类A的子类 类B有 m2(); m3();方法

        A a=new B();

        a.m1(); 调用的是类A的

        a.m2(); 调用的是类B的

        a.m3(); 调用不成

        但是 B b =(B)a; 编译没问题 但是运行出错

        if( a instanceof B){

        ​ B b=(B) a; 引用间赋值是地址赋值,两个引用将共同指向同一对象

        ​ b.m3();

        }

  • 多态的作用 :把不同子类的对象,统一看做是父类对象来处理,屏蔽了不同子类的差异 ----》通用性

    多态用在参数上 m(A a): m方法允许A类或A的某个子类对象作为实参

    多态用在返回值上 A m() : m方法返回的是A类或A的某个子类对象


  • 覆盖与重载的区别

    • 重载可能发生在本类,也可能发生在父子类。重载要求1.方法名相同2.参数表不同,其他的不做要求(如返回值类型)
    • 覆盖一定是在父子类,1.修饰符相同或更宽,2.返回值类型相同或者是子类,3.方法名相同,4.参数表相同,5.抛出的异常相同或更少。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值