【进阶篇-Day3:JAVA接口新特性、代码块、内部类、Lambda表达式、组件等的介绍】

news2024/11/25 7:46:17

目录

  • 1、接口新特性
    • 1.1 JDK8的新特性
    • 1.2 JDK9的新特性
  • 2、代码块
    • 2.1 代码块的定义
    • 2.2 代码块的分类
  • 3、内部类
    • 3.1 内部类的定义
    • 3.2 内部类成员访问
    • 3.3 学习内部类的原因
    • 3.4 内部类的分类
      • 3.4.1 成员内部类
      • 3.4.2 静态内部类
      • 3.4.3 局部内部类
      • 3.4.4 匿名内部类
        • (1)定义:
        • (2)使用场景:
  • 4、Lambda表达式
    • 4.1 概述
    • 4.2 案例
    • 4.3 注意事项
    • 4.4 Lambda表达式的省略写法
    • 4.5 Lambda表达式和匿名内部类的区别
  • 5、窗体、组件、事件
    • 5.1 窗体
    • 5.2 组件
      • 5.2.1 按钮组件Jbutton
      • 5.2.2 文本组件Jlabel
    • 5.3 事件
    • 5.4 适配器设计模式
    • 5.5 模板设计模式

1、接口新特性

1.1 JDK8的新特性

在这里插入图片描述

之前说过,接口里面只能是抽象方法,但是JDK8为何要修改成允许定义带方法体的方法呢,原因是什么呢?
答:如果系统要升级版本2,那么在接口中再新加抽象方法时,会导致以前的接口实现对象报错,因此JDK8改成接口中可以定义有方法体的方法,就是为了解决:丰富接口功能的同时,又不需要更改实现类的代码。,如下图:
在这里插入图片描述

下面再看下JDK8是怎么做的:
在这里插入图片描述
在这里插入图片描述

1.2 JDK9的新特性

在这里插入图片描述

为什么JDK9允许定义私有方法呢?
答:
在这里插入图片描述

下面看看JDK9是如何做的:
在这里插入图片描述

2、代码块

2.1 代码块的定义

在这里插入图片描述

2.2 代码块的分类

在这里插入图片描述

package com.itheima.vo;

public class Student {
    //随着类的加载而加载,多用于数据初始化
    static {
        System.out.println("Student类的静态代码块...");
    }

    //编译时,会分散到每个构造方法的第一行
    {
        System.out.println("Student类的构造代码块...");
    }

    public Student(){
        //现在电脑内存都很大了,所以一般不会使用局部代码块提前释放内存
        {
            System.out.println("局部代码块...");
        }
        System.out.println("Student类的构造方法...");
    }
}

注:同步代码块多线程会使用到,这个放多线程介绍。

3、内部类

3.1 内部类的定义

在这里插入图片描述
下面是一个例子:

package com.itheima.inner;

public class InnerTest {
    public static void main(String[] args) {
        Outer.Inner in = new Outer().new Inner();//创建内部类对象
        in.show();//调用内部类方法
    }
}

class Outer{
    class Inner{
        int num = 11;

        public void show(){
            System.out.println("show...");
        }
    }
}

3.2 内部类成员访问

在这里插入图片描述

看下面这三个变量,第一个是外部类成员变量、第二个是内部类成员变量、第三个是方法里的变量,现在的问题是,如何分别访问他们三个?
答:看代码

class Outer{
    int num = 11;//外部类成员变量
    class Inner{
        int num = 22;//内部类成员变量
        public void show(){
            int num = 33;//方法里的变量
            System.out.println(num); //33
            System.out.println(this.num); //22
            System.out.println(Outer.this.num); //11
        }
    }
}

注:
1、方法里的变量:直接访问,即就近原则;
2、内部类成员变量:使用this关键字;
3、外部类成员变量:使用外部类名称.this访问。

3.3 学习内部类的原因

在这里插入图片描述

3.4 内部类的分类

