Java 多态、内部类、异常、包

2017-10-18  本文已影响0人  陈凯冰

一、多态

1. 概述

2. 利与弊

3. 特点

1. 成员变量

2. 非静态成员函数

3. 静态成员函数

4. 应用

  1. 定义工具类,将共同行为封装在同一个类中。
  2. 对类型进行抽取(多态的产生)。
  3. 操作同一个父类型,对其中的子类型均可进行操作。
    • 例如:

二、内部类

1. 概述

2. 访问规则

  1. 外部类要访问内部类,必须建立内部类的对象。
  2. 内部类可以直接访问外部类中的成员(包括私有成员)。
    • 原因:因为内部类中持有外部类的引用。
    • 格式:外部类名.this

3. 访问格式

  1. 内部类定义在外部类的成员位置,而且非私有时,可以在外部的其它类中直接建立内部类对象。
    • 格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象;
      • 例如:Outer.Inner in = new Outer().new Inner();
    • 内部类定义在外部类的成员位置时,可以被成员修饰符所修饰。
      • 例如:
        • private:内部类在外部类中进行封装。
        • static:内部类有局部 statci 的特性,内部类被 static 修饰后,只能访问外部类中的 static 成员。
          • 外部的其它类访问 static 内部类中静态成员的格式:外部类名.内部类名.方法名();
            • 例如:Outer.Inner.function();
          • 外部的其它类访问 static 内部类中非静态成员的格式:new 外部类名.内部类名().方法名();
            • 例如:new Outer.Inner().function();
    • 注:
      1. 内部类中定义了静态成员时,该内部类必须是 static 的。
      2. 外部类中的静态方法访问内部类时,内部类也必须是 static 的。
      3. 实际开发中,内部类一般定义为 private,很少定义为 public 的。
  2. 内部类定义在局部位置
    1. 不可被成员修饰符所修饰,作用域限定在声明这个局部内部类的代码块中。
      • 例如:public、private、static 等修饰符。
    2. 可以直接访问外部类中的成员,还持有外部类的引用。
      • 注:内部类不可以访问所在局部中的非最终变量,只能访问被 final 修饰的局部变量。

      • 例如:

        • 分析:上述代码中的打印结果为 7、8,会改变,并没有因为被 final 所修饰就无法改变,原因是因为类调用方法结束后,被 final 修饰的变量已经从桟内存中消失,类再次调用方法时,已经是另一个变量了,所以可以重新传值。

4. 匿名内部类

三、异常

1. 概述

2. 体系

异常问题的划分方式

  1. 严重的异常问题。
    • 严重的异常问题,Java 通过 Error 类进行描述,对于 Error 类一般不编写针对性的代码进行处理。
  2. 非严重的异常问题。
    • 非严重的异常问题,Java 通过 Exception 类进行描述,对于 Exception 类可以使用针对性的代码进行处理。

        注:无论是 Error 或 Exception 都具有一些共性内容,例如:不正常情况的相关信息、引发异常的原因等。
      

体系

特点

  1. 异常体系中所有类以及建立的对象都具备可抛性;
  2. 可以被 throw 和 throws 关键字所修饰操作;
  3. 只有异常体系才具备这个特点。

3. 分类

编译时异常

运行时异常

4. 处理

5. 自定义

6. 好处与原则

好处

  1. 将问题进行封装。
  2. 将正常流程的代码和问题处理的代码分离,便于阅读。

原则

  1. 处理方式:try 或 throws。
  2. 调用到抛出异常的功能时,需要对所有抛出的异常进行处理,一个 try 可以对应多个 catch。
  3. 多个 catch 时,父类的 catch 需放到最后面,否则编译会报错,因为执行了父类的 catch 语句后,其余的 catch 语句将无法执行到。
  4. catch 中需要定义针对性的处理方式,一般不建议简单的定义 PrintStackTrace 输出语句,也不建议不做处理。
    1. 如果捕获的异常在本功能内处理不了的话,可继续在 catch 中抛出。

      • 例如:

    2. 如果捕获的异常在本功能内处理不了的话,但并不属于本功能出现的异常,可以将异常转换后再抛出。

    3. 如果捕获的异常在本功能内可以处理的话,但需要将异常产生后和本功能相关的问题提供出去给调用者,可以将异常转换后再抛出。

      • 例如:

7. 注意事项

  1. 异常问题在内部被解决就无需声明。
  2. catch 是用于处理异常,如果没有 catch,就代表异常问题没有被处理,该异常如果是检测时异常,就必须声明。
  3. 子父类重写(覆盖)时:
    1. 子类抛出的异常必须是父类异常的子类或者子集。
    2. 父类或接口没有异常抛出时,子类重写(覆盖)出现异常时,只能 try,不能抛。
      • 例如:

四、包(package)

1. 概述

2. 作用

  1. 为了避免多个类重名的情况,出现多个相同名字的类时,可通过包将其区分,避免冲突。
  2. 对类文件进行分类管理,可以将相关的类放在同个包中。
  3. 包的出现将 Java 的源文件和类文件分离。
  4. 给类提供了多层命名空间。
    • 例如:
      • a 包中的 Demo.class 文件,如果要创建 Demo 对象,在使用时需加上 a.
      • a.Demo demo = new a.Demo();

3. 规则

  1. 包必须写在程序的第一行,先有包,才知道类文件的存放位置。
  2. 类的全称:包.类名。
  3. 编译定义了包的程序文件时,在编译时需指定包的存放目录。
    • 例如:javac -d e:\Demo\mypack 类名.java

4. 包与包之间的访问

  1. 被访问的包里类的权限必须是 public。
  2. 访问其它包中的类时,需定义类的全称:包名.类名。
  3. 包如果不在当前路径的话,需使用 classpath 设置环境变量,为 JVM 指明路径。
  4. 类中的成员权限必须是 public 或 protected。
    • 类公有后,被访问的成员也要公有才能被访问。

    • protected 是为子类提供的一种权限。

    • 同个包中,protected 只做用为覆盖。

    • 不同包中的子类可以直接访问父类中被 protected 权限修饰符所修饰的成员。

    • 四种权限修饰符:

      • 注:由于被 public 所修饰的类名必须与 java 文件名相同,因此在一个 .java 文件中,不允许出现两个或以上的公有类或接口。

5. 导入(import)

6. jar 包

上一篇 下一篇

猜你喜欢

热点阅读