java编程语言学习(二)

一、构造方法的特点

构造方法(也称为构造函数或构造器)在Java中具有以下特点:

  1. 名称必须与类名相同:这是构造方法的一个基本规则,也是它与其他方法的主要区别之一。

  2. 没有返回类型:构造方法没有返回类型,包括void也不允许。尝试为构造方法指定返回类型会导致编译错误。

  3. 自动调用:当使用new关键字创建一个对象时,Java会自动调用与该类相对应的构造方法。

  4. 可以重载:和Java中的其他方法一样,构造方法也可以被重载。这意味着一个类可以有多个构造方法,只要它们的参数列表不同。

  5. 初始化对象:构造方法的主要目的是初始化新创建的对象的状态。这通常包括为对象的实例变量分配初始值。

  6. 默认构造方法:如果一个类没有显式定义任何构造方法,那么编译器会为该类提供一个默认的构造方法(无参构造方法)。但是,如果类中显式定义了至少一个构造方法,那么编译器就不会再提供默认的构造方法。

  7. 访问权限:构造方法可以具有不同的访问权限,如publicprotectedprivate或默认(即没有显式指定访问权限)。这决定了哪些其他类可以创建该类的对象。

  8. 不能被继承:构造方法不是类的成员,因此它们不能被继承。子类可以定义自己的构造方法,但不能继承父类的构造方法。但是,子类构造方法可以通过super关键字调用父类的构造方法。

  9. 不能在构造方法中使用return返回除this之外的任何值:构造方法的目的是初始化对象,而不是返回任何值(除了this,这通常用于链式调用)。

  10. 可以抛出异常:如果构造方法在执行过程中需要处理可能发生的错误情况,它可以声明抛出异常。这允许在创建对象时处理潜在的错误情况。

下面是一个简单的例子,展示了构造方法的这些特点:

public class Example {  
    private int value;  
  
    // 默认构造方法  
    public Example() {  
        value = 0;  
    }  
  
    // 带参构造方法  
    public Example(int value) {  
        this.value = value;  
    }  
  
    // 另一个带参构造方法,用于演示构造方法的重载  
    public Example(String message, int value) {  
        // 可以在构造方法中调用其他构造方法  
        this(value);  
        // 在这里可以添加处理message的逻辑,但本例仅作为演示  
    }  
  
    // getter方法  
    public int getValue() {  
        return value;  
    }  
  
    // 示例main方法  
    public static void main(String[] args) {  
        Example example1 = new Example(); // 调用默认构造方法  
        Example example2 = new Example(10); // 调用带参构造方法  
        Example example3 = new Example("Hello", 20); // 调用另一个带参构造方法,它内部调用了带参构造方法  
    }  
}

二、抽象类和接口的区别

