Swing208长任务

人形机器人技术解析:从ROS 2开发到运动控制实战 机器人操作系统(ROS)作为机器人领域的核心软件框架,通过分布式节点通信机制构建了机器人的“神经系统”,实现了感知、决策与控制模块的解耦与协同。其原理基于发布/订阅和服务调用模式,为机器人开发提供了标准化、模块化的基础架构,极大提升了开发效率与代码复用性。在技术价值上,ROS 2进一步增强了实时性、安全性与跨平台能力,成为人形机器人等复杂系统开发的事实标准。结合模型预测控制(MPC)等先进算法,开发者能够为机器人构建稳定、自适应的运动控制能力。当前,这些技术正推动人形机器人从实验室Demo走向工业测试与前沿 阅读详情

长任务,显示进度条

在这里插入图片描述

package my;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Swing2
{
	private static void createGUI()
	{
		// JFrame指一个窗口,构造方法的参数为窗口标题
		// 语法:因为MyFrame是JFrame的子类,所以可以这么写
		JFrame frame = new MyFrame("Swing Demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		// 设置窗口的其他参数,如窗口大小
		frame.setSize(500, 300);
		
		// 显示窗口
		frame.setVisible(true);
		
		
	}
	
	public static void main(String[] args)
	{
		// 此段代码间接地调用了 createGUI(),具体原理在 Swing高级篇 里讲解
		// 初学者先照抄此代码框架即可
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				createGUI();
			}
		});

	}
}

package my;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame
{
	JButton okButton = new JButton("开始");
	WaitDialog waitDialog = null;
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		root.add(okButton);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{			
		// 创建任务
		// 注意:在Win10下不允许直接在根目录下创建文件,所以建一个子目录来测试
		File srcFile = new File("C:/Users/Administrator/Desktop/1.zip");
		File dstFile = new File("C:/Users/Administrator/Desktop/2.zip");
		CopyTask th = new CopyTask();
		th.execute(srcFile, dstFile);	

		// 提示等待对话框
		waitDialog = new WaitDialog(this);
		waitDialog.exec();
	}
	
	private class CopyTask extends Thread
	{
		private File srcFile, dstFile;
			
		// 传入参数,并启动线程
		public void execute(File srcFile, File dstFile)
		{
			this.srcFile = srcFile;
			this.dstFile = dstFile;
			start(); // 启动线程
		}
		
		@Override
		public void run()
		{
			// 处理任务
			try {
				doInBackground();
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			
			// 歇息 片刻
			try { sleep(100); }catch(Exception e) {}
			
			// 显示结果 ( 更新 UI )
			SwingUtilities.invokeLater( ()->{
				done();
			});
		}
		
		// 处理任务
		protected void doInBackground() throws Exception
		{
			InputStream inputStream = null;
			OutputStream outputStream = null;
			long lastTime = System.currentTimeMillis();;
			long fileSize = srcFile.length(); // 文件大小
			long count = 0; // 已经完成的字节数
			
			try {
				inputStream = new FileInputStream(srcFile);
				outputStream = new FileOutputStream(dstFile);
				byte[] buf = new byte[8192]; // 每次最多读取8KB
				while(true)
				{
					int n = inputStream.read(buf); // 从源文件读取数据
					if(n <= 0) break; // 已经读完
					outputStream.write(buf,  0,  n); // 写入到目标文件
					
					// 计数及显示进度
					count += n; // 已经拷贝完成的字节数
					long now = System.currentTimeMillis();
					if(now - lastTime > 500) // 每500毫秒更新一次进度
					{
						lastTime = now;
						updateProgress(count , fileSize);
						Thread.sleep(5000); // 不要老是占用CPU
					}
				}
			}
			finally {
				// 出异常时,确保所有的文件句柄被关闭
				try { inputStream.close();}catch(Exception e) {}
				try { outputStream.close();} catch(Exception e) {}
			}
		}
		
		// 更新进度
		protected void updateProgress(long count, long total)
		{
			SwingUtilities.invokeLater( ()->{
				if(waitDialog!=null)
				{
					// 设置进度条的进度(0-100)
					int percent = (int)(100 * count / total) ;
					waitDialog.setProgress( percent );
				}				
			});			
		}
		
		// 任务完成后,更新界面显示
		protected void done()
		{
			// 关闭对话框
			if(waitDialog!=null)
			{
				waitDialog.setVisible(false);
				waitDialog = null;
			}
		}
	}
	
	
}

package my;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

/* 提示等待对话框
 * 
 * 无标题栏 setUndecorated(true)
 * 
 * 对话框里没有任何关闭按钮,所以用户不能手工关闭,只能等待操作结束
 * 
 */
public class WaitDialog extends JDialog
{
	public JLabel display = new JLabel("请等待...");
	public JProgressBar pbar =  new JProgressBar(); // 进度条控件,用于显示进度
	
	public WaitDialog(JFrame owner)
	{
		super(owner, "", true);
		
		// 去掉标题栏
		this.setUndecorated(true);
		
		// 布局
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new BorderLayout());
		
		// 背景
		root.setOpaque(true);
		root.setBackground(new Color(0xF4F4F4));
		
		Border b1 = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		Border b2 = BorderFactory.createEmptyBorder(4, 4, 4, 4);
		Border b3 = BorderFactory.createCompoundBorder(b1, b2);
		root.setBorder(b3);
		
		// 文字提示
		display.setHorizontalAlignment(SwingConstants.CENTER);
		root.add(display, BorderLayout.CENTER);
		
		// 进度条 (0-100)
		pbar.setMinimum(0);  // 最小值
		pbar.setMaximum(100); // 最大值
		pbar.setPreferredSize(new Dimension(0,20)); // 高度设为20
		root.add(pbar, BorderLayout.PAGE_END);
		
		// 设置大小
		this.setSize(200, 80);
		
	}

	// 设置进度 (0-100)
	public void setProgress(int n)
	{
		pbar.setValue(n);
	}
	
	public void exec()
	{
		// 相对owner居中显示
		Rectangle frmRect = this.getOwner().getBounds();
		int width = this.getWidth();
		int height = this.getHeight();
		int x = frmRect.x + (frmRect.width - width) / 2;
		int y = frmRect.y + (frmRect.height - height) / 2;
		this.setBounds(x, y, width, height);

		// 显示窗口 ( 阻塞 ,直接对话框窗口被关闭)
		this.setVisible(true);
	}
}

