Android开发——初步学习Activity:什么是Activity

Android开发——初步学习Activity:什么是Activity

​ 在 Android 中,Activity 是一个用于展示用户界面的组件。每个 Activity 通常对应应用中的一个屏幕,例如主界面、设置界面或详情页。Activity 负责处理用户的输入事件,更新 UI,并与其他组件(如服务、广播接收器)进行交互。如果接触过Qt开发的同志,一点不会难以想到Activity就有点像咱们的QMainWindow一样,作为UI交互大的容器。

🛠️创建一个Activity

​ 咱们先不deep dive到Activity的基本原理,我们就先创建一个玩玩。一般而言,咱们作为快速开发者,不会自己鹿代码和在XML中自己手动改,容易出错。

基本步骤(一次性的)
  1. 打开项目:启动 Android Studio,打开您的项目。
  2. 右键点击包名:在项目视图中,导航到 app > src > main > java > com.example.yourapp,右键点击您的包名(例如 com.example.myapp)。
  3. 选择创建 Activity:选择 New > Activity,然后选择您想要的 Activity 类型,例如 Empty Activity
  4. 配置 Activity
    • Activity Name:输入 Activity 的名称(如 SecondActivity)。
    • Layout Name:输入布局文件的名称(默认为 activity_second)。
    • Title:设置该 Activity 的标题。
    • Launcher Activity:如果您希望此 Activity 为启动 Activity,请勾选此选项。
    • Source Language:在今天,你只能使用Kotlin了,Java是不被支持的。
  5. 完成创建:点击 Finish,Android Studio 会自动生成相应的 Activity 类、布局文件,并在 AndroidManifest.xml 中注册该 Activity。
手动创建 Activity(分步进行)

如果您希望更灵活地控制创建过程,可以手动创建 Activity。

  1. 创建 Activity 类

    • 在项目视图中,导航到 app > src > main > java > com.example.yourapp
    • 右键点击您的包名,选择 New > Java ClassNew > Kotlin Class/File
    • 输入类名(如 SecondActivity),并使其继承 AppCompatActivity
    • 实现 onCreate() 方法,并通过 setContentView() 设置布局文件。
    public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);}
    }
    
  2. 创建布局文件

    • res > layout 目录下,右键点击,选择 New > Layout Resource File
    • 输入文件名(如 activity_second.xml),并设计您的布局。
  3. 注册 Activity

    • 打开 AndroidManifest.xml 文件。
    • <application> 标签内,添加以下代码以注册新创建的 Activity:
    <activity android:name=".SecondActivity" />
    

在 AndroidManifest.xml 中注册 Activity(一般你不用做这个,Android Studio帮你做了)

AndroidManifest.xml是咱们的安卓APP的一个总导览,我们的Activities必须在这里被表达,所以,无论是使用向导还是手动创建 Activity,都需要在 AndroidManifest.xml 中注册该 Activity。通常,Android Studio 会自动为您完成此操作,但如果没有,您可以手动添加:

<activity android:name=".SecondActivity" />

如果您希望此 Activity 为启动 Activity(即应用启动时首先显示的界面),需要在 <activity> 标签中添加 intent-filter

<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

准备完成我们的业务——Layout文件

​ Activities的默认代码中,就帮助我们生成好了OnCreate方法,一般而言,我们的默认代码包括但不限于:回调父类的onCreate创建方法,下一步,我们往往是要加载我们的ContentView,让我们的APP的布局文件生效。

​ 在Qt中,咱们的Layout是Ui_xxx.ui搞定的,它本身是一个XML文件,声明式的说明我们的布局如何。安卓自身也是这样做的。我们会在Layout文件夹下创建layout XML文件,在代码中采用资源加载的方式联合起来搞定我们的布局加载动作。

什么是 Android 布局文件?

Android 布局文件是以 XML 格式编写的文件,位于项目的 res/layout/ 目录下。它们描述了应用界面的结构和外观,包括视图组件(如按钮、文本框、图片等)及其排列方式。通过布局文件,开发者可以在不编写大量代码的情况下,快速构建出界面。


🧩 布局文件的基本结构

