接口

可以理解为一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法所组成

接口的定义格式

接口的数据成员,只允许被public, static, final修饰。 接口的方法成员,只允许被public, abstract修饰。

Interface 接口名称{

  private static final int var1=1;  //error

  public static final int var2 = 2;

  public abstract void fun1();

  private abstract int fun2();    //error.

}

接口中的数据成员都为static final类型,必须进行初始化,且接口的数据成员的值不能被修改,允许省略static, final关键字。 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字

public interface A{

  int num;    //error. 没初始化

  String name = “test”;

  public void getName( ) {……}  //error.不允许定义方法体

}

接口的实现 接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象 与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口。 实现格式: class 子类名称 implements 接口A, 接口B,….{ //子类成员声明 } 接口的使用必须通过子类,子类必须覆写全部抽象方法。一个子类虽然只能继承于一个父类,但可以同时实现多个接口。

interface A{

public String name = “小明”;

public void print();

public String getName();

}

interface B{

  public void setName();

}

class C implements A, B{

  public void print( ) { ……};

  public  String getName( ) {……};

  public  void setName( ) {……};

}

必须实现接口中的所有方法,否则,实现接口的类将带有抽象方法,因此成为抽象类。 在覆写来自接口的方法时,必须声明成public。

class C implements A, B{

  //public void print( ) { ……};     //没覆写print方法,编译不过。

  public  String getName( ) {……};

  public  void setName( ) {……};

}

对象转型

对象可以被转型为其所属类实现的接口类型。 接口不可通过new实例化,但可以声明接口变量。

public class Test implements A{

  intidx = 1;

  public void print(){

    System.out.println(“”)

  }

  public String getName(){       }

public static void main(String []agrs){

    Test test = new Test();

  A a = (A)test;   //对象转型为接口类型

  System.out.println(a.name);    //输出name的值

   a.idx = 2;   //error. idx属于test,在接口A中不存在

  a.print();     //执行Test的print方法。

  }

}

继承抽象类实现接口

一个子类可以同时继承抽象类和实现接口 格式如下: class 子类 extends 抽象类 implements 接口A,接口B,……{  }

接口的继承

接口不能继承一个抽象类,却可以通过extends同时继承于多个接口。

public abstract class base {……}

interface B {……}

interface C{……} i

nterface A extends base{……}    //错误

interface A extends B, C{ ……}    //正确

接口与继承的区别

No.

区别

抽象类

接口

1.定义:

以abstract声明,抽象方法可有可无。

以interface声明,由静态常量和抽象方法组成。

2.组成:

构造方法、抽象方法、普通方法、常量、变量。

静态常量、抽象方法。

3.使用:

子类继承抽象类(extends)。

子类实现接口(implements)。

4.关系:

抽象类可以实现多个接口。

接口不能继承抽象类,但允许继承多个接口。

5.对象:

都通过对象的多态性产生实例化对象。

6.局限:

抽象类有单继承的局限。

接口可以实现多重继承。

7.选择:

如果抽象类和接口都可以使用的话,优先使用接口,可以避免单继承的局限。

多态

是指不同类型的对象可以响应相同的消息,从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的 ◦

例如

所有的Object类的对象都响应toString()方法

多态性在java中主要有以下两种体现:

方法的重载与覆写。

对象的多态性。

对象的多态性

对象的多态性主要分为以下两种类型:

1.向上转型:子类对象->父类对象

对于向上转型,程序会自动完成。

//BaseClass为父类,DerivedClass为BaseClass的派生类

BaseClass bc = new DerivedClass();   //隐式转型。

2.向下转型:父类对象->子类对象

对于向下转型,必须明确指明要转型的子类类型。

BaseClass bc = new DerivedClass();   //先向上转型

DerivedClass dc = (DerivedClass)bc;

public class A{

  String name = “A”;

  public void fun1(){

    System.out.println(“A->fun1”);

  }

  public void fun2(){

    System.out.println(“A->fun2”);

  }

}

public class B extends A{

String name = “B”;

public void fun1(){

System.out.println(“B->fun1”);

}

public void fun3(){

System.out.println(“B->fun3”);

}

}

向上转型:

public class Demo{

public static void main(String args[]){

A a = new B( );

a.fun1();     //输出什么?  B->fun1

a.fun2();     //输出什么?  A->fun2

a.fun3();     //error. A中没定义fun3方法

System.out.println(a.name);   //输出什么?

}

}

向下转型

public class Demo{

public static void main(String args[]){

//B b = (B)new A( );   //强制转型,运行后抛出异常

A a = new B();

B b = (B)a;   //向下转型

b.fun1();     //输出什么? A->fun1

b.fun2();     //输出什么? A->fun2

b.fun3();     //输出什么? B->fun3

}

}

要想产生对象的向下转型,则必须先产生一个向上的转型关系, A a = new B(); 表示建立关系。

多态的目的

所有的对象都可被转型为相同的类型,响应相同的消息 使代码变得简单且容易理解 使程序具有很好的“扩展性”

应用实例

技术基础 ◦向上转型:一个父类的引用变量可以指向不同的子类对象。 ◦动态绑定:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。 例子1:司机开车 public abstract class Driver{

public Driver( ) { }

public abstract void drives( );

}

public class FemaleDriver extends Driver {

public FemaleDriver( ) { }

public void drives( ) {

System.out.println("A Female driver drives a vehicle.");

}

}

public class MaleDriver extends Driver {

public MaleDriver( ) { }

public void drives( ) {

System.out.println("A Male driver drives a vehicle.");

}

}

public class Test{

public static void main(String [ ] args){

Driver a = new FemaleDriver( );

Driver b = new MaleDriver( );

a.drives( );

b.drives( );

}

}

输出结果:A Female driver drives a vehicle.

A Male driver drives a vehicle.

例子2——司机开什么车 不利用对象多态性的做法

public class MaleDriver extends Driver {

public MaleDriver( ) { }

public void drivesBus( ) {

System.out.println("A Male driver drives a bus.");

}

public void drivesCar( ){

System.out.println("A Male driver drives a car.");

}

public void drivesTruck( ){

System.out.println("A Male driver drives a truck.");

}

……

}

利用对象多态性的做法

public abstract class Vehicle{

  public void drivedByFemale( );

  public void drivedByMale();

}

public class Bus extends Vehicle{

  public void drivedByFemale( ){

    System.out.println("A Female driver drives a bus.");

  }

  public void drivedByMale(){

    System.out.println("A Male driver drives a bus.");

  }

}

public class MaleDriver extends Driver {

  public void drives(Vehicle  v){

    v. drivedByMale();

  }

}

public class Test{

  public static void main(){

    Vehicle bus = new Bus();

    Driver male = new MaleDriver();

    male.drives(bus);

  }

}

输出结果: A Male driver drives a bus

Java接口与多态的更多相关文章

  1. Java 接口和多态

    接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...

  2. java 接口实现多态

    package unit4; import java.awt.Graphics; public interface Shape { void drowme(Graphics g); double ar ...

  3. Java 接口和多态练习

    我们鼠标和键盘实现USB接口,那么我们鼠标和键盘就变成了USB设备,这时候我们就可以把它放到笔记本电脑里面去用 package com.biggw.day10.demo07; /** * @autho ...

  4. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  5. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  6. Java 基础 接口和多态

    接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...

  7. Java 面向对象之接口、多态

    01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...

  8. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  9. java抽象类、多态、接口

    抽象类 抽象类的产生 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体. 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但 ...

随机推荐

  1. SpringCloud---API网关服务---Spring Cloud Zuul

    1.概述 1.1 微服务架构出现的问题   及  解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...

  2. 解决执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error

    最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...

  3. gcd函数两种实现(参考)

    注意: %a= a%-----溢出 递归: #include<stdio.h> int gcd(m,n) { int g; ) g=m; else g=gcd(n,m%n) return ...

  4. .netCore2.0 配置文件

    之前的asp.net 的配置文件都是xml格式,而.netCore的配置文件则采用Json键值对的格式来存储,具体获取如下 var config = new ConfigurationBuilder( ...

  5. mysql服务器运维简单命令介绍

    1.mysql>show processlist; 此处关注查询时间,关注谁锁住了表,谁最多: 2.查看开启的日志 mysql>show global variables like '%l ...

  6. Web后台模拟前端post(带NTLM验证)

    using System.Data; using System.Net; using System.IO; using System.Net.Http; using System.Web; using ...

  7. 一:Shiro知识整理

    一:springboot快速入门: 1.建立Maven项目,导入springboot父工程 <!-- 继承springboot默认父工程 --> <parent> <gr ...

  8. Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details

    环境 Android studio 3.0 导入开源中国: ... dependencies { //noinspection GradleDependency classpath 'com.andr ...

  9. Spring Security +Oauth2 +Spring boot 动态定义权限

    Oauth2介绍:Oauth2是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 简单的来说,当用户登陆网站的时候,需要账号 ...

  10. Spring 中的scope

    scope有Singleton.Prototype.request.session.global session.其中主要的是singleton和prototype. singleton指的是IOC容 ...