在这里插入图片描述

3.4.1 成员内部类

如下所示的Inner就是成员内部类:

class Outer{
    class Inner{
        int num = 11;
        public void show(){
            System.out.println("show...");
        }
    }
}

3.4.2 静态内部类

在这里插入图片描述

注:其实可以发现,静态内部类与成员内部类主要的区别是,创建对象不同。记住一点:只要是静态的,都是使用类名来调用,理解了这一点,不用刻意记也能知道静态内部类是怎么创建的。

3.4.3 局部内部类

局部内部类是指:放在方法、代码块、构造器等执行体中的类。
下面是一个例子:

class A{
    public void show(){
        //B是一个局部内部类
        class B{
            int num;
        }
    }
}

局部内部类只有在调用此代码块时才会调用到,因此鸡肋,使用较少。

3.4.4 匿名内部类

(1)定义:

在这里插入图片描述

注:

  • new 类名(){}:代表继承这个类
  • new 接口名(){}:代表实现这个类
(2)使用场景:

如果发现在调用一个方法时,此方法的参数是一个接口类型,那么有两种办法解决:
1、定义一个此接口的实现类并重写此方法,然后new这个实现类,最后调用这个方法;
2、使用匿名内部类,即new 接口名(){}。

看下面的例子:
在这里插入图片描述
可以发现第二种方法很简洁,因此这就是匿名内部类的使用场景。

对于上述的两种方法,要如何选择呢?
答:如果一个接口的抽象方法很少,则推荐使用匿名内部类,反之使用定义接口实现类的这种方法比较简洁。

4、Lambda表达式

4.1 概述

在这里插入图片描述

4.2 案例

public class InnerTest {
    public static void main(String[] args) {
        //这是匿名内部类
        useInnerA(new InnerA() {
            @Override
            public void show() {
              System.out.println("我是匿名内部类...");
            }
        });

        //使用Lambda表达式,简化匿名内部类
        useInnerA(()->{
            System.out.println("我是使用Lambda表达式的匿名内部类...");
        });
    }

    //这是一个形参类型为接口的方法
    public static void useInnerA(InnerA a){
        a.show();
    }
}

interface InnerA{
    void show();
}

4.3 注意事项

在这里插入图片描述

在这里插入图片描述

总结:Lambda表达式只能简化只有一个抽象方法的匿名内部类。

4.4 Lambda表达式的省略写法

在这里插入图片描述
下面我们一条一来看:

  • 参数类型可以省略不写:
//使用Lambda表达式,参数类型可以省略
useInnerA((a, b) -> {System.out.println("我是使用Lambda表达式的匿名内部类...");});
  • 只有一个参数,则参数类型可以省略不写,同时()也可以省略
//使用Lambda表达式,只有一个参数,则参数类型可以省略不写,同时()也可以省略
useInnerA(a -> {System.out.println("只有一个参数,则参数类型可以省略不写,同时()也可以省略...");});
  • Lambda表达式的方法体只有一行代码,大括号和分号都可省略,同时如果是return则必须省略。
//Lambda表达式的方法体只有一行代码,大括号和分号都可省略,同时如果是return则必须省略。
//返回值为字符串类型,只需要写字符串即可,需要省略return语句。
useInnerA(a-> "我是使用Lambda表达式的匿名内部类...");

4.5 Lambda表达式和匿名内部类的区别

在这里插入图片描述

5、窗体、组件、事件

5.1 窗体

在这里插入图片描述

import javax.swing.*;

public class JFrameTest {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();
        //设置窗体大小
        jf.setSize(511, 511);
        //修改窗体的关闭模式
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体标题
        jf.setTitle("大哥的第一个窗口");
        //设置窗体可见
        jf.setVisible(true);
    }
}

5.2 组件

在这里插入图片描述

在这里插入图片描述

5.2.1 按钮组件Jbutton

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看下面代码:

package com.itheima.frame;

import javax.swing.*;