一个典型的布局文件通常包含以下几个部分:

  1. XML 声明和命名空间

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent">
    
    • xmlns:android:声明 XML 命名空间,Android 系统通过它识别属性。
    • android:layout_widthandroid:layout_height:定义布局的宽度和高度,常用值有 match_parentwrap_content 和具体的 dp 值。
  2. 视图组件(Views)

    在布局文件中,视图组件是构建 UI 的基本单元,如:

    <TextView android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, World!" />
    
    • android:id:为视图指定唯一标识符,供代码中引用。
    • android:text:设置文本内容。
  3. 布局容器(ViewGroup)

    布局容器是用于组织和排列子视图的容器类,如:

    • LinearLayout:线性布局,按水平或垂直方向排列子视图。
    • RelativeLayout:相对布局,子视图相对于父视图或其他兄弟视图定位。
    • ConstraintLayout:约束布局,使用约束关系定位子视图,推荐用于复杂布局。
    • FrameLayout:帧布局,通常用于显示单一视图或堆叠多个视图。

    示例:

    <LinearLayout android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 子视图 -->
    </LinearLayout>
    

🛠️ 如何在 Android Studio 中创建布局文件

在 Android Studio 中创建布局文件的步骤如下:

  1. 使用向导创建布局文件
    • 在项目视图中,右键点击 res/layout 目录,选择 New > Layout Resource File
    • 输入文件名(如 activity_main.xml),选择根布局类型(如 LinearLayout)。
    • 点击 OK,Android Studio 会自动生成布局文件。
  2. 手动编写布局文件
    • res/layout 目录下创建新的 XML 文件。
    • 使用上述结构和组件,手动编写布局内容。
  3. 使用设计视图
    • 打开布局文件,切换到 Design 视图。
    • 使用拖拽方式添加和配置视图组件,Android Studio 会自动生成相应的 XML 代码。

💡 常用布局类型及其适用场景

布局类型描述适用场景
LinearLayout子视图按线性方向排列(水平或垂直)简单的列表、表单布局
RelativeLayout子视图相对于父视图或其他兄弟视图定位复杂的布局,子视图之间有相对关系时
ConstraintLayout使用约束关系定位子视图,性能优于嵌套布局推荐用于复杂布局,减少嵌套层级,提高性能
FrameLayout子视图堆叠在一起,通常用于显示单一视图或覆盖层显示单一内容、图片查看器、视频播放器等
TableLayout子视图按行和列排列,适用于表格布局表格数据展示、日历布局
GridLayout子视图按网格排列,支持跨行跨列图像画廊、日程安排等

📐 布局属性详解

  • android:layout_widthandroid:layout_height
    • match_parent:视图的大小填充父容器。
    • wrap_content:视图的大小适应其内容。
    • 固定值(如 200dp):指定具体的尺寸。
  • android:orientation
    • horizontal:子视图水平排列。
    • vertical:子视图垂直排列。
  • android:paddingandroid:margin
    • padding:视图内容与边界之间的内边距。
    • margin:视图与其他视图之间的外边距。
  • android:gravityandroid:layout_gravity
    • gravity:控制视图内部内容的对齐方式。
    • layout_gravity:控制视图在父容器中的对齐方式。
  • android:layout_weight
    • LinearLayout 中,指定视图占用剩余空间的比例。

📱 响应式布局与多屏适配

为了适应不同设备和屏幕尺寸,Android 提供了多种方式进行布局适配:

  1. 布局资源目录分组

    • res/layout/:默认布局。
    • res/layout-large/:大屏设备布局。
    • res/layout-land/:横屏布局。
    • res/layout-sw600dp/:屏幕宽度大于等于 600dp 的设备布局。

    Android Studio 支持根据设备配置自动选择合适的布局资源。

  2. 布局变体(Layout Variants)

    • 在 Android Studio 中,右键点击布局文件,选择 Create Layout Variant
    • 为特定设备配置创建布局变体,如平板、折叠屏等。
  3. 使用 ConstraintLayout

    • 通过约束关系定位视图,减少嵌套层级,提高布局性能。
    • 支持链式布局、偏移量、比例等复杂布局需求。

在布局文件中编写自己的控件排布

​ 咱们说了,布局使用XML编写,我们其中的控件亦是如此。

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompatxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"/><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/Button1Text"tools:ignore="MissingConstraints" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/Button2Text"tools:ignore="MissingConstraints" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/button_depatch_activity"android:text="@string/button_start_activity_text"/>
</androidx.appcompat.widget.LinearLayoutCompat>

1. android:id

该属性为视图组件指定一个唯一的标识符。在 Java 或 Kotlin 代码中,可以通过该 ID 引用该按钮,以便设置点击事件监听器或修改其属性。

例如:

val button = findViewById<Button>(R.id.button_depatch_activity)
button.setOnClickListener {// 处理按钮点击事件
}

2. android:layout_widthandroid:layout_height

这两个属性定义了视图组件的宽度和高度。

  • match_parent:视图将扩展以填充其父容器的剩余空间。
  • wrap_content:视图将根据其内容的大小来调整自身的尺寸。

在上述示例中,layout_width 设置为 match_parent,表示按钮的宽度将与其父容器的宽度相同;layout_height 设置为 wrap_content,表示按钮的高度将根据其内容的高度来调整。


3. android:text

该属性设置按钮上显示的文本内容。在上述示例中,@string/button_start_activity_text 是一个引用字符串资源的方式,表示按钮上显示的文本内容来自于 res/values/strings.xml 文件中的 button_start_activity_text 字符串资源。

使用字符串资源的好处是可以方便地进行国际化和本地化,使应用支持多种语言。


4. 其他常用的按钮属性

  • android:background:设置按钮的背景,可以是颜色、图片或 drawable 资源。
  • android:textColor:设置按钮文本的颜色。
  • android:textSize:设置按钮文本的大小。
  • android:padding:设置按钮内容与边界之间的内边距。
  • android:layout_margin:设置按钮与其他视图之间的外边距。

例如:

<Buttonandroid:id="@+id/button_example"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me"android:background="@drawable/button_background"android:textColor="@color/white"android:textSize="16sp"android:padding="10dp"android:layout_margin="20dp" />

在代码中使用我们的布局文件下的控件

​ 在上面我们看到了layout下的所有控件都有自己的ID。这是我们访问控件的一个关键。笔者学习了两种办法搞定拿到控件这个工作

使用 findViewById 方法

findViewById 是 Android 中传统的控件查找方式。它通过控件的 ID 在视图层次结构中查找对应的控件。例如:

val textView: TextView = findViewById(R.id.textView)

优点:

  • 简单直接:对于小型项目或简单的布局,findViewById 足够使用。

缺点:

  • 类型转换问题:需要手动进行类型转换,容易出错。
  • 空指针异常:如果控件未在布局中定义,可能导致空指针异常。
  • 性能问题:每次调用都会遍历视图层次结构,可能影响性能。

使用 ViewBinding 方法

ViewBinding 是 Jetpack 提供的一种类型安全、空安全的控件访问方式。它在编译时生成绑定类,直接引用控件,避免了类型转换和空指针异常的问题。例如:

val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val textView: TextView = binding.textView

优点:

  • 类型安全:生成的绑定类直接引用控件,避免了类型转换问题。
  • 空安全:如果控件未在布局中定义,对应的绑定属性为 null,避免了空指针异常。
  • 性能优化:绑定类在编译时生成,运行时无需再次查找控件,提升性能。

缺点:

  • 需要启用 ViewBinding:需要在 build.gradle 文件中启用 ViewBinding。
特性findViewByIdViewBinding
类型安全❌ 手动类型转换✅ 自动类型匹配
空安全❌ 可能导致空指针异常✅ 自动处理空值
性能❌ 每次查找控件✅ 编译时生成绑定类
使用复杂度✅ 简单✅ 需要启用 ViewBinding
适用场景小型项目、简单布局中大型项目、复杂布局

启用 ViewBinding(需要修改gradle文件)

在项目中启用 ViewBinding 的步骤如下:

  1. build.gradle 文件中启用 ViewBinding:

    android {...viewBinding {enabled = true}
    }
    
  2. 在 Activity 或 Fragment 中使用 ViewBinding:

    val binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    

    这样,您就可以通过 binding.textView 直接访问控件,而无需使用 findViewById

Activity使用最简单的Options Menu的办法

Options Menu 的典型流程:

  1. 你在 res/menu/*.xml 定义菜单资源(<menu> + <item>)。
  2. 系统(或 AppCompat 的框架)在需要时创建一个 Menu 对象并调用 Activity 的 onCreateOptionsMenu(menu) —— 在这里你用 menuInflater.inflate() 把 XML 转成 Menu 项。
  3. 菜单显示前会调用 onPrepareOptionsMenu(menu),你可以在这里做按状态修改(可见性、enable 等)。
  4. 用户点击菜单项时,系统调用 onOptionsItemSelected(item),你在这里处理点击逻辑。
  5. 当你希望运行时刷新菜单,调用 invalidateOptionsMenu()(Activity 方法),系统会触发 onPrepareOptionsMenu()(必要时会重建)。

基本菜单资源(XML)

res/menu/menu_main.xml(示例)

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/action_search"android:title="@string/search"android:icon="@drawable/ic_search"app:showAsAction="ifRoom|collapseActionView"app:actionViewClass="androidx.appcompat.widget.SearchView" /><itemandroid:id="@+id/action_settings"android:title="@string/settings"app:showAsAction="never" />
</menu>
  • app:showAsAction:控制是否直接显示在 Toolbar(action)或放入 overflow。务必用 app 命名空间(res-auto)。
  • 可用属性:android:idandroid:titleandroid:icon、子 <menu><group>android:checkableBehavior 等。

在 Activity 中 inflate 菜单

MenuInflater.inflate(int menuRes, Menu menu) —— 将 XML 转为 Menu 项。通常在:

override fun onCreateOptionsMenu(menu: Menu): Boolean {menuInflater.inflate(R.menu.menu_main, menu)// 可在这里初始化 actionView(SearchView 等)return true // 返回 true 表示要显示菜单
}

注意:返回 true 很关键——否则不会显示菜单。

动态更新菜单

  • onPrepareOptionsMenu(menu: Menu): Boolean:每次菜单显示之前被调用(可以修改 menu.findItem(id) 的状态)。
  • invalidateOptionsMenu()(Activity 方法):通知系统菜单需要刷新(将触发 onPrepareOptionsMenu())。

示例:

override fun onPrepareOptionsMenu(menu: Menu): Boolean {menu.findItem(R.id.action_settings)?.isVisible = isLoggedInreturn super.onPrepareOptionsMenu(menu)
}

处理菜单点击

override fun onOptionsItemSelected(item: MenuItem): Boolean {return when (item.itemId) {R.id.action_search -> { /* 处理 */ true }R.id.action_settings -> { startActivity(...) ; true }else -> super.onOptionsItemSelected(item)}
}

返回 true 表示你处理了事件;否则交给父类或系统。

访问/操作 Menu 与 MenuItem(常用 API)

  • menu.findItem(R.id.some)MenuItem
  • menu.add(int groupId, int itemId, int order, CharSequence title) → 动态添加项
  • menu.removeItem(itemId) → 删除项
  • menu.setGroupVisible(groupId, boolean) → 整组显示/隐藏
  • menu.setGroupCheckable(groupId, true, true) → 设置单选/多选行为

MenuItem 常用方法:

  • item.setVisible(boolean)item.setEnabled(boolean)item.setChecked(boolean)
  • item.getActionView() / item.setActionView(view or layoutRes) —— 获取或设置当作 action view 的自定义视图(例如 SearchView)
  • item.expandActionView() / item.collapseActionView() —— 展开/收起 action view(如果设置了 collapseActionView

与 Toolbar/ActionBar 的关系

  • 如果你使用 Toolbar 并想让 it 成为 ActionBar:
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)

之后菜单回调 (onCreateOptionsMenu / onOptionsItemSelected) 不变。显示与布局由 Toolbar 管理(它会给 Menu 渲染视图)。

SearchView / actionView 的常见用法

onCreateOptionsMenu() 初始化:

val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem.actionView as? SearchView
searchView?.setOnQueryTextListener(object: SearchView.OnQueryTextListener {override fun onQueryTextSubmit(query: String): Boolean { doSearch(query); return true }override fun onQueryTextChange(newText: String): Boolean = false
})

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

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

相关文章

【左程云算法03】对数器算法和数据结构大致分类

目录 对数器的实现 代码实现与解析 1. 随机样本生成器 (randomArray) 2. 核心驱动逻辑 (main 方法) 3. 辅助函数 (copyArray 和 sameArray) 对数器的威力 算法和数据结构简介​编辑 1. 硬计算类算法 (Hard Computing) 2. 软计算类算法 (Soft Computing) 核心观点 一个…

MATLAB | 绘图复刻(二十三)| Nature同款雷达图

Hello 真的好久不见&#xff0c;这期画一个Nature同款雷达图&#xff0c;原图是下图中的i图&#xff0c;长这样&#xff1a; 本图出自&#xff1a; Pan, X., Li, X., Dong, L. et al. Tumour vasculature at single-cell resolution. Nature 632, 429–436 (2024). https://d…

React Hooks UseCallback

开发环境&#xff1a;React Native Taro TypescriptuseCallback的用途&#xff0c;主要用于性能优化&#xff1a;1 避免不必要的子组件重渲染&#xff1a;当父组件重渲染时&#xff0c;如果传递给子组件的函数每次都是新创建的&#xff0c;即使子组件使用了 React.memo&#…

使用SD为VFX制作贴图

1.制作遮罩 Gradient Linear 1 通过Blend 可以混合出不同遮罩 2.径向渐变 Shape 节点 , 非常常用 色阶调节灰度和渐变过渡 曲线能更细致调节灰度 色阶还可以反向 和圆盘混合 就是 菲涅尔Fresnel 3. 屏幕后处理渐变 第二种方法 4. 极坐标 Gradient Circular Threshold 阈值节…

面经分享二:Kafka、RabbitMQ 、RocketMQ 这三中消息中间件实现原理、区别与适用场景

一、实现原理 (Implementation Principle) 1. Apache Kafka&#xff1a;分布式提交日志 (Distributed Commit Log) Kafka 的核心设计理念是作为一个分布式、高吞吐量的提交日志系统。它不追求消息的复杂路由&#xff0c;而是追求数据的快速、持久化流动。 存储结构&#xff1a;…

Android开发——初步了解AndroidManifest.xml

Android开发——初步了解AndroidManifest.xml ​ AndroidManifest.xml 是 Android 应用的清单文件&#xff0c;包含了应用的包名、组件声明、权限声明、API 版本信息等。它是 Android 应用的“说明书”&#xff0c;系统通过它了解应用的结构和行为。咱们的AndroidManifest文件实…

ecplise配置maven插件

1.下载maven 2.配置系统变量 MAVEN_HOME&#xff1a; E:\CODE\MAVEN\apache-maven-3.0.4 3.配置环境变量 %MAVEN_HOME%\bin 4.cmd&#xff1a;mvn -version 注1 如图所示为&#xff1a;成功 注1&#xff1a;配置成功的前提是要有配置JAVA_HOME,如果没有配置&#xff0c;则…

Vue 项目性能优化实战

性能优化有一套「发现 → 定位 → 解决」的闭环方法论。本文以真实项目为蓝本&#xff0c;从编码阶段到上线监控&#xff0c;给出一条可落地的 Vue 性能优化路线图。 一、量化指标定位性能瓶颈 任何优化之前先用量化证据锁死问题。 Lighthouse 一键跑分&#xff1a;首屏、交互、…

阿里云智能多模态大模型岗三面面经

阿里云智能多模态大模型岗三面面经&#xff08;详细问题感受&#xff09; 最近面试了 阿里云智能集团 - 多模态大模型岗位&#xff0c;三轮技术面&#xff0c;整体体验还不错。问题整体偏常规&#xff0c;但对项目的追问比较细致。这里整理一下完整面经&#xff0c;供准备类似岗…

C++ 条件变量 通知 cv.notify_all() 先释放锁再通知