zip查看目录

在这里插入图片描述

package my;

import java.io.File;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class TestUnzip
{

	public static void main(String[] args) throws Exception
	{
		// 准备一个ZIP文件 
		// 注意:文件的位置,直接放在项目根目录下
		File scrFile = new File("1.zip");
		
		// 在Windows指定GBK,在Linux一般为UTF-8
		// 若字符集不匹配,则文件名和路径里的中文将是乱码
		ZipFile zipFile = new ZipFile(scrFile, Charset.forName("GBK"));
		
		int fileCount = 0;
		long totalSize = 0;
		Enumeration<?> entries = zipFile.entries();
        while(entries.hasMoreElements())
        {
        	ZipEntry entry = (ZipEntry) entries.nextElement();
        	
        	if(entry.isDirectory())
        	{
        		// 该项是目录
        		System.out.println("** " + entry.getName());
        	}
        	else
        	{
        		// 该项是文件
        		System.out.println("   " + entry.getName());
        		fileCount += 1; // 文件个数
        		totalSize += entry.getSize();
        		
        	}
        }
        
        System.out.println("-----------------------");
        System.out.println("文件总数: " + fileCount);
        System.out.println("文件总数: " + totalSize);
        
        zipFile.close();
	}

}

zip解压缩

在这里插入图片描述

