package cn.zy.cellphone;
/**接口是一种引用数据类型。使用interface声明接口,形式
* 形式:public interface 接口名称{}
* 接口不能拥有构造方法,不能用于创建对象
*接口可以多继承。一个接口可以继承多个其他接口
*列如:public interface Broadcast extends Network,Picture{}
*Broadcast接口就具备了A、B接口中定义的抽象方法。
*/
public interface Broadcast {
/**接口中可以声明属性。接口中定义的所有变量都是static final类型的。
* public static final String version = "1.0";
public int count = 10; // 默认是static final类型
一般很少在接口中声明属性。
*/

package cn.zy.cellphone;

public interface Picture {
public void picture();//照相
}
package cn.zy.cellphone;

public interface Network {
public void network();//网络
}
package cn.zy.cellphone;
/**一个类只能继承一个父类,同时实现多个接口。继承在前,实现在后。
* public class Photo2 extends Photo implements Network,Picture,Broadcast {}
* 实现类实现接口,必须实现接口中定义的抽象方法。
*方法即行为,表示一种功能,接口定义了一套功能,实现类必须实现这些功能 –> 实现类的能力得到拓展。
*/
//实现类(子类)
public class Photo2 extends Photo implements Network,Picture,Broadcast {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Photo2(String brand, String type, String name) {
super(brand, type);
this.setName (name);
}
/**接口中定义的一些系列方法表示的是一种种的能力。接口让实现类实现这些能力,实现类的能力得到拓展和升级。
实现类根据自身特性实现接口中定义的方法。
* 特殊情况:如果一个抽象父类定义了和接口同名的抽象方法,实现类实现的是抽象父类的抽象方法。
*/
public void broadcast() {
System.out.println(this.getName()+"的手机可以播放");
} public void picture() {
System.out.println(this.getName()+super.getBrand()+super.getType()+"的手机可以照相"); } public void network() { System.out.println(this.getName()+super.getBrand()+super.getType()+"的手机可以播放上网");
}
/**实现类(子类)Photo2 手机原本只有下面几个功能,通过接口增加了上面几个功能
* 实现类实现接口,必须实现接口中定义的抽象方法。
*方法即行为,表示一种功能,接口定义了一套功能,实现类必须实现这些功能 –> 实现类的能力得到拓展。
*/ public void sendInfo() {
System.out.println(super.getBrand()+super.getType()+"的手机发信息"); } public void call() {
System.out.println(super.getBrand()+super.getType()+"的手机可以打电话"); } public void info() {
System.out.println(super.getBrand()+super.getType()+"的手机可以发短信"); }
}

package cn.zy.cellphone;
//实现类(子类)
public class Photo1 extends Photo implements Broadcast {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public Photo1() {
super();
} public Photo1(String brand, String type,String name) {
super(brand,type);
this.setName(name);
} public void broadcast() {
System.out.println(this.getName()+"的手机可以播放");
}
public void sendInfo(){
System.out.println(super.getBrand()+super.getType()+"的手机发信息");
}
public void call(){
System.out.println(super.getBrand()+super.getType()+"的手机可以打电话");
}
public void info(){
System.out.println(super.getBrand()+super.getType()+"的手机可以发短信");
} }

package cn.zy.cellphone;
//父类
public abstract class Photo {
private String brand;
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Photo() {
super();
}
public Photo(String brand, String type) {
super();
this.brand = brand;
this.type = type;
}
public abstract void sendInfo();
public abstract void call();
public abstract void info();
}


package cn.zy.cellphone;
//执行类
public class Test {
public static void main(String[] args) {
// 同一引用类型
Broadcast broadcast1=new Photo1("诺基亚","a01","张三");
broadcast1.broadcast(); Photo photo=new Photo1("诺基亚","a01","张三");
photo.sendInfo();
photo.call();
photo.info();
// 同一引用类型
Broadcast broadcast2=new Photo1("苹果X","11S","李四");
broadcast2.broadcast();
// 实例不同, 对同一方法的执行结果不同
Picture picture1=new Photo2("苹果X","11S","李四");
picture1.picture();
Network network1=new Photo2("苹果X","11S","李四");
network1.network();
//多态
Photo photo1=new Photo1("苹果X","11S","李四");
photo1.sendInfo();
photo1.call();
photo1.info();
/**
* 接口实现多态: 接口类型 引用 实现类对象
继 承实现多态: 父类类型 引用 子类对象
接口定义的方法被实现类实现,通过接口引用实现类时,调用接口中的方法时,执行的是实现类实现的方法。
实现类对象具备接口中定义的能力 是一种has a 关系
子类对象是一种父类类型 是一种is a 关系 现在的Photo1同Photo2既是实现类也是子类
*/
}
}

面向接口编程

接口表示一种约定(协议),约定(规范)了实现类应该具备(has a)的能力。

理解:

=>实现类必须实现接口中所有的方法,所以接口规范了实现类的行为

=> 接口约定了实现类应该具备的行为。

面向接口编程

所谓面向接口编程,在程序设计时,只关心实现类具备什么能力,而不关心实现类如何实现这个能力。面向接口编程时,面向接口的约定而不考虑接口的具体实现。

也就是说,面向接口编程时,接口的定义方只关系实现类是否具备接口所定义的能力,而实现类如何被的该能力接口定义方一点都不关心

//接口实现多态 电脑类(通过接口把3种零件组成电脑,而且零件随时可以更换)(cpu接口  4Hz  5Hz  。。。。(随时更换大小不同的cpu)  )
(硬盘接口 3000GB 4000Gb(随时更换大小不同的硬盘))
                                                               (内存接口  30GB  40Gb(随时更换大小不同的内存))     
package cn.computer;
//电脑
public class Computer {
private Cpu cpu; // 预留cpu接口
private Caliche caliche; // 预留硬盘接口
private InternalStroage internalStroage; //预留内存接口
public Cpu getCpu() {
return cpu;
}
public void setCpu(Cpu cpu) {
this.cpu = cpu;
}
public Caliche getCaliche() {
return caliche;
}
public void setCaliche(Caliche caliche) {
this.caliche = caliche;
}
public InternalStroage getInternalStroage() {
return internalStroage;
}
public void setInternalStroage(InternalStroage internalStroage) {
this.internalStroage = internalStroage;
}
public Computer() {
super();
}
public Computer(Cpu cpu, Caliche caliche, InternalStroage internalStroage) {
super();
this.cpu = cpu;
this.caliche = caliche;
this.internalStroage = internalStroage;
}
//把各个部件通过接口组装成一个完整的电脑
public void print(String name) {
System.out.println(name+"计算机");
System.out.println("cpu:"+getCpu().Hz());
System.out.println("硬盘容量:"+getCaliche().big2());
System.out.println("内存容量:"+this.getInternalStroage().big());
} }


package cn.computer;
//cpu接口
public interface Cpu {
public String Hz(); //这是接口实现多态的形式: public 你要返回的变量类型 方法名() }

package cn.computer;
//实现类
public class Realize1 implements Cpu{
public String Hz(){ // public 你要返回的变量类型 方法名()
return "3.8GHz"; //返回值
}
}

package cn.computer;
//内存接口
public interface InternalStroage {
public String big();
}


package cn.computer;
//实现类
public class Realize2 implements InternalStroage{
public String big(){
return "4GB"; } }


package cn.computer;
//硬盘接口
public interface Caliche {
public String big2();
}


package cn.computer;
//实现类
public class Realize2 implements InternalStroage{
public String big(){
return "4GB"; } }


package cn.computer;

public class Test {
public static void main(String[] args) {
Cpu cpu=new Realize1(); //把一种3.8Hz的cpu赋予给cpu接口
Caliche caliche=new Realize3(); //把3000GB的硬盘赋予给硬盘接口
InternalStroage internalStroage=new Realize2(); //把4GB的内存赋予给内存接口
Computer computer=new Computer(cpu,caliche,internalStroage); //把cpu,硬盘,内存给电脑类组合(地址)
computer.print("华硕"); //最后得到了完整的电脑
}
}

1.1.1.1 抽象类和接口的异同比较

  • 抽象类和接口都是引用数据类型,他们都不能创建对象。
  • 他们都可以定义抽象方法,都可以实现多态。但是抽象类可以定义非抽象方法,而接口中定义的都是抽象方法。
  • 抽象类和接口都具有传递性。抽象类是单根性(单继承),而接口是多继承。
  • 在概念上,都可以重写抽象方法。子类重写抽象类,实现类实现接口
  • 抽象类和子类解决的是模块内的问题(代码重用,重写,多态)而接口解决的是模块间的问题 => 高内聚,低耦合。接口可以用解耦模块。

java接口,接口的特性,接口实现多态,面向接口编程的更多相关文章

  1. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  2. java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类

    一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...

  3. Java中关于继承、类、多态、接口的知识点

    继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...

  4. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. 第10章 Java类的三大特性之一:多态

    1.Java中的多态 多态是指对象的多种形态,主要包括这两种: 1.1引用多态 a.父类的引用可以指向本类的对象b.父类的引用可以指向子类的对象举个例子:父类Anmail,子类Dog,可以使用父类An ...

  6. Java环境变量,jdk和jre的区别,面向对象语言编程

    什么是java? java是一门面向对象的编程语言,包括java SE, java ME, Java EE . 广泛使用的是作为后端语言的Java EE开发, 面向对象和面向过程? java,C++ ...

