ip达1万的网站怎么做/平台交易网
目录
专栏导读
4 数据库操作
4.1 连接数据库
4.2 执行 SQL 查询和更新:
4.3 使用模型和视图显示数据
5 多线程编程
5.1 多线程编程的概念和优势
5.2 在 PyQt 中使用多线程
5.3 处理多线程间的同步和通信问题
5.3.1 信号槽机制
5.3.2 线程安全的数据访问
QMutex 和 QMutexLocker
专栏导读
专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html
4 数据库操作
PyQt6中的数据库操作主要涉及到Qt的SQL模块,该模块提供了用于连接和管理数据库的功能。下面是一个关于PyQt6数据库操作的概述:
数据库连接: 使用
QSqlDatabase
类建立与数据库的连接。可以连接到各种数据库引擎,例如SQLite、MySQL、PostgreSQL等。连接需要指定数据库类型、主机、用户名、密码等信息。数据库查询: 使用
QSqlQuery
类执行SQL查询语句,例如SELECT、INSERT、UPDATE等。查询结果可以通过迭代获取。模型-视图架构: PyQt6提供了
QSqlTableModel
和QSqlQueryModel
等模型类,用于将数据库数据与Qt的视图类(如QTableView)连接起来。这使得在表格视图中展示和编辑数据库中的数据变得更加容易。事务管理: 可以使用
QSqlDatabase.transaction()
和QSqlDatabase.commit()
来进行数据库事务的管理,确保数据的一致性和完整性。数据绑定: 使用
bindValue()
方法可以将变量绑定到SQL查询,这有助于防止SQL注入攻击。错误处理: 数据库操作可能会出现错误,通过检查
QSqlQuery
的lastError()
可以获取详细的错误信息。
4.1 连接数据库
使用 Qt 的 QSqlDatabase 类可以连接到数据库。以下是一个简单的示例:
from PyQt6.QtSql import QSqlDatabasedb = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("my_database.db")
if db.open():print("Connected to database")
else:print("Failed to connect")
4.2 执行 SQL 查询和更新:
你可以使用 QSqlQuery 类来执行 SQL 查询和更新操作。以下是一个示例:
from PyQt6.QtSql import QSqlQueryquery = QSqlQuery()
query.exec("SELECT * FROM employees")
while query.next():name = query.value("name")print("Employee name:", name)
4.3 使用模型和视图显示数据
Qt 提供了模型-视图架构来显示数据库中的数据。例如,可以使用 QSqlTableModel 来在 QTableView 中显示数据。以下是一个示例:
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QPushButton, QLineEdit, QDockWidget
from PyQt6.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt6.QtCore import Qtclass AddDataDialog(QWidget):def __init__(self, model):super().__init__()self.model = modellayout = QVBoxLayout()self.setLayout(layout)# 添加姓名输入框self.name_input = QLineEdit(self)layout.addWidget(self.name_input)# 添加职位输入框self.position_input = QLineEdit(self)layout.addWidget(self.position_input)# 添加 "Add Data" 按钮,并连接到添加数据函数add_button = QPushButton("Add Data", self)add_button.clicked.connect(self.add_data)layout.addWidget(add_button)def add_data(self):# 获取姓名和职位输入框的内容name = self.name_input.text()position = self.position_input.text()# 准备插入数据的SQL查询query = QSqlQuery()query.prepare("INSERT INTO employees (name, position) VALUES (?, ?)")query.bindValue(0, name)query.bindValue(1, position)if query.exec():print("Data added successfully")self.model.select() # 刷新表格数据else:print("Error adding data:", query.lastError().text())def create_database_connection():# 创建数据库连接db = QSqlDatabase.addDatabase("QSQLITE")db.setDatabaseName("employees.db")if not db.open():print("Error: Could not open database.")return Nonereturn dbdef create_table(db):# 创建表格的SQL查询query = QSqlQuery()query.exec("CREATE TABLE IF NOT EXISTS employees (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, position TEXT)")def setup_model(db):# 设置数据库表格模型model = QSqlTableModel()model.setTable("employees")model.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit) # 手动提交更改model.select()return modelif __name__ == "__main__":app = QApplication(sys.argv)db = create_database_connection()if not db:sys.exit(1)create_table(db)model = setup_model(db)view = QTableView()view.setModel(model)add_data_dialog = AddDataDialog(model)window = QMainWindow()window.setWindowTitle("Database Table Example")window.setCentralWidget(view)window.setGeometry(100, 100, 800, 600)add_data_button = QPushButton("Add Data", window)add_data_button.clicked.connect(add_data_dialog.show)# 创建 DockWidget 并添加到主窗口的右侧停靠区dock_widget = QDockWidget("Add Data", window)dock_widget.setWidget(add_data_dialog)window.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock_widget)window.show()sys.exit(app.exec())
5 多线程编程
5.1 多线程编程的概念和优势
PyQt6中的多线程编程允许你在应用程序中同时执行多个任务,以提高性能、响应速度和资源利用率。在使用多线程时,你需要注意线程之间的同步和通信,以避免数据竞争和其他并发问题。以下是PyQt6多线程编程的概述:
线程类(QThread):
QThread
是 PyQt6 提供的线程基类,用于创建和管理线程。你可以继承QThread
并实现run()
方法来定义线程的执行逻辑。线程安全性: 在多线程环境中,多个线程可能同时访问和修改共享资源。确保对共享资源的访问是线程安全的是很重要的,可以使用互斥锁(
QMutex
)来控制对共享资源的访问。信号和槽机制: 在多线程中,通常不能直接在非主线程中更新用户界面。可以使用信号和槽机制,通过在主线程中处理信号来更新界面,从而避免线程间的界面更新问题。
多线程的应用场景: 多线程在以下情况下特别有用:
- 执行耗时操作,如文件读写、网络请求等,以避免主线程阻塞。
- 实现实时数据刷新,如传感器数据、图表数据等。
- 并发处理多个任务,提高程序的整体性能。
线程同步和通信: 多线程编程需要考虑线程之间的同步和通信。合适的同步机制(如互斥锁、信号量、条件变量等)和通信机制(如队列、信号槽等)可以确保线程间的正确协作。
避免死锁和线程饥饿: 死锁和线程饥饿是多线程编程中常见的问题。确保正确地设计和组织线程同步和通信,以避免出现这些问题。
总之,多线程编程可以显著提高应用程序的性能和响应能力,但也需要仔细考虑线程安全性和正确的同步机制。PyQt6提供了一些类和工具来帮助你实现多线程应用程序,但需要小心处理潜在的并发问题。
5.2 在 PyQt 中使用多线程
在 PyQt 中,你可以使用 QThread 类来创建和管理线程。以下是一个示例,演示如何在一个线程中执行一个耗时的任务:
from PyQt6.QtCore import QThread, pyqtSignalclass WorkerThread(QThread):result_ready = pyqtSignal(str)def run(self):# 执行耗时任务result = "Task result"self.result_ready.emit(result)thread = WorkerThread()
thread.result_ready.connect(lambda result: print("Result:", result))
thread.start()
5.3 处理多线程间的同步和通信问题
在多线程编程中,处理线程间的同步和通信问题是至关重要的,以确保数据的一致性和应用程序的稳定性。PyQt 提供了一些机制来帮助解决这些问题,其中最重要的是信号槽机制和线程安全的数据访问。
5.3.1 信号槽机制
信号槽机制是 PyQt 中用于线程间通信的重要工具。它允许一个对象(信号的发出者)发出信号,而另一个对象(槽函数的接收者)将信号连接到槽函数,从而在信号触发时执行相应的操作。这在多线程环境下特别有用,因为它避免了直接的线程间共享数据。
以下是一个简单的示例,演示如何在多线程中使用信号槽机制:
import sys
from PyQt6.QtCore import QThread, pyqtSignal
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonclass WorkerThread(QThread):result_ready = pyqtSignal(str)def run(self):result = "Task result"self.result_ready.emit(result)class MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Thread Communication Example")self.setGeometry(100, 100, 400, 300)self.button = QPushButton("Start Task", self)self.button.setGeometry(150, 150, 100, 30)self.button.clicked.connect(self.start_thread)def start_thread(self):self.thread = WorkerThread()self.thread.result_ready.connect(self.handle_result)self.thread.start()def handle_result(self, result):print("Result:", result)if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())
5.3.2 线程安全的数据访问
当多个线程同时访问共享数据时,很容易出现竞争条件和数据不一致的问题。为了避免这些问题,你需要使用互斥锁(mutex)来保护共享数据的访问。PyQt 中的 QMutex 和 QMutexLocker 可以帮助你实现线程安全的数据访问。
以下是一个简单的示例,演示如何在多线程中安全地访问共享数据:
import sys
from PyQt6.QtCore import QThread, QMutex, QMutexLockerclass SharedData:def __init__(self):self.mutex = QMutex() # 用于保护共享数据的互斥锁self.data = 0def increment(self):locker = QMutexLocker(self.mutex) # 加锁self.data += 1class WorkerThread(QThread):def __init__(self, shared_data):super().__init__()self.shared_data = shared_datadef run(self):for _ in range(10):self.shared_data.increment()if __name__ == "__main__":shared_data = SharedData() # 创建共享数据对象threads = [WorkerThread(shared_data) for _ in range(4)] # 创建多个工作线程for thread in threads:thread.start() # 启动工作线程for thread in threads:thread.wait() # 等待所有工作线程完成print("Shared data:", shared_data.data) # 打印最终共享数据的值
输出:
在这个示例中,每个工作线程在循环中执行10次的增量操作,使用互斥锁确保在任何时候只有一个线程可以访问和修改
SharedData
对象的data
属性。这样可以避免数据竞争和不一致的情况。注意,这个示例使用了Python中的多线程和互斥锁,与Qt中的线程和互斥锁略有不同。确保你的环境中同时存在Qt库和Python的线程支持(例如
PyQt6.QtCore
和threading
库),以便代码可以正确运行。
5.4 避免死锁和线程饥饿
避免死锁和线程饥饿是多线程编程中的关键问题。死锁指的是多个线程彼此等待对方释放锁,导致程序无法继续执行。线程饥饿是指某个线程长时间无法获得所需的资源或锁,导致其他线程占用资源,使得该线程无法继续执行。以下是在PyQt6中避免死锁和线程饥饿的详解和示例:
避免死锁:
有序获取锁: 当多个线程需要获取多个锁时,确保它们按照相同的顺序获取锁,这可以减少死锁的风险。
超时机制: 在获取锁时使用超时机制,如果无法在一定时间内获取锁,就放弃并释放已有的锁。
避免线程饥饿:
公平性: 使用公平的锁和资源分配策略,确保所有线程都有平等的机会获得资源,避免某个线程长时间无法获得所需资源。
优先级: 在某些情况下,可以通过为线程设置不同的优先级,确保高优先级线程不会长时间无法获得资源。
以下是一个简单的示例,展示如何在PyQt6中使用QMutex来避免死锁和线程饥饿:
import sys
from PyQt6.QtCore import QThread, QMutex, QMutexLocker# 共享资源类,用于展示互斥锁的使用来避免死锁和线程饥饿
class SharedResource:def __init__(self):self.mutex1 = QMutex() # 第一个互斥锁self.mutex2 = QMutex() # 第二个互斥锁def process1(self):with QMutexLocker(self.mutex1): # 获取第一个锁print("Process 1: Mutex 1 locked")QThread.msleep(100) # 模拟处理时间with QMutexLocker(self.mutex2): # 获取第二个锁print("Process 1: Mutex 2 locked")def process2(self):with QMutexLocker(self.mutex2): # 获取第二个锁print("Process 2: Mutex 2 locked")QThread.msleep(100) # 模拟处理时间with QMutexLocker(self.mutex1): # 获取第一个锁print("Process 2: Mutex 1 locked")class WorkerThread(QThread):def __init__(self, shared_resource, process_func):super().__init__()self.shared_resource = shared_resourceself.process_func = process_funcdef run(self):self.process_func()if __name__ == "__main__":shared_resource = SharedResource()thread1 = WorkerThread(shared_resource, shared_resource.process1)thread2 = WorkerThread(shared_resource, shared_resource.process2)thread1.start() # 启动线程1thread2.start() # 启动线程2thread1.wait() # 等待线程1完成thread2.wait() # 等待线程2完成print("Main thread exited") # 主线程退出
在这个示例中,两个线程分别尝试获取两个不同的锁(mutex1和mutex2)。通过始终以相同的顺序获取锁,可以避免死锁。同时,通过在获取锁时使用QMutexLocker,可以确保线程在离开作用域时释放锁。
需要注意的是,死锁和线程饥饿是复杂的问题,可能在更复杂的场景中出现。避免死锁和线程饥饿需要仔细的设计和测试,以确保线程在协同工作时能够正确地进行同步和协调。
QMutex
和 QMutexLocker
QMutex
和QMutexLocker
是 PyQt 中用于线程同步的两个重要类。它们帮助确保多个线程在访问共享资源时的正确同步,以避免竞争条件和数据不一致。下面是关于它们的详解和示例:
QMutex(互斥锁): 互斥锁是一种线程同步机制,用于控制多个线程对共享资源的访问。在多线程环境中,一个线程可以获得互斥锁的所有权,从而可以安全地访问共享资源。其他线程在获取互斥锁之前必须等待,以确保同一时间只有一个线程可以访问共享资源。
示例代码:
from PyQt6.QtCore import QMutexmutex = QMutex()def thread_function():mutex.lock()# 访问共享资源mutex.unlock()# 创建多个线程,每个线程执行 thread_function
QMutexLocker(互斥锁锁定器): QMutexLocker
是 QMutex
的一个辅助类,它在创建时自动锁定 QMutex
,并在销毁时释放锁。这样可以确保在一个作用域内,线程在获取锁后能够正确地释放锁,从而避免忘记释放锁而导致的死锁。
示例代码:
from PyQt6.QtCore import QMutex, QMutexLockermutex = QMutex()def thread_function():with QMutexLocker(mutex): # 进入作用域时自动锁定,离开作用域时自动释放# 访问共享资源# 创建多个线程,每个线程执行 thread_function
在使用
QMutexLocker
时,当线程离开作用域(例如使用with
语句),会自动释放锁,无论是否发生异常。
相关文章:

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程
目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…...

STM32--TIM定时器(3)
文章目录 输入捕获简介频率测量输入捕获通道输入捕获基本结构PWMI的基本结构输入捕获模式测量PWM频率和占空比代码 编码器接口正交编码器工作模式接口基本结构TIM编码接口器测速代码: 输入捕获简介 输入捕获IC(Input Capture),是处理器捕获外部输入信号…...

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记
文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单,功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细,可以直接上手。 基本命令: 创建爬虫项目 feapder create -p first-project创建爬虫 …...

设计模式详解-享元模式
类型:结构型模式 实现原理:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象 目的:减少创建对象的数量以减少内存占用和提高性能。 解决的问题:大量的对象可能造成的内存溢出问题 解决方法&a…...

BDA初级分析——用SQL筛选数据
一、用SQL对数据分组 GROUP BY Group by,按...分组 作用:根据给定字段进行字段的分组,通常和聚合函数配合使用,实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …...

(成功踩坑)electron-builder打包过程中报错
目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…...

【STM32】 工程
🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…...

Git概述
目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道,林纳斯托瓦兹在1991年创建了开源的Linux,从…...

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块
如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…...

近 2000 台 Citrix NetScaler 服务器遭到破坏
Bleeping Computer 网站披露在某次大规模网络攻击活动中,一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞,入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…...

MySQL MVCC的详解之Read View
文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中,我们提到了MVCC(Multi-Version Concurrency Control)多版本并发控制,是通过undo log来实现的。那具…...

基于springboot+vue的考研资讯平台(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

学习网络编程No.3【socket理论实战】
引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…...

Linux学习之ssh和scp
ls /etc/ssh可以看到这个目录下有一些文件,而/etc/ssh/ssh_config是客户端配置文件,/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息,发现这个配置端口是22…...

录制游戏视频的软件有哪些?分享3款软件!
“有录制游戏视频的软件推荐吗?最近迷上了网游,想录制点自己高端操作的游戏画面,但是不知道用什么软件录屏比较好,就想问问大家,有没有好用的录制游戏视频软件。” 在游戏领域,玩家们喜欢通过录制游戏视频…...

每日一题——螺旋矩阵
题目 给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。 数据范围:0≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100 要求:空间复杂度 O(nm) ,时间复杂度 O(nm)…...

前端面试的性能优化部分(12)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...

SAP BTEs 业务交易事件/增强(Business Transaction Event)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、BTEs是什么? 二、使用步骤 1.查找BTE event 2.处理FM 总结 前言 SAP BTEs是一种新型的增强方式,可以通过事务代码FIFB打开&#…...

leetcode做题笔记90. 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 思路一:回溯 int comp(const void* a, cons…...

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程
随着技术的飞速发展,软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面,DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒,DevOps将持续集成、持续交付和自动化流程引入到软件开发中,使团队能够更快地…...

自学C#,要懂得善用MSDN
很多初学者学习编程,都会通过看别人写的教程、或者录制的视频,来学习。 这是一个非常好的途径,因为这个是非常高效的。 但是这样,存在两个问题: 1、教程不够全面:任何再好的教程,都无法囊括所…...

mac上如何压缩视频大小?
mac上如何压缩视频大小?由于视频文件体积庞大,常常会占据我们设备的大量存储空间。通常情况下,我们选择删除视频以释放内存,但这将永久丢失它们。然而,有一种更好的方法可以在不删除视频的情况下减小内存占用ÿ…...

git merge规则
参考文档:https://juejin.cn/post/7129333439299321887 丹尼尔:Hi,蛋兄,周杰伦都出新专辑了,你咋还不更新啊,真的打算半年一更啊? 蛋先生:好像确实是这样,要不࿰…...

【周末闲谈】关于“数据库”你又知道多少?
个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 系列目录前言数据库数据库的五大特点数据库介绍数据库管理系统&a…...

C++ 对象生成:构造函数
对象生成:构造函数 一、构造函数特性二、三种构造函数1.无参构造函数2.有参构造函数3.拷贝构造函数 一、构造函数特性 C编译器提供了构造函数供程序生成对象这是一个与类同名的函数,参数可以有多种形式(重载)没有返回类型声明一般…...

RFID如何在汽车混流生产中进行车辆跟踪?
在汽车混流生产中,RFID技术可以对每个车辆进行唯一标识,从而实现车辆生产全程跟踪。实时确定车辆的位置、状态和生产过程,生产管理系统就能够对生产流程进行实时监控和管理,及时发现和解决问题,提高生产效率和质量。 焊…...

差值结构的复合底部
( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A 中有3个点,B中有1个点,且不重合,统计迭代次数并排序。 其中有20组数据 让迭代次数与排斥能成反比,排…...

在Docker 上使用 Nginx 配置https及wss
预先创建挂载文件 /mydata/nginx/conf/nginx.conf /mydata/nginx/cert /mydata/nginx/conf.d /mydata/nginx/html /mydata/nginx/logs运行并且挂载容器 docker run -p 80:80 -p 443:443 --name nginx01 --restartalways \ -v /mydata/nginx/conf/nginx.conf:/etc/nginx/ngi…...

git回退操作
1. 在工作区回退: 此时文件没有经过任何提交 git checkout -- filename2. git add之后回退 git reset HEAD3. git commit 之后回退 git reset --hard commit_id(前4位)其中,commit_id可通过git log查看,例如: qzcryqz MINGW6…...

C++系列-类和对象-静态成员
类和对象-静态成员 静态成员静态成员变量静态成员函数 静态成员 静态成员就是在成员变量或者是成员函数前面加上static关键字。 静态成员变量 所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化可以通过对象或者类名进行访问。静态成员变量也具有访问…...