• Java学习随便记2


    可抛出的对象:错误和异常

    错误是致命的,而且程序员预期不该发生的,一旦发生程序通常自行奔溃;异常是程序员可以预期的某种特殊情况,程序应该捕获且合理地处理它。Java内置了不少异常类,如除以0、数组越界、对象为空、加载类时找不到对应类……。基类 Throwable 定义了 getMessage()、toString()、printStatckTrace()等方法,可以在捕获异常时使用。

    一个方法可能抛出(非检查性)异常,应该在方法签名尾部用 throws关键字声明这些异常。

    异常处理中,可以在 try{...} catch(..) {...} catch(..){...} 尾部添加 finally {...} 块做善后工作,finally块代码会确保被执行。JDK 7+ 中的 try (资源声明创建) { ... } catch(...){...} 语法糖,可以减轻这种确保资源释放的负担(即不用写finally块,编译器帮你处理)。

    java继承

    java继承和php一样,使用 extends 关键字实现类继承(只是php中通常不用管类本身的public之类的访问控制。不继承任何类的类默认继承Object类),用 implements 关键字实现接口“继承”(即实现接口)。java类继承是单继承,用接口可以实现多继承的特性,因为同一个类可以实现多个接口。

    继承中,使用 super 关键字访问父类(这关键字倒和python同了),this指向实例自己(注意,虽然关键字和C++、PHP相同,但不用箭头语法)。

    final关键字可以实现“断子绝孙”,这个关键字和C#同。

    java方法覆盖(override)

    子类对父类方法覆盖(或叫“覆写”或“重写”)时,方法签名除了返回值,其余必须保持不变(返回值必须是父类的兼容类型)。访问权限只能提高,不能降低,即前一篇中的父类是public的方法,不能被子类覆盖成protected或private。当然,重写实现中,可以用super.Xxx()调用父类方法。

    Java方法重载(overload)

    java中的重载(overload),最常用的是构造函数重载。重载就是方法名一样,参数必须不同。重载其实是本质(签名)不同的函数,只是这些函数作用相近取了相同的名字。

    Java多态

    覆盖重写实现多态的基本条件:(1)存在继承;(2)子类覆盖父类方法;(3)父类引用指向子类对象(表明父类变量总是子类的兼容类型)

    多态的特点是:设计父类(通常是类库之类,用户应用较少使用多态)时,可以编写通用的代码,子类可以实现不同功能。父类类型的变量(父类引用),可以在运行时绑定不同的子类实例,调用同名方法时,具体呈现实现功能不同,即运行时多态

    Java抽象类

    抽象类无实例,必须被继承得到使用,所以,它只是一份关于成员变量和成员方法的协议,通常类库设计者更关注它。抽象类用 abstract 修饰 class。

    抽象类中可以有抽象方法(当然也可以没有抽象方法),即用abstract修饰的方法。可以认为,抽象方法更体现“协议性”,因为它只规定了继承者同名方法的签名,本身无方法体。不能用 abstract 修饰构造方法和static类方法。

    抽象类的派生子类可以仍然是抽象类,子类若非抽象类,它必须实现所有抽象方法(如果有的话)的具体实现。

    Java接口

    看一个例子:Closeable接口从AutoCloseable继承(接口可以继承另一接口,也可以没有继承)。接口内声明了一个 close() 方法(只需要标记public,但它本质上是 public abstract的)。接口内成员变量不常见,并且只能是static和final的。

    1. public interface Closeable extends AutoCloseable {
    2. public void close() throws IOException;
    3. }

    接口机制让 Java 也可以实现多继承效果。

    Java枚举

    简单的 Java 枚举和 C枚举类型类似,如

    1. enum RGB {
    2. RED, GREEN, BLUE;
    3. }

    但Java枚举其实是一个类(都从java.lang.Enum派生),可以添加成员变量、方法和构造函数。并且,Java枚举类可以嵌入其他类之中。

    1. public class HelloWorld {
    2. enum RGB {
    3. RED {
    4. public String getColor() {
    5. return "Red";
    6. }
    7. },
    8. GREEN {
    9. public String getColor() {
    10. return "Green";
    11. }
    12. },
    13. BLUE {
    14. public String getColor() {
    15. return "Blue";
    16. }
    17. };
    18. public abstract String getColor();
    19. }
    20. public static void main(String[] args) {
    21. for (RGB x : RGB.values()) {
    22. System.out.println(x.getColor());
    23. }
    24. }
    25. }

    指的注意的是,从理解概念上来说,要把枚举成员 RED、GREEN、BLUE当做类RGB的实例,类RGB有抽象方法 getColor(),然后枚举实例可以具体实现自己的 getColor()实例方法(类似多态中的子类方法)。在调用时,RGB型的实例 x 是不能直接看见 RED、GREEN、BLUE的 getColor() 方法的,它必须借由“父类”RGB的抽象方法 getColor() 来调用(因为父类RGB的getColor()是抽象的,所以,会去调用子类的方法)。因为 x 依次绑定到 RED、GREEN、BLUE “实例”,从而实现了某种程度的运行时多态。

    Java包机制

    Java包机制不仅仅解决命名冲突问题,它还有访问控制搜索定位类、接口等成分的作用。写法上,Java包机制和golang有部分相似。

    Java包机制“严肃”的地方是必须遵守包名、类名的约定,并且包名必须和相应的字节码所在的目录结构对应(因为需要实现搜索定位)。

    以上是Java OOP的一些基本概念

  • 相关阅读:
    部署3节点k8s集群,要求使用版本1.24.2。
    从底层结构开始学习FPGA(8)----Block RAM(BRAM,块RAM)
    GNU 简单介绍(含glibc 源码下载)
    WordPress的SMTP服务失效的解决
    PostgreSQL之IOException
    Pycharm安装配置Pyside6
    apache-maven-3.6.3 安装配置教程
    怎么把pdf转换为excel表格?有什么实用的转换工具?
    Hbase三大组件 -- Region Server、HMaster、Zookeeper 介绍
    backtrace输出任意线程栈信息
  • 原文地址:https://blog.csdn.net/sjg20010414/article/details/128189404