前几篇是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。

 public class Calculate implements ICalculate {

     @Override
public float getArea(float r) {
float area = PI*r*r; // 计算圆面积并赋值给area
return area; // 返回area的值
} @Override
public float getCircumference(float r) {
float circumference = 2*PI*r; // 计算圆周长并赋值给circumference
return circumference; // 返回circumference的值
} }

  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;
}

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

Java进阶篇(一)——接口、继承与多态的更多相关文章

  1. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

  2. java面向对象(封装,继承,多态,抽象,接口的定义和实现)

    1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...

  3. Java进阶篇(六)——Swing程序设计(上)

    Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...

  4. 浅析Java三大特性封装、继承、多态,及作业分析

    前言 本次博客衔接上次博客,作为这一阶段Java学习的分析.上一篇博客着重介绍了Java的OO编程思维,面向对象与面向过程的区别.本篇博客重心在Java的三大技术特性,附带作业分析. Java三大特性 ...

  5. Java—类的封装、继承与多态

    一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> ...

  6. 1.C#基础篇-->封装、继承和多态

    面向对象三要素:封装.继承和多态.正确理解这三个要素,才能在编程中建立面向对象的思想. 1.封装使用篇 作用:好的封装增加代码的可读性,易于维护. 什么情况下使用封装,封装的原则是? 1>功能相 ...

  7. Java进阶篇(六)——Swing程序设计(下)

    三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...

  8. java基础(4)继承和多态

    1 继承 1.1  继承概述 继承要解决的问题:共性抽取 1.2 继承的格式 class 父类 { ... } class 子类 extends 父类 { ... } 1.3 继承中成员变量的特点(变 ...

  9. Java探索之旅(8)——继承与多态

    1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...

随机推荐

  1. Linux创建普通用户以及权限的分配

    LINUX系统能创建一个普通用户,给开发人员让他们登录吗? 答案:可以. 怎么做? 答案:一般给开发 创建一个目录账户 他要做什么操作 就给什么权限 useradd命令 useradd可用来建立用户帐 ...

  2. 将 Shiro 作为应用的权限基础 二:基于SpringMVC实现的认证过程

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一. ...

  3. echarts图表变形解决方案

    在同一页面的多个echarts图在查询或切换图片时可能会变形,如图 解决方案是添加以下几行代码 /*在查询或切换统计图时图片有可能会变形,于是每次调getEchartsData()都给每个chart的 ...

  4. supervisor进程管理工具的使用

    supervisor是一款进程管理工具,当想让应用随着开机启动,或者在应用崩溃之后自启动的时候,supervisor就派上了用场. 广泛应用于服务器中,用于引导控制程序的启动 安装好superviso ...

  5. RabbitMQ 发布订阅持久化

    RabbitMQ是一种重要的消息队列中间件,在生产环境中,稳定是第一考虑.RabbitMQ厂家也深知开发者的声音,稳定.可靠是第一考虑,为了消息传输的可靠性传输,RabbitMQ提供了多种途径的消息持 ...

  6. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  7. RTMP规范协议

    本文参照rtmp协议英文版,进行简单的协议分析 1.什么是RTMP 关于 Adobe 的实时消息协议(Real Time Messaging Protocol,RTMP),是一种多媒体的复用和分组的应 ...

  8. JavaScript(第三十二天)【Ajax】

    2005年Jesse James Garrett发表了一篇文章,标题为:"Ajax:A new Approach to Web Applications".他在这篇文章里介绍了一种 ...

  9. Beta敏捷冲刺每日报告——Day3

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.4 00:00 -- 2017.11.5 00:00 讨论时间地点 2017.11.4 晚9:30,电话会议会议 ...

  10. C语言——第三次作业

    题目1.A乘以B 1.实验代码 #include <stdio.h> int main() { int A,B,C; scanf("%d %d",&A,& ...