JAVA学习笔记--接口
一、抽象类和抽象方法
在谈论接口之前,我们先了解一下抽象类和抽象方法。我们知道,在继承结构中,越往下继承,类会变得越来越明确和具体,而往上回溯,越往上,类会变得越抽象和通用。我们有时候可能会需要这样一个类,它只是表示了一个接口,但并没有具体的实现,这就是一个抽象类。
抽象方法只有方法声明而没有方法体,也就是说用户并不知道这个方法是如何实现的。抽象方法的声明用到了 abstract 关键字,声明方法如下:
abstract void f(); // 声明一个抽象方法
包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,那么该类必须被限定为抽象的。抽象类也用关键字abstract进行说明。
1)抽象类看起来和普通类相像,但是抽象类不能用new操作符创建它的实例;抽象类中抽象方法只有定义而没有实现,它的实现由子类提供;
2)抽象类可以被继承,但是其导出类必须为基类中所有的抽象方法提供方法定义,如果不这样做,那么导出类也将被强制限定为抽象类;
3)抽象类中可以没有抽象方法,这样的抽象类通常被用作基类型;
4)抽象类的构造方法定义为protected,这个构造方法在其子类的构造方法中被调用;
5)即使父类是具体的,其子类也可以是抽象的;
6)不能用new操作符创建一个抽象类的实例,但是抽象类可以用作一种数据类型被new调用。
下面是一个简单的抽象类的例子:
package com.tongye.abstraction;
abstract class chouxiang{
    abstract void f();        // 抽象方法
}
class chouxiang1 extends chouxiang{
    void f(){
        System.out.println("抽象");
    }
}
public class Abstraction {
    public static void main(String[] args){
        chouxiang1 abstraction = new chouxiang1();
        abstraction.f();
    }
}
二、接口
接口 interface 关键字使抽象的概念更向前迈了一步。abstract关键字允许人们在类中创建一个或多个没有任何定义的方法,即提供了接口部分,但是没有提供具体实现,其实现是由类的继承者来创建的。 interface 关键字产生一个完全抽象的类,它根本没有任何具体实现。
1)接口允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体;接口只提供了形式,而未提供任何具体实现;
2)要创建一个接口,需要用interface关键字来代替class关键字。可以在interface前面添加public关键字(仅限于该接口在与其同名的文件中被定义);如果不声明,则它只包含包访问权限,只能在一个包内可用;
3)接口可以包含域,但这些域隐式地是 static 和 final 的;
4)可以用implements关键字来表明一个类实现了某个特定接口,即: class A implements B{} ;
下面是一个简单的应用接口的例子:
package com.tongye.interfaces;
import java.util.Random;
public interface StudentMessages {
    Random rand = new Random(47);
    int age = rand.nextInt(20);        // 接口中的数据域
    void studentName();                // 接口中的方法,只有方法名而没有方法体
    void studentAge();
    void studentGrade();
}
package com.tongye.interfaces;
/* 类StudMessage1只实现了StudentMessages接口的部分方法,因而是抽象类 */
abstract class StudMessage1 implements StudentMessages {
    private String Stu_Name = "tongye";
    private int Stu_Age = age;
    private char Stu_Grade;
    /* 这是接口中方法的实现 */
    @Override
    public void studentName() {
        getName();
    }
    @Override
    public void studentAge() {
        System.out.println(Stu_Age);
    }
    /* 这是新类自带的方法 */
    public void getName(){
        System.out.println("my name is" + Stu_Name);
    }
}
/* StudMessage2继承自StudMessage1,并实现了StudentMessages接口中的部分方法 */
class StudMessage2 extends StudMessage1{
    @Override
    public void studentGrade() {
        System.out.println("1301");
    }
}
public class Student {
    public static void main(String[] args){
        StudMessage2 stud = new StudMessage2();
        stud.studentName();
        stud.studentAge();
        stud.studentGrade();
    }
}
接口一个很重要的作用就是,可以实现类似C++中的多重继承功能。我们知道,JAVA是不支持多重继承的,但是通过使用接口,我们可以实现类似功能,用来表示“一个x是一个a和一个b以及一个c”。一个类可以继承任意多个接口,这需要将所有的接口都置于implements关键字之后并用逗号隔开;可以将这个类向上转型为每个接口,因为每一个接口都是一个独立的类型。下面这个程序演示了一下接口的这个功能:
/********/
package com.tongye.interfaces; public interface People {
void isPeople();
} /********/
package com.tongye.interfaces; public interface Juniors {
void isJuniors();
} /********/
package com.tongye.interfaces; public interface Chinese {
void isChinese();
} /********/
package com.tongye.interfaces; class students implements People,Chinese,Juniors{
@Override
public void isPeople(){
System.out.println("The student is a people");
} @Override
public void isJuniors() {
System.out.println("The student is a junior");
} @Override
public void isChinese() {
System.out.println("The student is a Chinese");
}
} public class Student{
public static void people(People a){ // 接口作为一种数据类型传递给方法
a.isPeople();
}
public static void junior(Juniors a){
a.isJuniors();
}
public static void chinese(Chinese a){
a.isChinese();
} public static void main(String[] args){
students stud = new students();
people(stud); // stud被向上转型为People类型
junior(stud); // stud被向上转型为Juniors类型
chinese(stud); // stud被向上转型为Chinese类型
}
}
从这个程序中可以看出,类students既是People又是Juniors又是Chinese,在main方法中调用方法people、junior、chinese时,stud分别被向上转型为People、Juniors和Chinese,这大大提升了代码的灵活性。
JAVA学习笔记--接口的更多相关文章
- Java学习笔记之---比较接口与抽象类
		
Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...
 - 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
		
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
 - 0035 Java学习笔记-注解
		
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
 - 0032 Java学习笔记-类加载机制-初步
		
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
 - 0028 Java学习笔记-面向对象-Lambda表达式
		
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
 - 《Java学习笔记(第8版)》学习指导
		
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
 - Java学习笔记-多线程-创建线程的方式
		
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
 - 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
		
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
 - 20145330第九周《Java学习笔记》
		
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
 