package my;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class TestUnzip
{
	public static void main(String[] args) throws Exception
	{
		// 准备一个ZIP文件
		// 注意:文件的位置,直接放在项目根目录下
		File scrFile = new File("1.zip");
		
		// 指定解压缩的目标位置
		File dstDir = new File("C:/Users/Administrator/Desktop/");
		dstDir.mkdirs();
		
		// 在Windows指定GBK,在Linux一般为UTF-8
		// 若字符集不匹配,则文件名和路径里的中文将是乱码
		ZipFile zipFile = new ZipFile(scrFile, Charset.forName("GBK"));

		// 遍历每一条
		Enumeration<?> entries = zipFile.entries();
		while (entries.hasMoreElements())
		{
			ZipEntry entry = (ZipEntry) entries.nextElement();
			if (entry.isDirectory()) continue;
			
			System.out.println("处理文件:" + entry.getName());
			
			// entry.getName() 获取条目的路径
			File dstFile = new File(dstDir, entry.getName());
			dstFile.getParentFile().mkdirs(); // 创建所在的子目录

			// 从zip文件中解出数据
			InputStream inputStream = zipFile.getInputStream(entry);
			OutputStream outputStream = new FileOutputStream(dstFile);
			try
			{
				byte[] buf = new byte[4096];
				while(true)
				{
					int n = inputStream.read(buf);
					if(n <= 0)break;			
					outputStream.write(buf, 0, n);
				}
			} 
			finally
			{
				// 确保文件被关闭
				try{ inputStream.close(); } catch (Exception e){}
				try{ outputStream.close(); } catch (Exception e){}
			}
		}

		// 最后要记得关闭文件
		zipFile.close();
	}

}

显示zip目录,解压缩操作(略)

英伟达Rubin平台解析:AI工厂级计算的架构革命与性能突破 AI计算架构正从单机向数据中心级演进,其核心原理是通过芯片协同设计实现算力整合。这种架构的技术价值在于突破传统瓶颈,为大规模AI工作负载提供可扩展的解决方案。在实际应用中,特别适合Transformer模型训练和MoE专家并行等场景。以英伟达Rubin平台为例,其六芯片架构通过NVLink 6互连和HBM4内存实现了22TB/s的带宽突破,将AI计算密度提升至工业级水平。该平台在MoE模型训练中展现出10倍的能效提升,标志着AI基础设施正式进入工厂化部署时代。 阅读详情

相关推荐

将 AXI 设计拆分到两片FPGA

本文介绍了如何利用Veloce Prototyping System将包含AXI总线和PCIe接口的设计拆分到两片FPGA上实现。文章详细讲解了从Vivado Block Design构建、OOC综合、多FPGA设计分割与编译到Linux驱动验证的完整流程。核心内容包括:1)设计分割原理,将PCIe/XDMA模块与用户逻辑分别部署在两片FPGA;2)通过proFPGA的板间高速互连实现AXI信号传输;3)使用red工具链实现自动分割和编译。

Hi20240217的博客 359

208.SwingWorker

Swing程序UI界面只能使用EDT线程来修改和更新,不能使用其他线程。 原文: http://www.oracle.com/technetwork/articles/javase/swingworker-137249.html#Right 翻译: http://blog.sina.com.cn/s/blog_4b6047bc010007so.html Image Search示例的...

302

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构02

① Firecracker 为每个 microVM 提供极简设备模型:virtio-net, virtio-blk, serial console。:① BB84:Alice 随机选择基矢(+ 或 ×)发送单光子,Bob 随机测量基矢,比对后保留一致位的子集作为原始密钥。:密度 1 EB/mm³;:① Parquet 文件:行组(Row Group)→ 列块(Column Chunk)→ 页(Page)。

weixin_49199313的博客 137

Swing日期时间选择框控件

最近做一个Swing软件,其中要用到日期时间选择器(DateChooser),但是Swing中没有现成的日期时间选择器可用,于是在网上搜索了一下,找了一个比较靠谱的例子,因为任务比较紧,所以没有时间细致地美化,自己修改了几处,增加了一些注释,增加了几个功能(如:增加了确定、取消按钮;添加了取消时JButton的Text恢复选择前的日期时间;增加了得到当前日期时间格式化器等),现在放出来,欢迎有时间

fh09102103的专栏 8196

【信息科学与工程学】信息工程领域——第三十六篇 电路电子06 电路设计01

问题的数学分析及组合数学分析(涵盖材料科学、材料力学、数学物理、电路/电气/电机/电子/控制科学/控制论、微电子/电路系统架构、半导体器件物理、几何学/拓扑学/代数学/数论/离散数学/泛函分析/复变函数和时变函数/数理逻辑/运筹学、数学物理、数学华为、计算机系统架构设计、通信科学、信息科学、光科学、电科学、热科学、力学科学、网络科学 、复杂系统、其他学科知识)③LED驱动、PD接收、跨阻放大、带通滤波、ADC、数字处理;③三电极体系(工作、对、参比)、恒电位电路、电流-电压转换、低通滤波;

