JAVA基础02-面向对象(封装,继承,多态),方法回顾,抽象类,接口,内部类,异常机制

远山

1.初始面向对象

1.面向过程->面向对象

  • 面向过程
    • 步骤清晰, 第一步该干什么,第二步该干什么
    • 面向过程比较适合处理一些简单的问题
  • 面向对象
    • 物以类聚, 比方说老师都是属于教师, 同样也都是人; 再比方说圆,正方形都属于几何图形;
      • 比方说我们每天做地铁上下班, 造成起床要刷牙穿衣服,下班回家要坐地铁,回到家只有要洗漱脱衣服上床睡觉.类似于这样重复的动作,我们就可以看做成是一个对象;
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
  • 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析, 我们需要使用面向对象的思路来分析整个系统,但是到具体事情的处理还是需要面向过程的思想进行处理,面向对象对整件事情进行一个宏观化;

2.什么是面向对象

  • 面向对象编程(Object-Oriented Programming , OOP)
  • 面向对象编程的本质就是:以类的方式组成代码,以对象组织(封装)数据;
  • 抽象
  • 三大特性
    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的,是对对象的抽象.
  • 从代码运行角度考虑是先有类后有对象. 类是对象的模板.

2.方法的回顾和加深

1.方法的定义

  • 修饰符
    • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
    • public : 对所有类可见。使用对象:类、接口、变量、方法
    • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • 返回类型
  • break和return的区别
    • break:结束循环(switch)
    • return:结束方法
  • 方法名
    • 注意规范,推荐阿里java开发手册, 见名知意
  • 参数列表
    • (参数类型 参数名,参数类型 参数名2) , (参数类型 …(可变参数名))
  • 异常抛出(Exception) :后面介绍

2.方法的调用:(递归)

  • 静态方法
    • 修饰符是否带static关键字
    • 静态方法跟类一起加载, 非静态方法,实例化类之后才可以使用;
    • 有static 关键字的 直接类名.方法名就可以调用
    • 非静态的, 需要实例化一个对象, 对象名.方法名进行调用
  • 非静态方法
  • 形参和实参
    • 形参:创建方法的时候,参数列表的临时变量
    • 实参:整整调用方法的时候传递的值
  • 值传递和引用传递
    • java是值传递
    • 引用传递:对象,本质其实还是值传递;
  • this关键字
    • 代表当前的类

3.对象的创建分析

1.类与对象的关系

  • 类是一种抽象的数据类型,他是对某一类事务整体描述/定义,但并不是代表某一个具体的事务
    • 动物, 植物,电脑…
    • 这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
  • 对象是抽象概念的具体事例
    • 王五就是对人对象的具体事例,
    • 能够体现出特点,展现出功能的是具体的实例,而不是抽象的概念;

2.创建于初始化对象

  • 使用new关键字创建对象
  • 使用new关键字的时候,除了分配内存之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用.
  • 类中的构造器也成为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有一下特点
    1. 必须和类的名字相同
    2. 必须没有返回类型,也不能写void

3.构造器详解

  1. 分为有参构造和无参构造
    1. 一旦定义了有参构造,想用无参构造,就必须显示无参构造,否则在实例化的时候必须得给赋值
    2. 默认就有空参构造器
  2. 实例化对象初始值
  3. 使用new关键字必须要有构造器,本质是在调用构造器

4.面向对象三大特性

1.封装详解

  1. 就是不想让别人看到的东西就藏起来
    1. 程序设计追求高内聚,低耦合 ,
      1. 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,
      2. 低耦合:降低程序之间的耦合度, 仅仅暴露少量的方法给外部使用,减少程序之间的耦合度
  2. 封装(隐藏)通常,应禁止直接访问对象中数据的实际表示,而应该通过操作接口来访问,这成为信息隐藏.
  3. 一般都是通过get/set 来操作属性私有封装的对象
    1. 提高程序的安全性,保护数据;
    2. 隐藏代码的实现细节
    3. 统一接口
    4. 系统可维护增加了

2.继承

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

  2. extends的意思是扩展. 子类是父类的扩展

  3. JAVA中类只有单继承, 没有多继承

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

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

  6. 子类和父类之间,从意义上来讲应具有"is a " 的关系

  7. object类

  8. super

    1. usper调用父类的构造方法,必须在构造器的第一个
    2. super必须只能出现在子类的方法或者构造方法中
    3. super 和this不能同时调用构造方法;
      • vs this
        • 代表的对象不同:
          • this: 本身调用者这个对象
          • super: 代表父类对象的引用
        • 前提
          • this :没有继承也可以使用
          • super: 只能在继承条件下可以使用
        • 构造方法:
          • this() ;本类构造;
          • super() : 父类构造!
  9. 方法重写

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

    1. 方法名必须相同,
    2. 参数列表必须相同
    3. 修饰符:范围可以扩大但不能缩小:public->protected->default->private
    4. 抛出的异常:范围,可以缩小,但不能扩大;

3.多态

  1. 动态编译,增强可扩展性
  2. 即同一方法可以根据发送对象的不同而采用不同的行为方式,
  3. 一个对象的实际类型是确定的,但可以执行对象的引用类型有很多
  4. 多态存在的条件;
    1. 有继承关系;
    2. 子类重写父类的方法
    3. 父类引用指向子类对象
  5. instanceof :类型转换 ,判断一个对象是否存在

注意事项

  1. 多态是方法的多态,与属性无关;
  2. 父类和子类的关系;
  3. 存在的条件, 继承关系, 方法需要重写的时候, 父类引用指向子类对象;
    1. 无法被重写的
      1. static 方法 :属于类,不属于实例
      2. final: 常量;
      3. private 方法

