Java进阶(第三期): JDK版本接口的新特性 内部类(成员类、静态类、局部类、匿名类) Lambda表达式、简写规则

Java进阶(第三期)
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

文章目录

  • Java基础(第三期)
    • 一、接口新特性
          • 1.1 JDK8版本
          • 1.2 JDK9版本
    • 代码块
    • 二、内部类
          • 1、成员内部类
            • 1.2 内部类成员访问
          • 2、 静态内部类
          • 3、 局部类
          • 4、匿名内部类(重要)
    • 三 Lambda表达式
          • 3.1 简单概述
          • 3.2 Lambda表达式简写规则
          • 3.3 Lambda和匿名类的区别i

Java基础(第三期)

一、接口新特性

1.1 JDK8版本

在这里插入图片描述

JDK8 版本接口特性:

1. 允许定义非抽象方法,但是需要加入 default 关键字 (重写方法的时候不需要)
    - 做用:解决接口的升级问题
    - 注意事项:
    		1. public 可以省略,但是default 不能省略
    		2. 默认方法:实现类是允许重写的,但是需要去掉default关键字
    		3. 如果实现了多个接口,多个接口中存在相同的默认方法,实现类必须重写默认方法
    

代码示例:

package com.liujintao.jdk8;

public class InterfaceTest {
    /*
        允许在接口中定义新的抽象方法:
                需要在接口中对添加的方法加上 default 关键字
     */
    public static void main(String[] LiuJInTao) {
        Realize r = new Realize();
        r.print();  // is---print
        r.show();   // is---show
        r.method(); // is---method
        r.handle(); // is---default---eat
        r.eat();    // is---eat
    }
}

// 定义一个接口
interface Inter {
    public void show();
    public void print();

    // 在接口中添加新的抽象方法(还能带有逻辑)
    public default void method() {
        System.out.println("is---method");
    };
}

interface A {
    public void eat();

    // 接口中继续添加新的抽象方法,使用 default 修饰
    public default void handle () {
        System.out.println("is---handle");
    }
}


/**
 * 下面是实现类(多继承重写抽象方法,以及新增默认的抽象方法)
 */

// 定义第一个实现类;实现接口,并且重写里面的方法
class Realize implements Inter , A {

    @Override
    public void show() {
        System.out.println("is---show");
    }

    @Override
    public void print() {
        System.out.println("is---print");
    }

    // 重写default默认添加的抽象方法
    @Override
    public void method() {
        Inter.super.method();
        System.out.println("is---method");
    }

    // 重写A接口里面的抽象方法和默认新增方法
    public void eat () {
        System.out.println("is---eat");
    }

    public void handle () {
        System.out.println("is---default---eat");
    }
}

2. 允许定义静态方法
    - 理解:既然接口已经允许方法调用了,干脆也方法静态方法,可以使用类名调用
    
    - 注意事项:
    		1. public 可以省略,但是 static 不能省略
    		2. 接口中的静态方法,只允许接口名进行调用,不允许实现类调用
// 定义一个接口
interface A {
    public void eat();

    // 接口中继续添加新的抽象方法,使用 default 修饰
    public default void handle () {
        System.out.println("is---handle");
    }

    // 这是一个接口中的静态方法 (可以省略 public)
    public static void function () {
        System.out.println("is---A---static---function");
    }
}

// 调用接口

// 调用静态方法(接口名.方法名)调用
 A.function();
1.2 JDK9版本

在这里插入图片描述

package com.liujintao.jdk9;

public class InterfaceDemo {
}

/**
 * 定义一个接口
 */
interface Inter {
    void show();
    void pritn();
    default void start () {
        System.out.println("开始");
        log();
    }

    default void end () {
        System.out.println("结束");
        log();
    }

    // 将重复的代码抽取出来,并私有化 (私有化不能写default)
    private void log() {
        System.out.println("记录一次");

    }
}

代码块

在这里插入图片描述

二、内部类

内部类:再类中定义的类

创建内部类引用的格式:

外部类名.内部类名 对象名 = new 外部类名().new内部类名();
1、成员内部类

成员访问的细节:

1. 内部类中,访问外部类成员: 直接访问,包括私有。
2. 外部类中,访问内部类成员: 需要创建对象访问。
package com.liujintao.inner;


public class InnerDemo {
    public static void main(String[] args) {
        // 创建内部类对象访问内部类中的成员:
        Inner.Inner2 i = new Inner.Inner2();
        System.out.println("user:" + i.user + "---" + "age:" + i.age);    // 访问内部类的成员(如果是private就得使用set和get)
        i.method();  // 内部类的静态方法直接类名访问;
    }
}

// 外部类
class Inner {
    private String name = "张三";
    private char gender = '男';
    // 内部类
    class Inner2 {
        private String name = "李四";
        public  String user = "admin";
        public int age = 18;
        public void method() {
            System.out.println("我是内部类的静态方法");
        }
    }
}

user:admin—age:18
我是内部类的静态方法

1.2 内部类成员访问
  • 内部类中,访问外部类成员: 直接访问,包括私有
  • 外部类中, 访问内部类成员:需要创建对象访问

下面练习加深印象:

class1.class2 s = new class1().new class2();
s.shou();


class class1 {
    int num = 10;
    class class2 {
        int num = 20;
        public void shou () {
            int num = 30;
            System.out.println(num);  // 30
            System.out.println(this.num);   // 20
            System.out.println(class1.this.num);    // 10
        }
    }
}

注意:在成员内部中访问所在外部类对象,需要使用: 外部类名.this

2、 静态内部类
        静态内部类: static 修饰的成员内部类

        创建对象格式: 外部类名.内部类名 对象名 = new 外部类名(). new 内部类名()

        注意事项:静态方法智能访问静态方法(因为静态会随着类的加载而加载)
package com.liujintao.inner;

import java.sql.SQLOutput;

public class InnerDemo2 {
    public static void main(String[] LiuJinTao) {
        // 访问静态的,直接类名调用即可!
        Wai.Nei.show();


    }
}

class Wai {
    int num = 10;
    static int num2 = 20;

    // 静态内部类
    static class Nei {
        public static void show() {
            System.out.println("show------");

            Wai w = new Wai();
            System.out.println(w.num); // 10

            System.out.println(num2);   // 20
        }
    }
}

show------
10
20

3、 局部类
package com.liujintao.inner;

import java.sql.SQLOutput;

public class InnerDemo3 {
    /*
        局部内部类: 放在方法、代码块、构造器等执行体中
     */
    public static void main(String [] LiuJinTao) {
        // 使用局部类
        Wai1 w = new Wai1();
        w.show(); // 里面的逻辑执行,自然访问到了method方法
    }
}

class Wai1 {
    public void show () {
        // 局部内部类
        class Nei1 {
            public void method() {
                System.out.println("method-----");
            }
        }
        Nei1 n = new Nei1();
        n.method();
    }
}

method-----

4、匿名内部类(重要)

在这里插入图片描述

匿名内部类:
    	匿名内部类本质是一个特殊的局部内部类(定义在方法内部)
    	前提条件:
    			new 类名\ 接口名 () {}

				new 类名 () {}  : 代表继承这个类
                
                new 接口名 () {} : 代表实现这个接口
                    
                    
                    
 + 问题:方法的形参是接口类型,我们该传入的是什么?
+  回答:传入的是该接口的实现类对象
                    
                    + 多态的实现条件
                    接口引用需要实现类对象
                    父类引用需要子类对象
package com.liujintao.inner;

public class InnerDemo4 {
    public static void main(String[] LiuJinTao) {
        // 调用静态方法,参数需要一个接口对象(也就是实现类对象)
        method(new Inter() {
            // 实现类必须重写,要么编程抽象类
            @Override
            public void show() {
                System.out.println("我是实现类");
            }
        });
    }
    // 静态类(参数需要实现类对象) 也就是说:接口引用需要实现类对象
    public static void method(Inter i) {
        i.show();   // 我是实现类
    }
}