weixin_49199313的博客 335

SpringBoot+Vue3机票预订系统实战:从数据库设计到部署避坑全攻略

前后端分离架构已成为现代企业应用的主流模式,SpringBoot与Vue3的组合在Java开发岗位中应用广泛。在构建机票预订系统时,除了基础的增删改查,更值得关注的是数据库表结构设计、并发场景下的余票扣减、JWT无状态鉴权、订单状态机流转等核心工程问题。本文从通用技术概念出发,讲解如何设计用户、航班、订单、乘机人等核心表,如何用条件更新解决超卖问题,如何通过定时任务处理超时订单,并覆盖前端Vue工程对接与Nginx部署避坑细节。无论用于毕业设计还是面试项目,这套基于MyBatis-Plus与MySQL的实践

weixin_30530939的博客 488

2.8基于Java_swing的飞机大战游戏的设计与实现(小型项目简单)(源码+lun文+视频齐全)————源码私信博主

本文设计并实现了一款基于Java的飞机大战游戏,作为毕业设计项目。论文首先分析了Java语言在手机游戏开发中的优势,包括面向对象、安全可靠、跨平台等特性。随后详细介绍了游戏开发的技术路线,使用IntelliJ IDEA作为开发工具,实现了游戏状态控制、难度调整、界面绘制、玩家操作等核心功能模块。重点解决了多线程处理、碰撞检测、动画效果等关键技术难点。论文通过流程图和核心代码展示了游戏首页、子弹发射、积分系统等具体功能的实现过程。测试结果表明,该游戏运行稳定,操作流畅。本设计不仅巩固了Java编程技能,也为后

fshao123的博客 422

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 882

人形机器人开发入门:从自由度设计到ROS2实战

人形机器人是集机械、控制、感知与决策于一体的复杂系统,其突破性表现背后是完整的系统工程设计。对于初学者而言,理解自由度、平衡控制与步态生成是入门关键。自由度决定了机器人的运动潜力,而ZMP与IMU的协同则是实现动态稳定的基础。通过步态规划器生成足端轨迹,再借助逆运动学解算关节角度,机器人才能迈出稳定步伐。本文从系统架构出发,拆解人形机器人核心技术栈,结合ROS2环境演示视觉引导控制Demo,并梳理常见工程故障与排查思路,为自学者、竞赛参赛者及开发者提供一套可落地的最小系统实践路径。

weixin_30542079的博客 482

手把手教你用RK3568开发板实现FPGA与Linux的DMA通信(含完整代码解析)

本文详细介绍了如何在RK3568开发板上实现FPGA与Linux系统的DMA通信,包括硬件配置、软件环境搭建、DMA通信原理、驱动开发及性能优化。通过完整的代码解析和实战案例,帮助开发者快速掌握异构系统间的高效数据传输技术,适用于物联网和边缘计算等场景。

weixin_29174385的博客 201

二维数字图像相关算法软件Ncorr的使用心得

二维开源软件Ncorr的DIC分析操作过程详解。

m0_72612723的博客 3万+

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 730

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 295

基于 Matlab 的亚像素边缘检测算法:Zernike 矩

Zernike 矩是一种基于正交多项式的特征提取算法,可以用于分析和描述数字图像中的形状和结构。Zernike 矩可以描述图像在不同方向、不同比例和旋转角度下的变化情况,因此具有很好的不变性和鲁棒性。在基于 Zernike 矩的亚像素边缘检测算法中,我们首先需要将原始图像转换为极坐标系下的图像。然后,对每个像素点,计算其在不同方向下的一阶导数和二阶导数,并将其转换为极坐标系下的形式。其中,“n”表示次数,“m”表示阶数,“rho”和“theta”分别表示极坐标系下的半径和角度。% 转换为极坐标系下的形式。

2301_79325339的博客 983

深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

本文简要介绍深度学习的前向传播与反向传播,以及前馈神经网络与反馈神经网络。

haopinglianlian的博客 3044

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 326

二十一、SAP-库存管理

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1811

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 513

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 351

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 532

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 417

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1118

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 207

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 367
上一篇: swing207短任务
下一篇: 2021-10-15PS
dingpython
博客等级 码龄6年 5粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值