4.static(修饰符)修饰符

静态导入包可以直接使用方法

5.抽象类(class)和接口(interface)

1.抽象类

  1. abstract 修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类;
  2. 抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类
  3. 抽象类,不能使用new关键字来实例化对象,他是为了让子类来继承的
  4. 抽象方法,只有方法的声明,没有方法的实现,他是用来让子类实现的;
  5. 子类继承抽象类,就必须重写所有的抽象方法,否则该类必须声明为抽象类;

2.接口(interface)

  1. 普通类:只有具体实现
  2. 抽象类:具体实现和规范(抽象方法)都有
  3. 接口:只有规范
    1. 接口就是规范,定义一组规则,体现了现实世界中"如果…那么必须…"的思想,比如如果你是学生,就必须得学习
    2. 接口的本质类似于契约, 就比如法律,约定好的事情,就必须遵守
    3. 面向对象的精髓, 是对对象的抽象,设计模式研究的就是怎么样进行抽象

作用

  1. 约束
  2. 定义一些方法,让不同的人实现
  3. 方法都是 public abstract 修饰的
  4. 常量都是 public static final 修饰的
  5. 接口不能直接被实例化, 接口中没有构造方法
  6. 利用 implements 可以实现接口

6.内部类

  1. 累不累就是在一个类的内部定义一个类,比如A类中定义一个B类,那么B类对于A类来说就可以成为内部类, 而A类对于B类来说就是外部类了
    1. 成员内部类
    2. 静态内部类
    3. 局部内部类
    4. 匿名内部类

7.异常 error, exception

1.什么是异常?

异常指程序中出现的不定期而至的各种状况, 例如:文件找不到,网络连接失败,非法参数等

异常发生在程序运行期间,他影响了程序的执行流程.

2.异常的分类

主要分为以下三种

  1. 检查性异常:最具有代表性异常,是用户错误或问题引起的异常,这是程序无法预见的.例如:要读取一个不存在的文件是, 就会发生异常
  2. 运行时异常,运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时被忽略
  3. 错误 : 错误不是异常, 而是脱离程序员控制的问题,错误在代码中通常被忽略,例如栈溢出,在编译时是检查不到的;

3.异常的体系结构

  • jiava把异常当做对象来处理,并定义了一个基类:java.long.Throwable作为异常的超类.
  • 在java API 中已经定义了许多异常类, 这些异常类分为两大类, 错误ERROR 和异常EXCEPTION
  • 例如:除了列出的还有很多

ERROR

  • ERROR 类对象有java虚拟机产生并抛出, 大多数作为与代码编写者所执行的操作无关.
  • java虚拟机硬性错误(Virtual MachineError),当JVM 不在有继续执行操作所需要的内存资源时,将出现OutOfMemoryError,这些异常发生时, java 虚拟机一般会选择线程终止;
  • 还有发生在虚拟机视图执行应用时, 如类定义错误(NoClassDefFoundError),连接错误(LinnkageError),这些作物是不可查的, 因为他们在应用程序的控制和处理范围之外,而且大多数是程序运行时不允许出现你的状况;

Exception

  • 在Exception分支中有一个重要的子类RuntimeException(运行时异常)
    • ArrayIndexOutOfBoundsException(数组下标越界)
    • NullPointerException(空指针异常)
    • ArithmeticException(算数异常)
    • MissingResourceException(丢失资源)
    • ClassNotFoundException(找不到类)等异常, 这些异常是不检查异常,程序中可以选择捕获处理 也可以不处理;
  • 这些异常一般都是由程序逻辑错误引起的, 程序应从逻辑角度尽可能避免这类异常的产生
  • Error和Exception的区别:Error通常是灾难性的致命错误,是程序无法处理和控制的, 当出现这些异常时, java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的, 并且在程序中应该尽可能的去处理了这些异常.

4.异常处理机制

  1. 抛出异常

    /**
    * 输出:
    * t5()方法抛出异常
    * finally
    */ 
    public static void t5(int i) throws Exception {
            //抛出异常 抛给t5()方法的调用者
            throw new Exception();
        }
    
        public static void t6(int i){
            //捕获t5()方法抛出的异常
            try {
                t5(5);
            } catch (Exception e) {
                //进行处理
                System.out.println("t5()方法抛出异常");
                //throw new RuntimeException(e);
            }finally {
                //最终处理
                System.out.println("finally");
            }
        }
    
  2. 捕获异常

  • 异常处理五个关键字
    1. try, catch ,finally ,throw , throws
  1. 自定义异常

    • 使用java内置的异常类可以描述在编程时出现的大部分异常情况,除此之外,用户还可以自定义异常,用户自定义异常类, 只需要继承Exception类即可.
    • 在程序中使用自定义异常类 , 大体可分为如下步骤;
      1. 创建自定义异常类;
      2. 在方法中通过throw关键字抛出异常对象.
      3. 如果在抛出异常的处理方法中处理异常, 可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用的异常,继续下一步操作
      4. 在出现异常方法的调用者中捕获并处理异常;
  2. 实际使用

    • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
    • 在多重catch块后面,可以加一个catch(Exception)来处理可能会遗漏的异常
    • 对于不确定的代码, 也可以加一个try-catch,处理潜在的异常
    • 尽量去处理异常, 切记只是简单地调用printStachTrace()去打印输出
    • 具体情况具体分析, 要根据不同的业务需求和异常类型去决定
    • 尽量添加finally语句块去释放占用资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值