前几篇是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 的tee命令

    tee 如果你在linux下希望将程序或命令运行的信息,在输入到文件的同时,也能够显示在屏幕上,你可以考虑使用tee这个命令.举个例子,直接上图 这里我调用函数aaa来完成将结果输入到aaa.log里 ...

  2. JDBC(通俗易懂)简单的操作(增、删、改、查)

    项目所写的类: 说明:①.DButil 动态加载数据库驱动,以及获取java.sql.Connection的对象. ②.Personmodel 数据库列(栏位)所对应的字段,定义了相应的set和get ...

  3. [SDOI2011]染色

    [SDOI2011]染色 题目描述 输入输出格式 输出格式: 对于每个询问操作,输出一行答案. 解法 ps:这题本来是树剖的,但我用lct写的,以下是lct的写法,树剖会有所不同 我们考虑把不同色点的 ...

  4. KVM之十:虚拟机在线添加网卡

    1.查看原有网卡信息 #virsh domiflist snale Interface Type Source Model MAC ---------------------------------- ...

  5. Property 'id' not found on type java.lang.String

    改为 忘写了$符,取不出来,因此报错!

  6. 【Redis使用系列】redis设置登陆密码

    找到安装redis的配置文件,找到redis.comf文件找到#requirepass foobared 新建一行 requirepass  xxxx 你的密码 ,然后重启.再登录的时候可以登录,但是 ...

  7. 项目Alpha冲刺Day7

    一.会议照片 二.项目进展 1.今日安排 今天都是课,主要就是用空闲时间熟悉一下框架使用以及继续进行框架搭建. 2.问题困难 前台界面框架vue和element-ui的写法要适应. 3.心得体会 vu ...

  8. vue项目结构

    前言 我在 搭建vue项目环境 简单说明了项目初始化完成后的目录结构. 但在实际项目中,src目录下的结构需要跟随项目做一些小小的调整. 目录结构 ├── src 项目源码目录 │ ├── api 所 ...

  9. Java中Math类的常用方法

    public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println( ...

  10. JAVA_SE基础——57.有了包之后类与类之间的访问使用import语句

    代码1访问代码2 代码1: class Demo3 { public static void main(String[] args) { Demo4 a = new Demo4(); a.print( ...