Java进阶篇(一)——接口、继承与多态
前几篇是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进阶篇(一)——接口、继承与多态的更多相关文章
- java基础篇 之 构造器内部的多态行为
java基础篇 之 构造器内部的多态行为 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...
- java面向对象(封装,继承,多态,抽象,接口的定义和实现)
1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...
- Java进阶篇(六)——Swing程序设计(上)
Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...
- 浅析Java三大特性封装、继承、多态,及作业分析
前言 本次博客衔接上次博客,作为这一阶段Java学习的分析.上一篇博客着重介绍了Java的OO编程思维,面向对象与面向过程的区别.本篇博客重心在Java的三大技术特性,附带作业分析. Java三大特性 ...
- Java—类的封装、继承与多态
一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> ...
- 1.C#基础篇-->封装、继承和多态
面向对象三要素:封装.继承和多态.正确理解这三个要素,才能在编程中建立面向对象的思想. 1.封装使用篇 作用:好的封装增加代码的可读性,易于维护. 什么情况下使用封装,封装的原则是? 1>功能相 ...
- Java进阶篇(六)——Swing程序设计(下)
三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...
- java基础(4)继承和多态
1 继承 1.1 继承概述 继承要解决的问题:共性抽取 1.2 继承的格式 class 父类 { ... } class 子类 extends 父类 { ... } 1.3 继承中成员变量的特点(变 ...
- Java探索之旅(8)——继承与多态
1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...
随机推荐
- UITableViewStyleGrouped模式下烦人的多余间距
第一个section上边多余间距处理 // 隐藏UITableViewStyleGrouped上边多余的间隔 _tableView.tableHeaderView = [[UIView alloc] ...
- 【Python】 配置文件相对路径&软件自动执行的工作目录
今天对监控脚本做了一些变更,然后突然发现监控全部都失效了..排查了半天问题仍然不知所踪.最终发现居然是一个踩过好几次的老坑.. 就是脚本内写的配置文件为了调试方便写成了相对路径,但是在上线时没有意识到 ...
- python多进程并发redis
Redis支持两种持久化方式RDB和AOF,RDB持久化能够快速的储存和回复数据,但在服务器停机时会丢失大量数据,AOF持久化能够高效的提高数据的安全性,但在储存和恢复数据方面要耗费大量的时间,最好的 ...
- Python-turtle库知识小结(python绘图工具)
turtle:海龟(海龟库) Turtle库是Python语言中一个很流行的绘制图像的函数库 使用之前需要导入库:import turtle • turtle.setup(width,height,s ...
- 十个 PHP 开发者最容易犯的错误
PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因.但也是因为它的简单,PHP 也慢慢发展成一个相对复杂的语言,层出不穷的框架,各种语言特性和版本差异都时常让搞的我们头大,不得不浪费 ...
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 Vector (向量)
Vector 看JDK解释(中文翻译)吧: Vector 类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适应创建 ...
- 2018上C语言程序设计(高级)作业- 第0次作业
准备工作(10分) 1.在博客园申请个人博客. 2.加入班级博客(2班班级博客链接地址)(1班班级博客链接地址) 3.关注邹欣老师博客.关注任课老师博客. 4.加入讨论小组,学习过程中遇到问题不要随意 ...
- Beta Scrum Day 3
听说
- python API的安全认证
我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户端时间与服务端的时间戳之差如果大于规 ...
- django搭建web (一)
建立工程 django-admin.py startproject project_name 建立app python manage.py startapp app_name 将app添加进工程中 在 ...