public class JFrameTest {
    public static void main(String[] args) {
        //1、窗体对象
        //创建窗体对象
        JFrame jf = new JFrame();
        //设置窗体大小
        jf.setSize(511, 511);
        //修改窗体的关闭模式
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体标题
        jf.setTitle("我是标题");
        //取消窗体的默认布局
        jf.setLayout(null);

        //2、按钮对象
        //2.1 创建按钮对象
        JButton jb = new JButton("确定");
        jb.setBounds(51,51,111,111);
        //2.2 将按钮对象添加到面板对象当中
        jf.getContentPane().add(jb);

        //设置窗体可见
        jf.setVisible(true);
    }
}

在这里插入图片描述

5.2.2 文本组件Jlabel

在这里插入图片描述

在这里插入图片描述

5.3 事件

在这里插入图片描述

在这里插入图片描述

  • 动作监听:
    在这里插入图片描述
package com.itheima.action;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class ActionTest {
    public static void main(String[] args) {
        //1、窗体对象
        //创建窗体对象
        JFrame jf = new JFrame();
        //设置窗体大小
        jf.setSize(511, 511);
        //修改窗体的关闭模式
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体标题
        jf.setTitle("我是标题");
        //取消窗体的默认布局
        jf.setLayout(null);

        //2、按钮对象
        //2.1 创建按钮对象
        JButton jb = new JButton("确定");
        jb.setBounds(51,51,111,111);
        //2.2 将按钮对象添加到面板对象当中
        jf.getContentPane().add(jb);

        //3、事件监听
        jb.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("我被点击了");
            }
        });


        //设置窗体可见
        jf.setVisible(true);
    }
}
  • 键盘事件:
    在这里插入图片描述
package com.itheima.action;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyActionTest {
    public static void main(String[] args) {
        //1、窗体对象
        //创建窗体对象
        JFrame jf = new JFrame();
        //设置窗体大小
        jf.setSize(511, 511);
        //修改窗体的关闭模式
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体标题
        jf.setTitle("我是标题");
        //取消窗体的默认布局
        jf.setLayout(null);
        //键盘事件
        jf.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {//键盘按下时触发事件
                int keyCode = e.getKeyCode();
                if (keyCode == 37){
                    System.out.println("左移动业务...");
                } else if (keyCode == 38) {
                    System.out.println("上移动业务...");
                } else if (keyCode == 39) {
                    System.out.println("右移动业务...");
                } else if (keyCode == 40) {
                    System.out.println("下移动业务...");
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {//键盘松开时触发事件
//                System.out.println("键盘松开了...");
            }
        });

        //设置窗体可见
        jf.setVisible(true);
    }
}

5.4 适配器设计模式

在这里插入图片描述

上述对适配器设计模式的描述可能不够清晰,下面再用大白话解释一下:

当我们写了一个接口后,我们会将这个接口进行实现。在进行一个实现时,我们发现无论怎么样,这个实现类是一定要重写接口里的所有方法的,那有什么方法只重写想要的方法呢,这个就是适配器要解决的问题。

  • 解决思路:

先编写一个适配器(抽象方法),让适配器来实现这个接口,然后我们要写的实现类只需要继承适配器就可以了,这样我们需要实现哪个方法就重写哪个即可。
如下所示::
在这里插入图片描述

  • 解决步骤:

在这里插入图片描述

5.5 模板设计模式

在这里插入图片描述

上面的陈述可能还不是太清晰,下面再通俗的解释一下:

模板设计模式,其实就是先写一个抽象类,然后在抽象类里写一个模板方法,依次调用业务逻辑代码,但是发现有些业务逻辑代码并不通用,于是把这些不通用的代码抽为一个或者几个方法,然后将这几个方法定义为抽象方法,让子类去实现,这样子类就会有各自的业务逻辑,这个就是模板设计模式。

下面看一段代码:

package com.itheima.design.template;

