抽象方法

函数式接口

核能气质少年 提交于 2019-12-03 07:25:14
为什么要用函数式接口 在函数式编程思想下,允许函数本身作为参数传入另一个函数. 使用函数式接口实现"传递行为"的思想. Lambda表达式也需要函数式接口的支持 什么是函数式接口 总结: 函数式接口 只有一个抽象方法 函数式接口的标识@FunctionalInterface 解释 1.如果一个接口只有一个抽象方法 那么这个接口就是一个函数式接口 2.如果我们在某个接口上声明了@FunctionalInterface注解 那么编译器就会按照函数式接口的定义来要求该接口 不符合报错 3.如果某个接口只有一个抽象方法 但该接口并没有声明@FunctionalInterface注解 编译器仍然会将该接口看作函数式接口 4.如果是函数式接口 该接口也重写了Object类的公共的抽象方法 该重写方法不会增加该接口的抽象方法个数 该接口仍然是函数式接口 不会报错 因为Object类是所有的类的父类 该函数式接口如果有实现类 会直接实现Object类的这个抽象方法   不会实现该函数接口中重写了Object类的抽象方法 也就是说该函数式接口 不会把重写了Object类的公共的抽象方法 看作是抽象方法 该函数式接口的抽象方法仍然是一个 所以符合函数式接口的定义 怎么使用函数式接口 自定义一个函数式接口 a.正确的 b. 错误的 不符合只有一个抽象方法 c. 正确的 可以有Object公共的抽象方法

JAVA-基础

早过忘川 提交于 2019-12-03 02:03:17
一、Java 基础   1.JDK 和 JRE 有什么区别?   答:JRE 是 Java Runtime Environment 的缩写,顾名思义是 java 运行时环境,包含了 java 虚 拟机,java 基础类库。是使用 java 语言编写的程序运行所需要的软件环境,是提供给想运行 java 程序的用户使用的,还有所有的 Java 类库的 class 文件,都在 lib 目录下,并且都打包成 了 jar。 Jdk 是 Java Development Kit 的缩写,顾名思义是 java 开发工具包,是程序员使用 java 语言编写 java 程序所需的开发工具包,是提供给程序员使用的。JDK 包含了 JRE,同时还包 含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具:jconsole, jvisualvm 等工具软件,还包含了 java 程序编写所需的文档和 demo 例子程序。 如果你需要运行 java 程序,只需安装 JRE 就可以了。如果你需要编写 java 程序,需要 安装 JDK。   2.== 和 equals 的区别是什么?   答: (1):对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; (2)equals 解读 equals

接口的默认方法和静态方法