// 定义一个接口
interface Inter {
    public void show();
}
  • 使用场景:根据重写方法的个数,来决定。如果重写方法少,则使用匿名内部类,否则就使用实现类。

三 Lambda表达式

3.1 简单概述

在这里插入图片描述

package com.liujintao.lambda;

public class LambdaDemo {
    public static void main(String [] LiuJinTao) {
        // 匿名类实现 (传入一个实现类对象)
        userInter(new Inter () {
            @Override
            public void show() {
                System.out.println("我是匿名类传参");
            }
        });

        // 使用Lambda表达式 实现传参
        userInter( () -> {
            System.out.println("我是Lambda表达式传参");
        });
    }

    // 定义一个静态方法
    public static void userInter (Inter i) {
        i.show();
    }
}

// 定义一个接口
interface Inter {
    void show();
}


我是匿名类传参
我是Lambda表达式传参

3.2 Lambda表达式简写规则

在这里插入图片描述

  • 其实简写规则和箭头函数特别的像。
package com.liujintao.lambda;

public class LambdaDemo2 {
    public static void main(String[] LiuJinTao) {
        userInters(new Inters () {
            @Override
            public int  getSum(int a, int b) {
                return a + b;
            }
        });

        System.out.println("------------lambda表达式实现----------");

        userInters((a, b) -> a + b);
    }

    // 定义一个静态方法(参数为一个接口引用,需要传入一个实现类对象)
    public static void userInters (Inters sum) {
        int result = sum.getSum(10, 20);  // 调用实现类中重写的方法
        System.out.println(result);
    }
}

// 定义一个接口
interface Inters {
    // 定义抽象方法的形参
    int getSum(int a, int b);
}

30
------------lambda表达式实现----------
30

3.3 Lambda和匿名类的区别i

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/201385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python三百行代码实现一简约个人博客网站(全网最小巧)

这是全互联网最小巧的博客,没有比这更小的了。虽然小巧,但功能一点儿也不弱,支持文章的分页展示,文章表格,图片和代码语法高亮。文章无限制分类,访问量统计,按时间和按点击量排序,展…

CPU虚拟化的过程

VMCS 是Virtual Machine Control Structure。是 Intel 实现 CPU 虚拟化,记录 vCPU 状态的一个关键数据结构。VMCS 数据结构主要包含以下信息。 Guest-state area,即 vCPU 的状态信息,包括 vCPU 的基本运行环境,例如寄存器等。Hos…

数据治理模型的三个模块

数据接入模块 大数据工程的数据来源包含企业内部数据和企业外部数据,其中企业内部数据由资源服务平台、综合资源库、各业务系统生产库中的结构化数据和文件服务器上的文本、图片等非结构化数据组成,其中包括人财物记录、财物报表、原材料、顾客信息、气…

启动kafka集群以及关闭

kafka操作 第一个窗口 cd /root/software/kafka bin/zookeeper-server-start.sh config/zookeeper.properties最后这种就是成功了 Zookeeper 启动: Zookeeper 是 Kafka 集群的协调服务,启动 Kafka 之前必须确保 Zookeeper 正在运行。 第二个窗口&am…

谨慎Apache-Zookeeper-3.5.5以后在CentOS7.X安装的坑

目录 前言 一、现场还原 二、问题诊断 三、问题原因 总结 前言 最近由于项目需要,在服务器上需要搭建Hbase完全分布式集群环境。开发环境,采用的是最小节点的方式进行搭建(即3个节点的模式)。资源环境列表如下: 序号…

CentOS7搭建Kubernetes集群

环境准备:配置好静态IP地址的Centos7(2核、master内存3GB、slave内存2GB)。 搭建概述:先将一台虚拟机搭建为master、随后克隆出两台虚拟机作为从节点。 虚拟机主机名和IP地址: 主机名IP地址master192.168.138.110sl…

python类的多重继承继承和查找顺序

