[Java] 5.抽象类和内部类

本文深入探讨Java中的抽象类和内部类概念,包括抽象方法的实现、内部类的多种类型及其应用,如局部内部类、匿名内部类、静态内部类等,以及内部类的继承方式。

之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性。

一、抽象类

  抽象类是只声明方法的存在而不去具体实现它的类。抽象类不能被实例化,也就是不能创建其对象。使用abstract关键字定义抽象类。

  下面是一个抽象类的定义,在class前直接加上abstract关键字。最后一句“public abstract void voice();”是一个抽象方法,没有实际意义,必须用子类重写。需要注意的是,抽象方法只有方法的声明,而没有方法的实现,与接口类似,但是用abstract关键字修饰的。对于抽象方法前的修饰,不能使用private或static关键字。

abstract class Animal {        // 定义抽象类
    public String animal;        // 定义颜色成员变量

    public Animal() {        // 定义构造方法
        animal="bird";
    }

    public abstract void voice();        // 定义抽象方法
}

接下来实现一下抽象方法。方法是在抽象类的子类中通过重写该方法实现抽象方法。

public class Dog extends Animal {
    @Override
    public void voice() {
        System.out.println("woof...");
    }
}

public class Cat extends Animal {
    @Override
    public void voice() {
        System.out.println("nya...");
    }
}

二、内部类

  内部类:在一个类中再定义一个类,就将在类中再定义的那个类称为内部类。分为成员内部类、局部内部类以及匿名内部类。比如下方代码就是成员内部类:

public class OuterClass {    // 外部类
    private class InnerClass {    // 内部类
        //...
    }
}

  在内部类中可以直接使用外部类的类成员。

  1. 局部内部类与成员内部类

  而局部内部类是指在类的方法中定义的内部类,作用范围为整个方法体。这里就不举例了,其实跟成员变量、局部变量是一个道理,区别在于作用范围而已。成员内部类同理。

  2. 匿名内部类

  匿名内部类大量使用于图形化编程的事件监控器代码中,可以大大简化代码增强可读性。顾名思义就是没有名称的类,可使用默认构造方法来生成匿名内部类的对象。在匿名内部类后需要加分号标识。比如后面在swing编程中,在编写框体时,对鼠标、键盘事件的引入就会用到匿名内部类,写到那里时再提及。

  3. 静态内部类

  静态内部类为在内部类前添加修饰符static。特点就是不可以使用外部类的非静态成员。

  4. 内部类的继承

  内部类也可以继承,比如继承ClassA类中的内部类ClassB,写作“extends ClassA.ClassB”。但必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法体中使用a.super()语句,这样才为继承提供了必要的对象引用。下面看一个例子。

public class Example extends ClassA.ClassB {    // 继承内部类ClassB
    public Example(ClassA a) {
        a.super();
    }
}
class ClassA {
    class ClassB {
    }
}

 

### Java抽象类与接口的概念 #### 抽象类概念 在Java中,通过`abstract`关键字定义的类称为抽象类。此类不能被实例化,意味着无法使用`new`操作符创建其对象。抽象类可以包含抽象方法——仅有声明而无具体实现的方法,以及常规的具体方法[^1]。 ```java // 定义一个抽象类Shape public abstract class Shape { // 这是一个具体的字段 String color; // 构造器 public Shape(String color){ this.color = color; } // 具体方法draw(),提供默认行为 public void draw(){ System.out.println("Drawing..."); } // 抽象方法area(), 子类需重写此方法 public abstract double area(); } ``` #### 接口概念 接口是一种完全抽象化的结构,在其中仅能声明常量抽象方法(Java8之后允许默认方法)。任何实现了该接口的类都必须给出这些抽象方法的实际版本。接口用于指定一组操作而不考虑其实现细节[^2]。 ```java // 定义一个接口Drawable interface Drawable{ // 默认方法print() default void print(){ System.out.println("This is a drawable object."); } // 抽象方法draw() void draw(); } ``` ### Java 抽象类与接口的主要区别 #### 继承方式不同 - 类只能单继承,即一个子类最多只能有一个直接父类; - 而接口支持多实现,这意味着一个类能够同时实现多个接口。 #### 方法成员差异 - 抽象类可拥有构造函数、静态方法、私有方法等特性; - 接口中除了抽象方法外,默认方法自Java 8引入,静态方法也从Java 9起得到支持,但不允许存在私有方法或保护级别的方法。 #### 字段属性方面 - 抽象类内部既可以定义变量也可以定义常量; - 接口内的所有字段自动具有`public static final`性质,因此通常只用来存储公共不变的数据项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值