匿名 (未验证) 提交于 2019-12-03 00:39:02
默认方法和抽象方法的区别是,抽象方法需要实现,而默认方法不需要; 默认方法会被实现类继承或重写。 所以默认方法被实现有三种可能: 1)完全不管默认方法,因为实现类会继承接口的默认方法; public interface Instrument { public void play(); default void test(){ System.out.println("this is default"); } } public class Woodwind implements Instrument { @Override public void play() { System.out.println("this is play"); } public static void mian(String[] args) { Woodwind woodwind = new Woodwind(); woodwind.play(); woodwind.test(); } } 结果: this is play this is default 2)重新声明默认方法,使其抽象化; public interface Instrument { public void play(); default void test(){ System.out.println("this is default"); }

编程原则浅析

匿名 (未验证) 提交于 2019-12-03 00:32:02
作者: pengdai 出处: https://www.cnblogs.com/pengdai 一、开发原则 S:单一职责SRP O:开放封闭原则OCP L:里氏替换原则LSP I:接口隔离法则 D:依赖倒置原则DIP 合成/聚合复用原则 迪米特法则 在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则和具体阐述意义。 面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有迪米特法则和合成复用原则等,所以在常见的文章中有表示写六大或七大原则的; 除此之外我还将给出一些其它相关书籍和互联网上出现的原则; Single-Responsibility Principle,一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则的引申,将职责定义为引起变化的原因,以提高内聚性减少引起变化的原因。 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。(Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.),即又定义有且仅有一个原因使类变更

抽象类

匿名 (未验证) 提交于 2019-12-03 00:27:02
抽象类特点: 抽象类和抽象 方法必须用关键字abstract关键字修饰 abstract class 类名{} abstract void 方法名(); 抽象类不一定有抽象方法,有抽象方法的类一定第抽象类 抽象类的子类:要么是一个抽象类,要么重写抽象类的所有的所有抽象方法 抽象类的成员方法特点 abstract不能修饰成员变量 abstract不能与那些关键字并存 private: abstract是表明希望被覆盖的,但是private,子类看不到。 static: 如果是static就需要创建对象 但abstract不需要创建对象(没有意义) final:final表示不能被子类覆盖 abstract表名希望被覆盖 文章来源: 抽象类

GOF(一) 代理模式(Proxy pattern)

匿名 (未验证) 提交于 2019-12-03 00:22:01
核心作用 通过代理,控制对对象的访问。 可以详细控制某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(AOP面向切面的微观实现),从而将统一流程放到代理类中处理。 核心角色 抽象角色 : 定义代理角色和真实角色的公共对外方法。 真实角色 : 实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用。 代理角色 : 实现抽象角色,是真实角色的代理(即,持有对真实角色的引用),通过真实角色的业务逻辑来实现抽象方法,可以附加自己的操作。 分类 静态代理:静态定义代理类 动态代理:动态生成代理类 静态代理的实现 以明星唱歌为例,假设流程如下:面谈――签合同――订票――唱歌(明星本人)――收款 1.定义抽象角色 package Proxy . staticProxy ; /** * 抽象角色:定义代理角色和真实角色的公共对外方法 * @author baka * */ public interface Star { /** * 面谈 */ public void confer (); /** * 签合同 */ public void signContract (); /** * 订票 */ public void bookTicket (); /** * 唱歌 */ public void sing (); /** * 收款 */ public void

工厂模式

匿名 (未验证) 提交于 2019-12-03 00:22:01
在一次面试中了解到工厂模式在实际应用中的重要性,可以说工厂模式的应用随处可见,以下是百度百科对工厂模式的介绍 实例化对象模式 了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的 可扩展性 和 尽量少的修改量 。 一.简单(静态)工厂模式 1,首先建立一个产品的抽象类 需要生产什么产品(实例对象)就需要首先建立一个相应产品的抽象类 public abstract class INoodles { /** * 描述每种面条啥样的 */ public abstract void desc (); } 2.再建立几种具体的产品类如: 这里建立了三个产品类:兰州拉面,泡面,干扣面(没吃过) public class LzNoodles extends INoodles { @Override public void desc () { System.out.println( "兰州拉面" ); } } public class PaoNoodles extends

面向对象的四大基本特征和五大基本原则

匿名 (未验证) 提交于 2019-12-03 00:22:01
面向对象主要有四大特性 抽象 忽略一个主题中与当前目标无关的东西 , 专注的注意与当前目标有关的方面 .( 就是把现实世界中的某一类东西 , 提取出来 , 用程序代码表示 , 抽象出来的一般叫做类或者接口 ). 抽象并不打算了解全部问题 , 而是选择其中的一部分 , 暂时不用部分细节 . 抽象包括两个方面 , 一个数据抽象 , 而是过程抽象 . 数据抽象 --> 表示世界中一类事物的特征 , 就是对象的属性 . 比如鸟有翅膀 , 羽毛等 ( 类的属性 ) 过程抽象 --> 表示世界中一类事物的行为 , 就是对象的行为 . 比如鸟会飞 , 会叫 ( 类的方法 ) 封装 封装就是把过程和数据包围起来 , 对数据的访问只能通过特定的界面 . 如私有变量 , 用 set,get 方法获取 继承 一种联结类的层次模型 , 并且允许和鼓励类的重用 , 提供一种明确表达共性的方法 . 对象的一个新类可以从现有的类中派生 , 这个过程称为类继承 . 新类继承了原始类的特性 , 新类称为原始类的派生类 ( 子类 ), 原始类称为新类的基类 ( 父类 ). 派生类可以从它的父类哪里继承方法和实例变量 , 并且类可以修改或增加新的方法使之更适合特殊的需要 . 因此可以说 , 继承为了重用父类代码 , 同时为实现多态性作准备 . 多态 多态是指允许不同类的对象对同一消息做出响应 .

Servlet接口的抽象方法实现

匿名 (未验证) 提交于 2019-12-03 00:14:01
1.init:初始化方法,在Servlet被创建时执行,只会执行一次2.service:提供服务,每此Servelet被访问时service都会执行3.destroy:销毁方法,在服务器正常关闭时执行4.servletConfig:Servlet的配置对象5.getServletInfo:获取Servlet的一些信息,版本信息,作者等服务器代码: 1 package cn.aikang.Servlet; 2 3 /** 4 * @Author: 艾康 5 * @Date: 2019/10/15 8:23 6 */ 7 8 import javax.servlet.*; 9 import java.io.IOException; 10 11 /** 12 * Servlet的生命周期 13 */ 14 //1.定义一个实现Servlet接口的类 15 public class ServletTest2 implements Servlet { 16 /* 17 2.实现接口中的抽象方法 18 */ 19 20 //程序执行时 21 @Override 22 public void init(ServletConfig servletConfig) throws ServletException { 23 System.out.println("MyInit"); 24 } 25 26

点读系列《流畅的python》

我只是一个虾纸丫 提交于 2019-12-03 00:13:41
第1章 python数据模型 python的写法是由背后的魔法方法实现的,比如obj[key],解释器实际调用的是obj.__getitem__(key) 作者把魔法方法叫做双下方法,因为有两个下划线 collections.namedtuple可以用来创建只有少数属性但没有方法的对象,比如 beer_card = Card('7', 'diamonds') random.choice和random.sample不一样的地方在于,sample是返回序列,choice是返回元素,当使用sample(list, 1)[0]的时候,不如直接使用choice(list) deck[12::13],是指先抽出索引是12的那张牌,然后每向后数13张牌拿一张 实现了__getitem__让对象变得可迭代了 sorted(deck, key=spades_high) python sorted函数 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) def spades_high(card): rank_value = FrenchDeck.ranks.index(card.rank) return rank_value * len(suit_values) + suit_values[card.suit]