1 python类的多重继承继承和查找顺序 python中,类的多重继承允许子类继承多个基类,子类可以访问多个基类的属性和方法。 1.1 多重继承基础 用法 class MulClass(BaseC1,BaseC2,...BaseCn):pass描述 Mulclass:子类(或者称混合…

网络核心知识总结

计算机网络总结 基础 网络分层模型 OSI 七层模型是什么?每一层的作用是什么? OSI 体系结构是法律上的国家标准,从上往下讲分别是: 应用层 – 作用是 – 为计算机用户提供服务表示层 – 作用是 – 数据处理(编解码、加密解密、…

【数据结构】八大排序 (三)

目录 前言: 快速排序 快速排序非递归实现 快速排序特性总结 归并排序 归并排序的代码实现 归并排序的特性总结 计数排序 计数排序的代码实现 计数排序的特性总结 前言: 前文快速排序采用了递归实现,而递归会开辟函数栈帧&#xff0…

赴日开发做什么?日本签证很难拿?

日本的IT行业历史比较悠久,业务以上层前端业务为主,如设计和构建软件。日本IT公司组织庞大,行业内部有着严格的分工和部署,工作会被细分化。分配给个人的工作量不会太大,难度也不会很高。 在日本IT公司就业&#xff0…

【古月居《ros入门21讲》学习笔记】06_ROS常用命令行工具

目录 说明: 1. 回顾小海龟案例 终端1:启动ROS master 终端2:启动小海龟仿真器 终端3:启动海龟控制节点: 2. 系统计算图:rqt_graph 3. rosnode rosnode list:显示节点列表 rosnode info&…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然,您也可以在这里下载中…

NCo3.1(08) - Nco3 服务器端编程

本篇博文不再重复ABAP调用外部服务器的基础,只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考: SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程 PyRFC 服务器端编程要点 创建项目 新建一个 Console 项目,选择 .Net …

(亲测有效)解决windows11无法使用1500000波特率的问题

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步。 1、问题描述 从图1可以看出串口是正常的,安装的驱动是CP210xVCPInstaller_x64.exe,但是从图2可以看出,串口拒…

C# WPF 基础教程——触发器、行为、形状、变换与透明、路径和几何图形

触发器 简单触发器 单条件触发器 多条件触发器 事件触发器 行为 形状 矩形和椭圆 Viewbox缩放控件,直线,折线,多边形 画刷 普通画刷 线性渐变画刷 环形渐变画刷 位图画刷 虚拟画刷(复制元素外观) 位图缓存画刷 变换…

对二分搜索的理解 Go语言版

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…

探索测试开发工程师的通往成功的秘密路径!

「作者说」随着近几年国内IT行业高速发展&#xff0c;对测试工程师的要求也越来越高&#xff0c;其作用也越来越重要&#xff0c;但很多测试工程师也迎来了个人发展的瓶颈&#xff0c;下一步该向哪个方向发展&#xff0c;该如何发展&#xff1f;本文将概述测试工程师的现状及发…

使用MAT分析内存泄漏(mac)

前言 今天主要简单分享下Eclipse的Memory Analyzer在mac下的使用。 一、Mat&#xff08;简称&#xff09;干什么的&#xff1f; 就是分析java内存泄漏的工具。 二、使用步骤 1.下载 mac版的现在也分芯片&#xff0c;别下错了。我这里是M2芯片的&#xff0c;下载的Arch64的。 …

海康运行管理中心 RCE漏洞复现

0x01 产品简介 海康威视是以视频为核心的智能物联网解决方案和大数据服务提供商。海康运行管理中心是一款功能强大、易于使用的安防管理平台&#xff0c;能满足用户对视频监控、报警管理、设备配置和数据统计等方面的需求&#xff0c;帮助用户建立高效、智能的安防系统。 0x02…

tcpdump使用心得

参考原文 https://danielmiessler.com/p/tcpdump/ 几个用例 tcpdump -i eth0 显示eth0网卡当前所有的抓包情况eth0是网卡名&#xff0c;可以通过ifconfig获得&#xff0c;也可以通过 tcpdump -D 显示当前可以监听的网卡 -i 参数表示接口&#xff0c;后跟要监听的网卡 tcpdu…