接口以及 LeetCode 每日一题
1 接口
1.1 接口的概念
接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心类内方法的实现细节,只是规定这批类里面必须提供某些方法。所以接口体现的是规范和实现分离的设计哲学。
1.2 定义接口
[修饰符] interface 接口名 extends 父接口 1, 父接口 2...{
零到多个常量
零到多个抽象方法
(零到多个内部类、接口、枚举定义、私有方法、默认方法、类方法...)
}
- 修饰符可以是 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。
这道题没有做出来,尝试了几遍失败了,没忍住看了答案,不得不感叹别人的思路简洁、高效,接下来贴上答案:
class Solution {
public int maxSubArray(int[] nums) {
int res = nums[0];
int sum = 0;
for (int num : nums) {
if (sum > 0)
sum += num;
else
sum = num;
res = Math.max(res, sum);
}
return res;
}
}
// -------@ rui
若 sum<=0,那么后面的子序列肯定不包含目前的子序列,所以令sum = num,重新计和;如果sum > 0对于后面的子序列是有好处的。res = Math.max(res, sum)保证在全是负数的时候可以找到最大的子序和。这个解法巧妙的地方在,根本没有将目标放在找子序列中,而是直击题目本质,找一个最大的和。
接口以及 LeetCode 每日一题的更多相关文章
- 【js】Leetcode每日一题-制作m束花所需的最少天数
[js]Leetcode每日一题-制作m束花所需的最少天数 [题目描述] 给你一个整数数组 bloomDay,以及两个整数 m 和 k . 现需要制作 m 束花.制作花束时,需要使用花园中 相邻的 k ...
- 【JavaScript】Leetcode每日一题-在D天内送包裹的能力
[JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
- 【js】Leetcode每日一题-数组异或操作
[js]Leetcode每日一题-数组异或操作 [题目描述] 给你两个整数,n 和 start . 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == ...
- 【js】Leetcode每日一题-解码异或后数组
[js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...
- 【JavaScript】Leetcode每日一题-青蛙过河
[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【JavaScript】Leetcode每日一题-递增顺序搜索树
[JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...
随机推荐
- Python3 urllib.request库的基本使用
Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...
- 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等
之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...
- golang项目中使用条件编译
golang项目中使用条件编译 C语言中的条件编译 golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和de ...
- 虚拟机搭建CentOS主机win10通过xshell连接
目标:主机是win10系统,虚拟机搭建CentOS,在主机上通过XShell连接操作. 第一步 主机上安装虚拟机 第二步 下载CentOS 下载地址http://101.110.118.69/isor ...
- 解决error while loading shared libraries的通用方案
1. 首先 find / -name libevent-1.4.so.2 找到缺少的链接文件到底在那儿. 2. LD_DEBUG=libs LD_DEBUG=libs /usr/local/bin/f ...
- 译MassTransit 创建消息消费者
创建消息消费者一个消息消费者是一个 可以消费一个或多个消息类型的类,指定IConsumer<T>接口,T为消息类型 public class UpdateCustomerConsumer ...
- Python软件目录结构规范
设计项目目录结构和'代码编码风格'一样, 是为了达到以下两点: 可读性高 可维护性高 目录组织方式 Stackoverflow上有一些比较好的范式.
- Asp.Net WebAPI中Filter过滤器的使用以及执行顺序
转发自:http://www.cnblogs.com/UliiAn/p/5402146.html 在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行 ...
- bzoj 2428 均分数据 模拟退火
模拟退火 按照自己的思路打了,结果WA,发现退火最关键的就是初温,降温,和修改次数, 这个题还在外层带了一个循环,骚气 #include<cstdio> #include<iostr ...
- BZOJ_3261_最大异或和_可持久化trie
BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...