  7. Java知识回顾 (7) 继承、多态与接口、封装

    一.继承 1.1 继承的特性 子类拥有父类非 private 的属性.方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以用自己的方式实现父类的方法. Java 的继承是单继承, ...

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

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

  9. java中封装,继承,多态,接口学习总结

    ### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...

随机推荐

  1. jsp假分页

    假分页:从数据库中取出所有的数据,然后分页在界面上显示.访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接.快速的,避免对数据库的多次访问. 真分页:确定要 ...

  2. springboot全局捕获异常

    捕获 捕获原理,使用AOP技术,采用异常通知. 1.捕获返回json格式 2.捕获返回页面 步骤: 1.@ControllerAdvice(pasePackage="") 注释异常 ...

  3. python学习日记(模块导入)

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  4. android wake lock 电源管理简单学习

    需要配置清单文件:<uses-permission android:name="android.permission.WAKE_LOCK" /> 也可以参考我之前写的这 ...

  5. [USACO19FEB]Mowing Mischief

    题目大意: 给定平面上的一些点,求这些点的一个\(LIS\),并且还需要满足下列式子最小: \[ \sum_{i=1}^{n-1}(a[i+1].x-a[i].x)*(a[i+1].y-a[i].y) ...

  6. [NOIP2017] 列队(平衡树)

    考虑转化题意: 设这次操作删掉点\((x, y)\) 对于每一次向左看齐:在第x行删除\((x, y)\),并将y以后的点全部前移一位 对于每一次向前看齐:x以后的点全部上移一位,并在最后一列插入\( ...

  7. 1068: [SCOI2007]压缩

    题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...

  8. Filebeat 日志收集器 安装和配置

    Filebeat的配置文件是/etc/filebeat/filebeat.yml,遵循YAML语法.具体可以配置如下几个项目: Filebeat Output Shipper Logging(可选) ...

  9. visp库中解决lapack库的问题

    解决的办法是——绕过去,不要用这个库: 使用中发现如下代码抛出异常: //vpTemplateTracker.cpp try { initHessienDesired(I); ptTemplateSu ...

  10. TF Multi-GPU single input queue

    多GPU的数据训练,feed images, labels = cifar10.distorted_inputs() split_images = tf.split(images, FLAGS.num ...