随机推荐
- 分布式一致性协议-2PC与3PC(二)
			
一.分布式一致性 一个事务需要跨多个分布式节点,又要保持事务的ACID特性,需要引入协调者来统一调度所有分布式节点的执行逻辑,被调度的节点称为参与者. 协调者负责调用参与者,并决定最终是否提交事务.基 ...
 - ansible批量修改用户密码
			
实现批量修改目标主机多个用户密码: --- - hosts: testchanange passwd gather_facts: false tasks: - name: change you pas ...
 - .net core 实践笔记(一)--开篇
			
** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9902000.html 最近无聊自己设计了一个小项目,基本都使用想用没用 ...
 - JS の 套路  II ~~
			
今天的需求是 给表单赋值 还有修改并保存.以下的方法应该是个本方法,但好上手!! 给表单值 <form> <table> <tbodu> 这里假装有一堆表单的一对t ...
 - Oracle锁处理、解锁方法
			
1.查询锁情况 select sid,serial#,event,BLOCKING_SESSION from v$session where event like '%TX%'; 2.根据SID查询具 ...
 - 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
			
在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...
 - C++ C# VC VC.net以及VC++有什么区别和联系?
			
C/C++是编程语言,C是C++的爸爸,也就是说C++从C发展而来,而C++完全兼容C的语法.国际上有一个专门管理C++的机构,它们负责C++的标准制定. VC++是微软公司的C++编译环境,使用它可 ...
 - HTML5视频播放练习:鼠标经过视频播放,鼠标移除停止播放,再次经过继续播放。
			
随着HTML5的广泛应用,在一些网站中,经常看到有些预览的短视频预览,鼠标经过就会播放,移除就会停止播放,再次移进去就会继续播放. 自己也研究着做一个比较简单的类似的练习. 视频可以自己到包图网下载, ...
 - HTML5--Table
			
1.先给大加看下效果图,有点干劲 2.编写的代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
 - 一条SQL语句的千回百转
			
SQL语言相信大家都不陌生,从本质上来说,它是一种结构化查询语言,是用来数据库之间的通信的编程语言.作为一名Java程序员,我们从Java角度来看,SQL语言相当于Java接口,而数据库是实现这个接口 ...