抽象类和接口在Java中都用于定义抽象行为,但它们之间存在一些关键的区别。以下是抽象类和接口的主要区别:

  1. 定义方式
    • 抽象类使用abstract关键字声明,并可以包含抽象方法和非抽象方法(即具体方法)。
    • 接口完全由抽象方法、常量(使用public static final修饰的变量,但在接口中可以省略这些修饰符)和默认方法(使用default关键字定义的方法,从Java 8开始支持)以及静态方法(使用static关键字定义的方法,从Java 8开始支持)组成。
  2. 实现方式
    • 一个类只能直接继承一个抽象类(Java不支持多重继承),但可以实现多个接口。
    • 接口不支持继承另一个接口,但可以通过逗号分隔的方式实现多个接口(称为多重实现)。
  3. 方法实现
    • 抽象类可以包含抽象方法和具体方法的实现。
    • 接口中的方法默认都是抽象的(即没有方法体),直到Java 8引入了默认方法和静态方法。
  4. 字段
    • 抽象类可以有字段,并且字段可以是私有的、受保护的、默认的或公共的。
    • 接口中的字段默认都是静态和最终的(即常量),且必须是公共的(即使省略了public关键字)。
    • 接口的主要目的是定义一组方法,这些方法由实现接口的类来提供具体的实现。常量是与这些方法相关的一种信息,因此它们被包含在接口中。然而,由于接口不能包含任何实现代码(除了默认方法和静态方法,这些是Java 8及更高版本引入的),所以接口中的变量必须是静态和最终的,以确保它们不会被修改。
    • 实际上,Java中的接口(Interface)可以定义变量,但这些变量在接口中默认是静态(static)和最终(final)的,也就是说它们实际上是常量(constants)。这是Java接口设计的一部分,用于定义与接口相关的常量集。

      当你在接口中定义一个变量时,它实际上是隐式地声明为public static final的。这是Java的约定,而不是强制要求,但如果你尝试在接口中声明一个非静态或非最终的变量,编译器会报错。

      例如:

      public interface MyInterface {  
          int MY_CONSTANT = 10;  // 实际上等同于 public static final int MY_CONSTANT = 10;  
            
          // 下面这种声明是不允许的,因为它不是静态和最终的  
          // int nonStaticVariable;  // 这会编译错误  
        
          void myMethod();  
      }
  5. 设计目的
    • 抽象类通常用于表示一个类的部分实现,即包含一些抽象方法和一些具体方法。它更强调继承的概念,是一种“is-a”关系。
    • 接口通常用于定义一组行为的标准,即一个类应该具备哪些方法。它更强调行为的规范,是一种“has-a”或“like-a”关系。
  6. 使用场景
    • 当需要部分实现某个类,并允许其他类继承这个实现时,可以使用抽象类。
    • 当需要定义一个行为的集合,并希望多个类实现这些行为时,可以使用接口。
  7. 默认方法
    • 从Java 8开始,接口可以包含默认方法,这些方法是带有方法体的方法,并允许子类继承默认方法的实现(除非子类明确重写它)。
    • 抽象类没有默认方法的概念,但可以实现接口中的默认方法。
  8. 静态方法
    • 从Java 8开始,接口也可以包含静态方法,这些方法可以直接通过接口名调用,而不需要创建接口的实例。
    • 抽象类同样可以包含静态方法。

三、异常类型

在Java中,throwthrows都用于处理异常,但它们在使用方式和上下文中有明显的区别。

1. throws

throws是一个关键字,用于声明方法可能会抛出的异常。它并不真正地抛出异常,而是告诉方法的调用者这个方法可能会抛出某些异常。这样,调用者就可以决定是否需要处理这些异常。

使用throws声明的异常可以是检查型异常(checked exception)或者运行时异常(runtime exception)的父类。但是,通常我们只会用throws声明检查型异常,因为运行时异常通常不需要显式地声明,因为Java会在运行时自动处理它们。

示例:

public void myMethod() throws IOException {  
    // ... 可能会抛出IOException的代码 ...  
}

在这个例子中,myMethod方法声明了它可能会抛出一个IOException。因此,任何调用myMethod的代码都必须处理这个可能的异常,要么通过捕获它(使用try-catch块),要么通过在其自己的方法签名中使用throws关键字声明它。

2. throw

throw是一个关键字,用于实际地抛出异常。当你确定某个地方出现了错误,并且你想立即停止执行当前代码并返回一个异常给调用者时,你会使用throw

使用throw抛出的异常对象必须是Throwable类的实例或其子类的实例。这可以是检查型异常或运行时异常。

示例:

public void myMethod() {  
    try {  
        // ... 可能会抛出异常的代码 ...  
    } catch (SomeException e) {  
        // 处理异常,或者选择抛出新的异常  
        throw new RuntimeException("A problem occurred", e);  
    }  
}

在这个例子中,如果在try块中的代码抛出了一个SomeException,那么它会被catch块捕获。然后,在catch块中,我们决定抛出一个新的RuntimeException,并传递原始的SomeException作为其原因。

总结

  • throws用于声明方法可能会抛出的异常,但不实际抛出异常。
  • throw用于实际抛出异常,通常在catch块或方法中直接使用。
  • 32
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值