接口以及 LeetCode 每日一题
2019-04-26 08:20:31来源:博客园 阅读 ()
1 接口
1.1 接口的概念
接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心类内方法的实现细节,只是规定这批类里面必须提供某些方法。所以接口体现的是规范和实现分离的设计哲学。
1.2 定义接口
1 [修饰符] interface 接口名 extends 父接口 1, 父接口 2...{ 2 零到多个常量 3 零到多个抽象方法 4 (零到多个内部类、接口、枚举定义、私有方法、默认方法、类方法...) 5 }
- 修饰符可以是 public 或省略;
- 接口名命名规则与类名规则相同;
- 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类;
- 接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义,接口不能产生实例;
- 定义接口成员时可以省略修饰符,常量默认是 public static final 修饰,方法默认是 public abstract 修饰。
1.3 使用接口
接口不能用于创建实例,但接口可以用于声明应用类型变量。当使用接口来声明引用类型时,这个引用类型变量必须引用到其实现类的对象。
让类继承接口时,需要在类定义后增加 implements 部分,可以实现多个接口,多个接口之间用“,”隔开。一个类可以继承一个父类,并同时实现多个接口,implements 部分必须放在 extends 部分之后。一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法,否则,该类将保留从接口那里继承到的抽象方法,该类也必须定义成一个抽象类。
1.4 接口和抽象类
接口和抽象类的共同点:
- 接口和抽象类都不能被实例化,他们都位于继承树的顶端,用于被其他类实现和继承。
- 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
但二者的区别也非常大,主要体现在二者设计的目的上:
- 接口体现的是一种规范,接口规定了实现者必须向外提供哪些服务;对于接口的调用者来说,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。当一个程序使用接口时,接口是多个模块间的耦合标准;当在多个应用程序间使用接口时,接口是多个程序之间的通信标准。
- 抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计。抽象类可以被当作系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品
1.5 面向接口编程
举个简单的例子,当我们要设计一个“打印机类”时,若采用面对对象的方法,该打印机构造时需要传入一个墨盒和一种纸张抽象类型,打印时则调用这两个引用变量进行打印。A4、A5等纸张都继承了这个抽象类型,可以传入打印机以供打印。
看似非常合理,但是这里已经局限死了,传进来的必须是“纸张”。而实际上打印机需要的不是“纸”,只是需要一个具有“扁平”、“能够着墨”的东西即可,纸的很多特性这里完全没有用上,所以这里采用面向对象的方法,限制了打印机的扩展性。
而采用面向接口的编程思路呢,我们只要对象实现了“看起来像纸”、“着墨”的方法,就可以传进来供打印机使用,而不管它的其它细节,它可以是纸、可以是树叶、可以是一块布、等等。所谓面向接口编程,在程序设计时,只关心实现类具备什么能力,而不关心实现类如何实现这个能力。
2 LeetCode
力扣
53. 最大子序和
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
这道题没有做出来,尝试了几遍失败了,没忍住看了答案,不得不感叹别人的思路简洁、高效,接下来贴上答案:
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int res = nums[0]; 4 int sum = 0; 5 for (int num : nums) { 6 if (sum > 0) 7 sum += num; 8 else 9 sum = num; 10 res = Math.max(res, sum); 11 } 12 return res; 13 } 14 } 15 // -------@ rui
若 sum<=0,那么后面的子序列肯定不包含目前的子序列,所以令sum = num,重新计和;如果sum > 0对于后面的子序列是有好处的。res = Math.max(res, sum)保证在全是负数的时候可以找到最大的子序和。这个解法巧妙的地方在,根本没有将目标放在找子序列中,而是直击题目本质,找一个最大的和。
原文链接:https://www.cnblogs.com/carlosouyang/p/10771005.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:如何提高使用Java反射的效率?
下一篇:MySQL 四种隔离级别
- Spring系列.ApplicationContext接口 2020-06-11
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
- Java跨平台原理(字节码文件、虚拟机) 以及Java安全性 2020-06-07
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- Java生鲜电商平台-生鲜电商接口幂等性原理与防重复提交方案( 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash