博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java进阶篇(一)——接口、继承与多态
阅读量:6969 次
发布时间:2019-06-27

本文共 3828 字,大约阅读时间需要 12 分钟。

  前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等。

  本篇的主题是接口、继承与多态,在看下面的内容之前,首先需要了解一下继承和多态。继承机制的使用可以复用一些定义好的类,减少重复代码的编写;多态机制的使用可以动态调整对象的调用,降低对象之间的依存关系。有了这些概念,再来看接口是做什么用的。

一、接口

  首先我们需要知道,Java语言只支持单重继承,不支持多继承。这句话的意思就是一个类只能有一个父类,但我们经常需要使用多继承来解决问题,所以Java语言提供了接口来实现类的多重继承功能。

  1. 接口的定义

  Java中使用interface来定义一个接口,接口定义与类相似(类的定义用的是class),下面直接上例子。

public interface ICalculate {    final float PI = 3.1415f;        // 定义常量PI,表示圆周率    float getArea(float r);            // 定义用于计算面积的方法getArea()    float getCircumference(float r);    // 定义用于计算周长的方法getCircumference() }

  从上述代码可以看出,interface是定义了一个接口,接口名为ICalculate(接口一般可以用大写字母“I”开头),在接口中可以定义变量和方法,但需要注意的是这里的方法都不能写方法体,也即方法名后直接加“;”,而方法的实现是写到实现接口的类中的。还有一点需要注意的是,接口中的所有方法都必须在实现了该接口的类中实现(可以空实现)。

  接下来演示一下Eclipse中如何创建一个接口。

  (1)首先在包上右键new一个Interface

  

  (2)填写接口名并确定

  

  (3)编写代码

  

  2. 接口的实现

  上面定义了一个接口,但要实现接口需要在类中用implements关键字,下面直接看例子,对应的接口是上例中的ICalculate。

1 public class Calculate implements ICalculate { 2  3     @Override 4     public float getArea(float r) { 5         float area = PI*r*r;        // 计算圆面积并赋值给area 6         return area;                // 返回area的值 7     } 8  9     @Override10     public float getCircumference(float r) {11         float circumference = 2*PI*r;    // 计算圆周长并赋值给circumference12         return circumference;            // 返回circumference的值13     }14 15 }

   Eclipse中创建步骤如下:

  (1)填写类名,点击Add添加接口

  

  (2)输入查找接口并确定

  

  (3)接口导入后点击确定,就可以看到如下界面,填写相应代码即可(创建的每个接口中的方法都必须实现,可以空实现,所以不能删除这里的任何一个方法)

  

  一个类可以实现多个接口,写法就是implements后的接口间以“,”隔开即可。如果变量冲突,则通过“接口名.变量”来明确指定变量的接口。

二、继承

  1. 继承的实现

  在Java中,使用extends关键字实现继承,extends后跟的是父类名,也就是它从哪个类继承过来的,而用extends的这个类本身称为子类。

  下面举个简单的例子,在生物学中,鸽子属于鸟的一种,所以鸟是父类,鸽子是子类。

  父类:

public class Bird {    String color = "灰色";    // 颜色    String skin = "羽毛";    // 皮毛}

  子类:

public class Pigeon extends Bird {    public static void main(String[] args) {        Pigeon pigeon = new Pigeon();        System.out.println(pigeon.color);    }}

  2. 重写

  简单来说就是,如果子类方法名和父类方法名相同,那么子类就不能继承父类的方法,此时称子类的方法重写了父类的方法。重写也可称为覆盖。

  举个简单的例子,这是一个动物类,实现了一个voice方法:

public class Animal {  public Animal() {}  public void voice() {        System.out.println("make some voice..");    }}

  创建一个Animal类的子类Dog,重写voice方法发出狗叫:

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

  再创建一个Animal类的子类Cat,重写voice方法发出猫叫:

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

  此时调用dog和cat中的方法都不会出现“make some voise..”字样,而是对应的狗叫和猫叫。

  但如果此时再创建一个Animal类的子类,但不重写方法,此时输出为父类Animal中voice方法的内容,创建一个子类Fish如下:

public class Fish extends Animal{    public Fish() {}}

  下面创建一个Zoo类,来调用上述几个方法测试一下:

public class Zoo {    public static void main(String[] args) {        Dog dog = new Dog();        dog.voice();        Cat cat = new Cat();        cat.voice();                Fish fish = new Fish();        fish.voice();    }}

  运行结果如下:

  

  从运行结果可以看出,由于Dog类和Cat类都重写了父类的方法voice(),所以执行其相应的方法,而Fish类中没有重写,所以执行的是父类中的方法。

  3. super关键字

  子类可以调用父类声明的构造方法,但是必须在子类的构造方法中使用super关键字来调用;如果想在子类中操作父类中被隐藏的成员变量和被重写的成员方法,也可以使用super关键字。这些在以后的项目中会出现,这里就不举例了,如果使用Java编译器的话,需要使用super关键字但未使用时编译器会有错误提示。

三、多态

  在Java中,通常使用方法的重载和重写实现类的多态性。

  重写在上面已经介绍过了,而方法的重载是指在一个类中出现多个方法名相同,但参数个数或参数类型不同的方法,下面举个关于重载的例子。

  比如求圆形和矩形的面积,是两个名称为getArea()的方法,它们的参数个数不同,如下:

// 求圆形面积public float getArea(float r) {    float area = PI*r*r;    return area;}// 求矩形面积public float getArea(float a, float b) {  // 重载getArea()方法    float area = a*b;    return area;}

  再比如添加一个学生的信息,是两个名称为setStudent()方法,它们的参数类型不同,如下:

// 添加学生号public void setStudent(int ID) {    this.stu_id = ID;}// 添加求学生姓名public void setStudent(String name) {    this.stu_name = name;}

  需要注意的是,在进行方法的重载时,方法返回值的类型不能作为区分方法的标志。

转载于:https://www.cnblogs.com/adamjwh/p/8360602.html

你可能感兴趣的文章
java对象转JSON JS取JSON数据
查看>>
Spring MVC 学习 之 - 拦截器
查看>>
Leetcode: Minimum Window Substring
查看>>
jQuery 时间控件推荐
查看>>
27 GroupSock概述(一)——live555源码阅读(四)网络
查看>>
获取select的 text
查看>>
MongoDB学习笔记~官方驱动的原生Curd操作
查看>>
常用数据库语句
查看>>
jQuery Easy UI 开发笔记
查看>>
26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展
查看>>
Python标准库:内置函数repr(object)
查看>>
【SpringMVC】SpringMVC系列14之SpringMVC国际化
查看>>
Codeforces Beta Round #1 B. Spreadsheets 模拟
查看>>
辛星深入分析vim的自己主动补全功能以及vim的映射
查看>>
ADCD 1.9 ZOS 配置 CTCI-W32 TCPIP 网络
查看>>
ASP.NET MVC之如何看待内置配置来提高性能优化(四)
查看>>
IOS-NSRunLoop
查看>>
Centos6.5更新e1000网卡驱动
查看>>
jz2440: linux/arch/arm/下面的plat-和mach-
查看>>
Linux中文件描述符fd和文件指针flip的理解
查看>>