简短的回答是&#xff1a;先释放锁&#xff0c;再通知&#xff08;notify_one 或 notify_all&#xff09;通常是更优的选择。 虽然标准允许两种顺序&#xff0c;但“先解锁&#xff0c;后通知”的性能通常更好。 下面我们来详细解释原因和两种方式的区别。 先通知&#xff0c;后…

案例精选 | 南京交通职业技术学院安全运营服务建设标杆

导语 随着教育信息化的深入推进&#xff0c;高校已成为数字化转型的前沿阵地。然而&#xff0c;伴随着教学、科研、管理等业务系统的全面上云与互联互通&#xff0c;高校网络环境日益复杂&#xff0c;面临的网络安全威胁也愈发严峻。勒索病毒、数据泄露、APT攻击等安全事件频发…

AI安全必修课:模型偏见检测与缓解实战

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;AI偏见——看不见的技术债务 2018年&#xff0c…

Trae + MCP : 一键生成专业封面

每日一句 人生只有走出来的美丽&#xff0c; 没有等出来的辉煌。 目录 每日一句 前言 一.核心工具与优势解析 二.操作步骤&#xff1a;从配置到生成广告封面 前期准备&#xff1a;确认环境与工具版本 第一步. 获取配置代码 第二步&#xff1a;在 Trae 中导入 MCP 配置…

Eureka与Nacos的区别-服务注册+配置管理

Eureka与Nacos的区别-服务注册配置管理 以下是 Eureka 和 Nacos 的核心区别对比&#xff0c;帮你清晰理解它们的不同定位和特性&#xff1a; ​1. 核心定位​ ​Eureka&#xff1a;​​ ​纯服务注册与发现中心&#xff0c;源自 Netflix&#xff0c;核心功能是维护服务实例清单…

这才是真正懂C/C++的人,写代码时怎么区分函数指针和指针函数?

1.介绍 很多初中级开发者常常在这两个术语之间感到困惑,分不清它们的定义、语法和应用场景,从而在实际编程中埋下隐患。本文旨在拨开迷雾,从概念定义、语法解析、核心区别及实战应用四个维度,对函数指针与指针函数进行一次全面、深入的辨析,帮助您彻底厘清这两个概念,并…

Go基础(④指针)

简单示例package mainimport "fmt"func main() {var num int 100var p *int &num // 指向int类型的指针fmt.Println(*p) // 解引用&#xff0c;输出 100*p 200 // 通过指针修改原变量fmt.Println(num) // 输出 200 }package mainimport "fmt…

java社交小程序源码支持APP多端springboot部署与功能模块详解

构建一个支持 多端访问、实时互动、商城交易 的综合型应用&#xff0c;已成为众多企业和开发团队的共同目标。由 宠友信息技术有限公司 打造的 友猫社区&#xff0c;正是基于 Spring Boot 技术栈 的全端解决方案&#xff0c;既能支持 微信小程序、APP、PC管理后台&#xff0c;又…

代理连接性能优化:提升网络效率的关键技术与实践

在当今数字化时代&#xff0c;代理连接性能优化已成为网络架构设计中的关键环节。本文将深入探讨如何通过技术手段提升代理服务器的响应速度、稳定性和资源利用率&#xff0c;帮助读者构建高效可靠的代理网络体系。 代理连接性能优化&#xff1a;提升网络效率的关键技术与实践 …

Rust 元组

简介 元组可以由多种类型组成&#xff0c;长度固定。 创建元组 // 固定类型 let tup1: (i32, f64, u8) (500, 8.8, 1);// 不固定类型 let tup2 (500.99, 8.8, 1, 9.99);println!("{}", tup2.0);用模式匹配解构元组 let tup (500.99, 8.8, 1, 9.99); let (x, y…

突破闭集限制:3D-MOOD 实现开集单目 3D 检测新 SOTA

【导读】 单目 3D 目标检测是计算机视觉领域的热门研究方向&#xff0c;但如何在真实复杂场景中识别“未见过”的物体&#xff0c;一直是个难题。本文介绍的 3D-MOOD 框架&#xff0c;首次提出端到端的开集单目 3D 检测方案&#xff0c;并在多个数据集上刷新了 SOTA。 目录 …