初学须知之Java的抽象类与接口

抽象类与接口

抽象类

1.抽象类的定义

抽象类用来描述事物的一般行为和状态,然后由子类去实现这些行为或状态,以适应对象的多样性。

抽象类要用abstract修饰符修饰,定义格式如下:

abstract class 类名称{
   成员变量的定义;
   方法名(){...} //此处定义的是具体的方法
   abstract 方法名(); //定义的是抽象方法,没有方法体,具体的实现方式由子类来定义
}

【说明】

(1)抽象类中可以包含抽象方法和具体方法,抽象方法在定义时,在方法头后直接加分号,没有大括号括住的方法体

(2)抽象类不能实例化对象。

(3)抽象类只能单继承。

(4)所有的抽象方法都必须存在于抽象类当中。

2.抽象类的应用

【例1】 定义一个代表“形状”的抽象类,其中包括求形状面积的抽象方法。继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存入一个数组中,访问数组元素将各类图形的面积输出。

abstract class Shape {      //定义了一个抽象类Shape
   abstract public double getArea();     //定义一个抽象方法getArea
}
class Triangle extends Shape{           //定义了一个三角形类,并继承抽象类
   private double a,b,c;       //定义三角形三边
   Triangle(double x,double y,double z){
       a=x;
       b=y;
       c=z;
  }
   public double getArea(){      //对抽象方法的实现
       double p=(a+b+c)/2;
       return Math.sqrt(p*(p-a)*(p-b)*(p-c));
  }
}
class Rectangle extends Shape{
   private double a,b;
   Rectangle(double x,double y){
       a=x;
       b=y;
  }
   public double getArea(){
       return (a*b);
  }
}
class Circle extends Shape{
   private double radius;
   Circle(double x){
       radius=x;
  }
   public double getArea(){
       return (3.14*radius*radius);
  }
}
public class Ex8_1{
   public static void main(String[] args) {
       Shape[] s=new Shape[3];     //创建3个Shape类的数组
       s[0]=new Triangle(3,4,5);
       s[1]=new Rectangle(6,7);
       s[2]=new Circle(2.5);
       for (int i = 0; i < 3; i++) {
           System.out.println(s[i].getArea());
      }
  }
}

【说明】子类继承抽象类后,必须实现抽象类中的抽象方法。此外,虽然抽象类不能实例化对象,但可以创建数组。

【例2】关于抽象类中的构造方法的分析

abstract class Father{
   Father(){
       System.out.println("父类"); //抽象类的构造方法
  }
}
class Son extends Father{
   Son(){
       System.out.println("子类");
  }
}
public class Test {
   public static void main(String[] args) {
       Son s=new Son();
  }
}

输出结果:
父类
子类

【说明】可以看到,在创建子类的对象时,系统自动调用了父类的构造方法,然后再调用子类自身的构造方法。由此可以总结:虽然抽象类不能实例化对象,但可以有构造方法,而抽象类的构造方法仅在子类对象创建时调用。

接口

Java中不支持多继承,而是通过接口来实现比多重继承更强的功能。

1.接口的定义

接口由常量和抽象方法组成,由关键字interface引导接口定义。语法如下:

[public] interface 接口名 [extends 父类名列表]{
   常量类型 常量名=常量值; //默认的是public static final
   方法返回值类型 方法名(形参表); //默认的是public abstract
}

需要注意以下几点:

  • 接口中,只有常量和抽象方法,它们的默认类型分别是:public static final和public abstract,在定义接口时,这些修饰符可以省略。

  • 接口也具有继承性,一个接口可以继承多个父接口,父接口用逗号隔开。

  • 接口是抽象类的特殊化(可以这么理解),故接口也不能创建对象。

2.接口的实现

一个类要实现某个接口,就必须实现接口中所有的方法。有关接口的实现,需要注意以下几点:

  • 一个类可以实现多个接口,在类的声明部分,用关键字implements来声明该类要实现那些接口。

  • 接口的默认访问权限为public,在实现时方法头要加上public.

抽象类与接口的区别

1.从语法层面上比较

比较点 抽象类 接口
关键字 abstract class interface
属性 无限制 必须是public、static、final的
方法 普通方法、抽象方法 抽象方法,且必须是public的
继承/实现 只能被类或抽象类继承 既可以被接口继承,也可以被类或抽象类实现
多重继承 不支持 可以继承多个父接口
子类中的声明 用extents关键字 用implements关键字

2.从含义上理解

  • 抽象类是子类的固有属性,是具有该行为的一类物质的基本特点。抽象类与子类的关系是“is a”。

  • 接口是该物质所具有的某个性质。接口与子类的关系是“like a”。

内嵌类

内嵌类也就是类里再嵌套类,因此,内嵌类也称为内部类或潜逃类,而包含内嵌类的类称为外层类。内嵌类与外层类在逻辑上是所属关系,内嵌类的使用要依托外层类。内嵌类的作用是用来实现没有通用意义的功能逻辑。内嵌类在初级阶段还用不上,所以在这里就不过多讲解。

内嵌类根据有无关键字static可分为成员类和静态内嵌类。此外,还有方法内嵌类和匿名内嵌类。

 



posted @ 2022-04-09 21:12  哥本是哈根  阅读(286)  评论(0)    收藏  举报