Java8中的接口

public interface Output {
//接口里定义的成员变量只能是常量
//默认使用public static final修饰
int MAX_CACHE_LINE = 50; //接口里定义的普通方法只能是public的抽象方法
void out(); void getData(String msg); //接口中定义的默认方法,需要使用default修饰
default void print(String... msgs) {
for (String msg : msgs) {
System.out.println(msg);
}
} //接口中定义类方法,需要使用static修饰
static String staticTest(){
return "接口里的类方法";
}
}

Java8中允许在接口中定义默认方法,默认方法必须使用default修饰,该方法不能使用static修饰,无论程序是否指定,默认方法总是使用public修饰。由于默认方法并没有static修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法。

Java8中允许在接口中定义类方法,类方法必须使用static修饰,该方法不能使用default修饰,无论程序是否指定,类方法总是使用public修饰。类方法可以直接使用接口来调用。

接口和抽象类

  • 相同点

    • 接口和抽象类都不能被实例化,他们都位于继承树的顶端,用于被其他类实现和继承。
    • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
  • 区别:
    1. 接口里只能包含抽象方法和默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
    2. 接口里不能定义静态方法;抽象类里可以定义静态方法。
    3. 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
    4. 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
    5. 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
    6. 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

内部类

把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(也叫嵌套类),包含内部类的类也被称为外部类(也叫宿主类)

内部类比外部类可以多用三个修饰符:private、protected、static

非静态内部类不能拥有静态成员

在一个类的方法中定义的内部类叫做局部内部类;其他的叫做成员内部类。

非静态内部类

成员内部类中没有使用static修饰的内部类是非静态内部类

非静态内部类对象和外部类对象的关系是?

  • 非静态内部类对象必须寄生在外部类对象里,而外部类对象则不必一定有费静态内部类对象寄生其中。
  • 如果存在一个非静态内部类对象,则一定存在一个被他寄生的外部类对象。
  • 但外部类对象存在时,外部类对象里不一定寄生了非静态内部类对象。
  • 因此外部类对象访问非静态内部类成员时,可能非静态普通内部类根本不存在。
  • 而非静态内部类对象访问外部类成员时,外部类对象一定存在。

静态内部类

使用static修饰的内部类被称为静态内部类(也叫类内部类)。这个内部类属于外部类本身,而不属于外部类的某个对象。

静态内部类可以包含静态成员,也可以包含非静态成员。

为什么静态内部类的实例方法不能访问外部类的实例属性?

  • 静态内部类是外部类的类相关的,而不是外部类的对象相关的。
  • 静态内部类对象不是寄生在外部类的实例中,而是寄生在外部类的类本身中。
  • 当静态内部类对象存在时,并不存在一个被他寄生的外部类对象,静态内部类对象只持有外部类的类引用,没有持有外部类对象的引用。
  • 如果允许静态内部类的实例方法访问外部类的实例成员,但找不到被寄生的外部类对象,这将引起错误。

局部内部类

如果把一个内部类放在方法里定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。

实际开发很少使用

匿名内部类

匿名内部类适合创建那种只需要一次使用的类。

创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。

匿名内部类格式:

new 实现接口() | 父类构造器(实参列表)
{
//匿名内部类的类体部分
}

最常用的创建匿名内部类的方式是需要创建某个接口类型的对象

interface Product {
public double getPrice(); public String getName();
} public class AnonymousTest {
public void test(Product p) {
System.out.println("买了一个" + p.getName() + ",花了" + p.getPrice());
} public static void main(String args[]) {
AnonymousTest ta = new AnonymousTest(); //调用test方法时,需要传入一个Product参数
//此处传入其匿名实现类的实例
ta.test(new Product() {
@Override
public double getPrice() {
return 12.3;
} @Override
public String getName() {
return "U盘";
}
});
}
}

Lambda表达式

Lambda表达式支持代码块作为方法参数,允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

比如,有匿名内部类程序:

public class CommandTest {
public static void main(String args[]) {
ProcessArray pa = new ProcessArray();
int[] target = {2, 1, -5, 3};
pa.process(target, new Command() {
@Override
public void process(int[] target) {
int sum = 0;
for (int tmp : target) {
sum += tmp;
}
System.out.println("数组元素的总和是:" + sum);
}
});
}
}