public abstract class CompositionTemplate {
    /**
     * write方法是模板,但是里面的body是随着每个实现类的不同而不同,因此需要定义为抽象方法
     */
    public void write(){
        System.out.println("我的爸爸");
        
        body();
        
        System.out.println("啊~ 这就是我的爸爸~");
    }
    
    abstract void body();
}


public class Tom extends CompositionTemplate{
    @Override
    void body() {
        System.out.println("我的爸爸是一个很严肃的人,每天工作很长时间。。。");
    }
}


public class Test {
    public static void main(String[] args) {
        Tom t = new Tom();
        t.write();
    }
}


输出:

我的爸爸
我的爸爸是一个很严肃的人,每天工作很长时间。。。
啊~ 这就是我的爸爸~

Process finished with exit code 0

注意:上述代码中,要是子类重写了write方法,那岂不是不遵循当初定义的模板了?为了防止重写write方法,可以把write方法定义为最终的,即前面加关键字final,如下所示:

public abstract class CompositionTemplate {
    /**
     * write方法是模板,但是里面的body是随着每个实现类的不同而不同,因此需要定义为抽象方法
     */
    public final void write(){//定义为最终的,防止重写
        System.out.println("我的爸爸");

        body();

        System.out.println("啊~ 这就是我的爸爸~");
    }

    abstract void body();
}

但其实业务代码中一般不会这么写死,因为万一你写的模板确实不适合人家的业务需求呢,那岂不是坏大事了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用自签名 TLS 将 Dremio 连接到 MinIO

Dremio 是一个开源的分布式分析引擎,为数据探索、转换和协作提供简单的自助服务界面。Dremio 的架构建立在 Apache Arrow(一种高性能列式内存格式)之上,并利用 Parquet 文件格式实现高效存储。有关 Dremio 的更多信息,…

【3D模型库】机械三维模型库整理

1 开拔网 简介:开拔网是中国较早的机械设计交流平台,广受行业内的各个大学,公司以及行业人士的欢迎。网站有非常丰富的3D模型,CAD图纸,以及各类热门软件的下载。同时我们也为行业搭建一个平台,提供各类设计…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置: 一等奖:约占该省份队伍总数的5%&#xff0…

React 中的 ErrorBoundary

在 React 中,如果不做任何控制,当组件出现异常时,React 渲染就会停止,页面出现白屏,这种体验很不好。例如当用户输入某些非法数据,而前端都没有进行校验,页面出现白屏。这种情况下,最…

Vue61-消息订阅与发布-任意组件之间的通信

一、原理图 原生的JS不能实现订阅与发布,要借助第三方库:pubsub-js(任何一个框架都能用!) 二、案例实现 school组件,需要数据(订阅消息),student组件提供数据&#xff0…

2-9 基于matlab的传递矩阵计算轴的模态

基于matlab的传递矩阵计算轴的模态,包括模态频率和模态振型,可设置轴的结构参数。程序已调通,可直接运行。 2-9 传递矩阵计算轴的模态 模态频率 - 小红书 (xiaohongshu.com)

