上一篇是分享的是《Java中final关键字的作用和Java抽象类》,首先和大家说一声道歉,原本打算这篇文章更新的是《Java接口和Java类与类之间的关系》,然而Java接口的知识点略多,五一假期也会进来放松放松,所以明天先更新《Java接口》,另一个知识点,咱们前面补上,体谅下哈。
接下来开始进行分享:
Java接口
Java接口概述
计算机通过这些接口能够连贯不同的外设, 扩大了计算机的性能 , 计算机实现了某个接口,就具备了连贯这个接口设施的性能, 没有实现该接口就不具备该性能。
计算机中有USB插槽, 不论是键盘/鼠标/硬盘/打印机,只有有USB插头就能够连贯到电脑上, 这些设施是不同厂商生产的, 它们都遵循USB协定。
Java程序中的接口是用来扩大类的性能的,能够把接口了解为性能的封装, Java中的接口也能够了解为一个操作标准(协定)。
Java接口定义与实现
1.Java接口定义的语法:
[修饰符] interface 接口名 {
接口中的办法默认应用public abstract润饰
接口中的字段默认应用 public static final润饰
接口中能够定义public static 静态方法
定义public default办法
}
2.Java接口的应用
[修饰符] class 类名 implements 接口{
须要重写接口的形象办法
package com.wkcto.chapter01.interfaces.demo01;/*** 定义航行接口* 封装航行性能* @author**/public interface Flyable {//接口中的办法默认应用public abstract润饰void fly();}
package com.wkcto.chapter01.interfaces.demo01;/*** 定义鸟类* 一个类实现了接口,须要重写接口中形象办法** @author**/public class Bird implements Flyable {@Overridepublic void fly() {System.out.println("小鸟在天空中自在翱翔");}}
练习:定义接口封装游泳性能, 鱼会游泳, 小狗会游泳, 人会游泳。
Java接口多态
package com.wkcto.chapter01.interfaces.demo01;/*** 1) 接口是一种援用数据类型,能够定义变量,然而接口不能实例化对象, 接口援用能够赋值实现类对象* 2) 接口多态 , 通过接口援用调用接口中形象办法,实际上执行的是实现类对象的办法* 接口存在的意义就是为了实现多态.** @author**/public class Test {public static void main(String[] args) {//1)接口定义变量Flyable flyable ;//2)接口不能实例化对象// flyable = new Flyable(); //Cannot instantiate the type Flyable//3)接口援用能够赋值实现类对象flyable = new Bird();flyable.fly();flyable = new Plane();flyable.fly();}}
package com.wkcto.chapter01.interfaces.demo01;/*** 测试弹弓能够把能飞的物体给射出去* @author**/public class Test02 {public static void main(String[] args) {//创立弹弓对象Slingshot slingshot = new Slingshot();//创立鸟对象Bird bird = new Bird();slingshot.shoot(bird);//创立飞机对象Plane plane = new Plane();slingshot.shoot(plane);}}
package com.wkcto.chapter01.interfaces.demo01;/*** 弹弓类* 能够把任何能飞物体给弹射进来** 常常, 把接口的援用作为办法的形参, 在调用办法时,传递接口实现类的对象* @author**/public class Slingshot {//能够把任何能飞物体给弹射进来, 如果这个物体实现了Flyable航行接口就能飞public void shoot( Flyable flyable ) {//实际上是物体 在飞flyable.fly();}}
练习:游泳馆只接管会游泳的动物来游泳。
Java接口阐明
1.类实现了某个接口,须要重写接口中的形象办法,就具备了接口中定义的性能; 如果一个类实现了接口,没有重写接口中所有的形象办法,这个类须要定义为抽象类。
2.一个类能够实现多个接口, 接口名之间应用逗号分隔, 这个类须要重写所有接口中所有的形象办法。
3.接口也能继承,并且反对多继承, 在子接口中能够扩大接口的性能。
4.接口的内容在JDK8中, 只蕴含四局部: public abstract默认的办法, public static final默认的字段, public static静态方法, public default办法。
Java抽象类与接口的异同点
相同点
1.都能够定义形象办法
2.都不能实例化对象
3.接口/抽象类的形象办法都须要被重写
4.接口/抽象类中都能够定义 public static final字段, public static静态方法
不同点
1.意义不同
抽象类对类进行更高层级的形象
接口是对性能的封装
2.定义形式不同
抽象类应用 abstract class定义
接口应用interface定义
3.内容不同
抽象类中除了能够定义形象办法外, 还能够定义实例变量/实例办法/动态变量/静态方法,构造方法等一般类所有的成员。
接口中除了形象办法外, 还能够定义public static final字段, public static办法,public default办法 。
抽象类有构造方法, 接口没有构造方法; 接口中能够应用default润饰办法,抽象类不能应用default润饰办法。
4.应用形式不同
抽象类个别作为父类存在, 须要子类通过extends继承。
接口须要通过类implements实现。
5.继承
类只反对单继承, 接口反对多继承
6.利用场景不同
如果仅仅是为了扩大类的性能,优先选择接口;
如果除了性能外,还须要保留不同的数据,抉择抽象类, 抽象类中的形象办法,须要在子类中重写, 抽象类能够束缚所有的子类都具备某个性能。
Java接口的利用
1.接口就是性能的封装
如在Flyable接口中封装了fly()航行性能, 如果类实现了Flyable接口,须要重写fly()办法,就扩大了类的性能。
如零碎定义的Comparable接口, 封装了比拟两个对象的性能, 如果一个类想要比拟两个对象的大小, 能够实现Comparable接口。
package com.wkcto.chapter01.interfaces.demo03;/*** 定义Person类,* 想要让Person类的对象具备比拟大小的性能, 能够通过实现Comparable接口实现这个需要* Comparable接口前面的<T>是一个泛型 ,泛型就是把数据类型作为参数* 通过Comparable前面的泛型指定比拟对象的数据类型* @author**/public class Person implements Comparable<Person> {String name;int age;int height;/*** 重写接口的形象办法, 指定比拟规定* 如果以后对象比参数o对象大就返回负数, 如果以后对象小于参数对象返回正数, 如果两个对象相等返回0*/@Overridepublic int compareTo(Person o) {//在该办法中,指定比拟规定,依据年龄比拟return this.age - o.age;}public Person(String name, int age, int height) {super();this.name = name;this.age = age;this.height = height;}}
2.接口能够了解为一组操作标准(一个协定)
百度新闻蕴含首页/体育/游戏/女人/汽车等模块, 不论哪个模块都有增加新闻,删除新闻,批改新闻,查问新闻. 能够把这些性能定义在一个接口中, 不同的模块通过实现这个接口来对立他们的操作。
提倡面向接口的编程
1.接口的应用比拟灵便, 一个类在继承父类的同时,能够实现多个接口
形容打工的学生, 打工的学生既有学生的特点,又有工人的特色,如果容许类的多继承的话,能够间接让打工的学生同时继承学生类与工人类。
Java不容许多继承, 能够让打工的学生继承学生类, 把打工这个操作定义为接口, 打工的学生实现打工接口。
形容了打工的学生,从某种程度上,还能解决类的多继承问题
package com.wkcto.chapter01.interfaces.demo04;/*** 定义学生类,作为父类* @author**/public class Student {String name;public void study() {System.out.println}}
package com.wkcto.chapter01.interfaces.demo04;/*** 定义工作接口* @author**/public interface Workable {void work();}
package com.wkcto.chapter01.interfaces.demo04;/**** 在继承Student类的同时,实现Workable接口* @author**/public class PartTimeStudent extends Student implements Workable, Singable {//重写接口中的形象办法@Overridepublic void work() {System.out.println}@Overridepublic void sing() {System.out.println}}
练习1
1.形容带橡皮的铅笔,铅笔是一种笔,有擦除的性能。
2.接口比拟容易扩大, 能够实现代码的可插拔
常常把接口的援用作为办法的形参, 在调用办法时,能够传递各种实现类对象
弹弓能够弹射能飞的物体, 游泳馆只接管会游泳的动物
3.接口能够使我的项目分层
一台计算机能够实现很多不同的接口, 接口比拟灵便
计算机的USB插槽, 只有有USB插头的设施就能够连贯到电脑上, 接口易扩大
生产电脑的厂商有联想/Dell/华硕等, 生产USB设施的也有很多不同的厂商, 使我的项目分层
在上图的模型中, 通过接口把我的项目简略地分为两层, 一个团队负责开发业务逻辑,一个小组负责开发数据库的操作及优化, 对开发人员的要求升高了;当数据库发生变化后,只须要由数据库的开发人员定义一个专门的操作数据库的类即可, 业务逻辑代码不须要更改。
package com.wkcto.chapter01.interfaces.demo05;/*** 定义操作数据库的接口* 在接口中定义一组操作数据库的标准* @author**/public interface DaoService {void add(); //向数据库中增加数据void delete(); //删除数据void update(); //批改数据void list(); //显示所有数据}
package com.wkcto.chapter01.interfaces.demo05;/*** 业务逻辑模块1* 操作数据库, 通过DaoService接口实现* @author**/public class LogicModel1 {DaoService dao; //定义一个接口的援用//增加数据public void addData() {System.out.println("业务逻辑模块1, 须要向数据库中增加数据");dao.add();}//删除数据public void deleteData() {System.out.println("业务逻辑模块1, 须要从数据库中删除数据");dao.delete();}//批改数据public void updateData() {System.out.println("业务逻辑模块1, 须要在数据库中批改数据");dao.update();}//显示所有数据public void listAllData() {System.out.println("业务逻辑模块1, 须要从数据库中显示所有数据");dao.list();}}
package com.wkcto.chapter01.interfaces.demo05;/*** 定义一个操作MySQL数据库的类, 须要实现DaoServic接口* @author**/public class MySqlDaoImpl implements DaoService {@Overridepublic void add() {System.out.println("向MySQL数据库中增加数据");}@Overridepublic void delete() {System.out.println("从MySQL数据库中删除数据");}@Overridepublic void update() {System.out.println("在MySQL数据库中批改数据");}@Overridepublic void list() {System.out.println("从MySQL数据库中查问所有数据");}}
package com.wkcto.chapter01.interfaces.demo05;/*** 测试业务逻辑模块操作数据库* @author**/public class Test {public static void main(String[] args) {LogicModel1 model1 = new LogicModel1();//须要配置业务逻辑模块中dao接口援用// model1.dao = new MySqlDaoImpl();//如果数据库由MySQL换为Oracle, 须要定义一个操作ORacle数据库的类,批改业务逻辑模块 dao接口的配置model1.dao = new OracleDaoImpl();model1.addData();model1.updateData();model1.deleteData();model1.listAllData();}}
练习2
模仿所有动物都能够应用本人的交换形式进行交换, 人说人话,狗说狗语。
package com.wkcto.chapter01.interfaces.demo06;/*** 定义谈话形式接口* @author**/public interface Speakable {void speak(); //谈话}
package com.wkcto.chapter01.interfaces.demo06;/*** 汪语* 是一种谈话形式* @author**/public class WangWang implements Speakable {@Overridepublic void speak() {System.out.println("汪汪汪~~~~");}}
package com.wkcto.chapter01.interfaces.demo06;/*** 定义动物类* 每个 动物都有本人的谈话形式* 动物能够应用本人的谈话形式进行交换* @author**/public abstract class Animal {Speakable speakable; //每个 动物都有本人的谈话形式public Animal(Speakable speakable) {super();this.speakable = speakable;}//能够应用本人的谈话形式进行交换public void talk() {speakable.speak();}}
package com.wkcto.chapter01.interfaces.demo06;/*** 小狗是一种动物* @author**/public class Dog extends Animal {public Dog(Speakable speakable) {super(speakable);}}
package com.wkcto.chapter01.interfaces.demo06;/*** 测试每种动物能够应用本人的谈话形式进行交换* @author**/public class Test {public static void main(String[] args) {WangWang wangWang = new WangWang(); //小狗的谈话形式Dog dahuang = new Dog(wangWang); //在创立小狗对象时,须要指定它的谈话形式dahuang.talk();MiaoMiao miaoMiao = new MiaoMiao();Cat mimi = new Cat(miaoMiao);mimi.talk();}}
下面就是《Java接口》。的分享,接下来为大家梳理《Java类与类之间的关系》。
也欢送大家交换探讨,该文章若有不正确的中央,心愿大家多多包涵。
你们的反对就是我最大的能源,如果对大家有帮忙给个赞哦~~~