改为Lambda表达式代替匿名内部类:

public class CommandTest {
public static void main(String args[]) {
ProcessArray pa = new ProcessArray();
int[] target = {2, 1, -5, 3};
pa.process(target, (int[] array) -> {
int sum = 0;
for (int tmp : array) {
sum += tmp;
}
System.out.println("数组元素的总和是" + sum);
});
}
}

Java中:接口,抽象类,内部类的更多相关文章

  1. Java中接口和抽象类的比較

    Java中接口和抽象类的比較-2013年5月写的读书笔记摘要 1. 概述 接口(Interface)和抽象类(abstract class)是 Java 语言中支持抽象类的两种机制,是Java程序设计 ...

  2. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  3. Java 中,抽象类与接口之间有什么不同?

    Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个 类只能继承一个类,但是可以实现多个接口.抽象类可以很好的定义一个家族类 的默认行为,而接口能更好的定义类型,有助于后 ...

  4. 转载 - java中接口的向上转型。和多态性

    发现一篇对接口总结很精简的文章 1.在java中接口就是一个完全抽象的类,跟抽象类一样不能产生对象,但是可以作为对象的引用,可以由其实现类向上转型,它就跟超类一样, 向上转型了,可以很好的利用接口,可 ...

  5. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  6. java中的抽象类和抽象方法

    知识点:java中的抽象类和抽象方法 关键字abstract意为抽象的,可以用来修饰类和方法,分别称作抽象类和抽象方法 抽象类一般在多态的场景中使用 一:抽象类(abstract class) 在类的 ...

  7. Java 中的抽象类及接口

    抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽 ...

  8. 论Java中的抽象类与接口

    目录 抽象类和抽象方法 定义 与普通类的区别以及注意点: 抽象类的作用 接口 定义 示例 注意 作用 最后:接口与抽象类的异同 使用场景 借鉴 抽象类和抽象方法 定义 抽象方法和抽象类都必须被abst ...

  9. 浅谈java中接口与抽象类之间的异同

    刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...

  10. Java中接口与抽象类的异同

    定义(以下是百度百科中的定义): Java接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具 ...

随机推荐

  1. [BUUCTF]PWN——jarvisoj_level3_x64

    jarvisoj_level3_x64 附件 步骤: 例行检查,64位程序,开启了nx保护 试运行一下程序,看看大概的情况 64位ida载入,习惯性的检索字符串,没有发现可以直接利用的system,估 ...

  2. 联盛德 HLK-W806 (十): 在 CDK IDE开发环境中使用WM-SDK-W806

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  3. Windows通过计划任务定时执行bat文件

    第一步 第二步 第三步 第四步 第五步 第六步

  4. 常用故障排查监控shell脚本

    #!/bin/bash #ping_monitor.sh IP_ADDRESS=$1 if [ -n "$IP_ADDRESS" ] ; then while : do PING_ ...

  5. SpringBoot整合redis实现过期key监听事件

    Spring整合redis实现key过期事件监听:https://www.cnblogs.com/pxblog/p/13969375.html 可以用于简单的过期订单取消支付.7天自动收货场景中 1. ...

  6. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  7. 【剑指Offer】左旋转字符串 解题报告(Python)

    [剑指Offer]左旋转字符串 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  8. Mysql溯源-任意文件读取👻

    Mysql溯源-任意文件读取 前言 读了<MySQL蜜罐获取攻击者微信ID>的文章,文中说明了通过mysql蜜罐读取攻击者微信ID的过程,抱着学习的态度尝试了一下 原理 mysql中有一个 ...

  9. 从JVM设计角度解读Java内存模型

    第十六章:Java内存模型 本文我们将重点放在Java内存模型(JMM)的一些高层设计问题,以及JMM的底层需求和所提供的保证,还有一些高层设计原则背后的原理. 例如安全发布,同步策略的规范以及一致性 ...

  10. 云南农业职业技术学院 - 互联网技术学院 - 美和易思《MYSQL 高级查询与编程》 综合机试试卷

    数据库及试题文档下载:https://download.csdn.net/download/weixin_44893902/14503097 目录 题目:电商平台 mysql 数据库系统管理 一. 语 ...