厂里资讯之异步通知文章上下架

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高(主从)高(主从&#…

分布式并行策略

1.数据并行(DP) 将小批量分为n块,每个GPU拿到完整参数计算一块数据的梯度。(通常性能会更好) 假如一个批量有128个样本,然后有2个GPU,那么每个GPU可以拿到64个样本。(每个GPU计算完…

【自记录】记一台i7四代老爷笔记本重装Win10 22H2

1 背景 手上有一台退役的老爷笔记本,清华同方锋锐 U430。因为比较轻便,最近重新翻出来用于临时抓个包和简单的脚本语言(比方说Python)编辑工作。但是现在像VSCode的新版本都要求Win10以上,像Continue这类的AI插件都跑…

为企业提供动力:用于大型组织的WordPress

可扩展且灵活的架构可通过主题、插件和集成进行定制内置 SEO 功能和营销功能内容管理和协作工具支持多站点安装托管解决方案和面向平台的提供商采用现代前端技术的 Headless CMS 功能 拥有强大、灵活且可扩展的内容管理系统 (CMS) 对于大型组织至关重要。作为最受欢迎和广泛使用…

(一篇Blog证明还在地球)论文精读:基于CLIP引导学习的多模态虚假新闻检测

摘要 假新闻检测在社会取证领域引起了广泛的研究兴趣。许多现有的方法引入了定制的注意机制来融合单峰特征。然而,它们忽略了模式之间的跨模式相似性的影响。同时,预训练的多模式特征学习模型在FND中的潜力还没有得到很好的开发。这篇论文提出了一种FND…

今年的618,似乎很平淡!

电商平台取消预售制度的第一个大促,快递业表现如何? 今年的618大促与往年有些不同,自4月起,天猫、京东、快手等主流平台相继官宣取消预售,打出“现货开卖”标签,这意味着消费者不用再被“烧脑”的优惠计算…

72-UDP协议工作原理及实战

#ifndef UDPCOMM_H #define UDPCOMM_H#include <QMainWindow> #include <QUdpSocket> // 用于发送和接收UDP数据报 #include <QtNetwork>QT_BEGIN_NAMESPACE namespace Ui { class udpComm; } QT_END_NAMESPACEclass udpComm : public QMainWindow {Q_OBJECT…

Qt 实战(5)布局管理器 | 5.2、深入解析Qt布局管理器

文章目录 一、深入解析Qt布局管理器1、为什么要使用布局管理器&#xff1f;2、布局管理器类型3、布局管理器用法详解3.1、QBoxLayout&#xff08;垂直与水平布局&#xff09;3.2、QGridLayout&#xff08;网格布局&#xff09;3.3、QFormLayout&#xff08;表单布局&#xff09…

制造业为什么需要ERP企业管理软件?

如今&#xff0c;传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下&#xff0c;如果你的企业仍然依赖于手工记录订单、库存和财务数据&#xff0c;那么每当市场发生变动时&#xff0c;你就需要花费大量的时间和精力去重新调整生产计划、更新…

【漏洞复现】CRMEB开源电商系统 /api/products SQL注入漏洞(CVE-2024-36837)

0x01 产品简介 CRMEB开源电商系统是一款由西安众邦网络科技有限公司打造的全栈式电商解决方案&#xff0c;旨在为开发者和商家提供高性能、智能化的电商平台服务。该系统集成了CRM(客户关系管理)、ERP(企业资源规划)和EB(电子商务)的功能&#xff0c;通过深度结合这些功能&…

reverse-android-实战喜马拉雅-ollvm

资料 1. apk: com.ximalaya.ting.android.apk. 2020年8月 可以使用 2. 抓包分析 java层分析 so层分析 登录的算法so是在 liblogin_encrypt.so中。 32位的&#xff0c; 用 IDA打开&#xff0c;查看 静态的导出函数。 打开 一个 首先看到 IDA VIEW 是一个横向 比较多的分支&am…

算法金 | 一个强大的算法模型:t-SNE !!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff09;是一种用于降维和数据可视化的非线性算法。它被广泛应用于…

windows实现python串口编程

一、windows安装python Welcome to Python.org 根据windows是64位找到对应的版本下载 下载完后直接安装即可&#xff01; 打开cmd查看python版本 $ python --version #查看版本 二、串口编程 1、安装pyserial库 pyserial是Python中的一个库,用于处理串口通信。 cmd…

JavaScript-拓展简单和引用数据类型

学习目标&#xff1a; 掌握拓展简单和引用数据类型 学习内容&#xff1a; 拓展-术语解释拓展-基本数据类型和引用数据类型 拓展-术语解释&#xff1a; 拓展-基本数据类型和引用数据类型&#xff1a; 简单类型又叫做基本数据类型或者值类型&#xff0c;复杂类型又叫做引用类型…