学习Android的第四天

目录

Android FrameLayout ( 帧布局 )

FrameLayout size 大小

FrameLayout 属性

Android GridLayout ( 网格布局 )

GridLayout 属性

计算器布局

Android AbsoluteLayout 绝对布局

AbsoluteLayout 四大控制属性


Android FrameLayout ( 帧布局 )

FrameLayout 是 Android 中的一个布局容器,用于在单个视图中显示一个子视图。它是一种简单的布局,所有的子视图都位于屏幕的左上角,并且彼此重叠。

FrameLayout 主要用于显示单个子视图或在子视图之间进行切换,例如用于片段(Fragments)的容器或者在底部显示一个浮动的按钮。

FrameLayout (帧布局) 有一个缺点就是没有任何的定位方式,所以应用的场景并不多。

FrameLayout size 大小

在 FrameLayout 中,它的大小通常由其最大的子控件决定。如果子控件的大小相同,那么后面添加的子控件会覆盖在前面的子控件之上。这种特性使得 FrameLayout 适用于显示单一视图或在不同的子视图之间进行切换的场景。

另外,FrameLayout 默认将子控件放置在左上角。可以通过 android:layout_gravity 属性来指定子控件的位置,将其放置在不同的位置。

android:layout_gravity 是一个布局参数,用于指定一个视图在其父容器中的对齐方式或者在 FrameLayout 中的重叠方式。该属性的值是一个位掩码,可以同时指定多个对齐方式。

以下是一些常用的 android:layout_gravity 的属性值及其含义:

  • center:将视图在父容器中水平和垂直方向上居中对齐。
  • center_horizontal:将视图在父容器中水平方向上居中对齐。
  • center_vertical:将视图在父容器中垂直方向上居中对齐。
  • top:将视图在父容器中顶部对齐。
  • bottom:将视图在父容器中底部对齐。
  • left:将视图在父容器中左侧对齐。
  • right:将视图在父容器中右侧对齐。
  • start:将视图在父容器中起始边对齐,根据文本方向,可能是左边或者右边。
  • end:将视图在父容器中结束边对齐,根据文本方向,可能是右边或者左边。
  • fill:视图填充整个父容器,水平和垂直方向都会被拉伸。
  • fill_horizontal:视图在水平方向上填充整个父容器。
  • fill_vertical:视图在垂直方向上填充整个父容器。
  • clip_vertical:在垂直方向上剪切视图,超出父容器的部分不可见。
  • clip_horizontal:在水平方向上剪切视图,超出父容器的部分不可见。
  • center|bottom:将视图在父容器中水平居中对齐,垂直方向上底部对齐。

以下是一个简单的示例,演示了 FrameLayout 中使用 android:layout_gravity 属性的情况:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 子控件1,位于左上角 --><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:background="#FFC107"android:text="左上角"/><!-- 子控件2,位于底部中央 --><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="底部中央"android:layout_gravity="bottom|center_horizontal"android:background="#2196F3"android:textColor="#ffffff"/><!-- 子控件3,位于中央 --><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="位于中央"android:layout_gravity="center"android:background="#9C27B0"android:textColor="#ffffff"/>    
</FrameLayout>

运行结果:

FrameLayout 属性

FrameLayout 只有两个自有属性,它们分别是:

1、android:foreground:

  • 说明:设置帧布局容器的前景图像。
  • 前景图像是永远处于帧布局最上面的图像,不会被覆盖。可以是颜色、图片等。

2、android:foregroundGravity:

  • 说明:设置前景图像显示的位置。
  • 该属性用于指定前景图像在帧布局中的对齐方式,类似于 android:layout_gravity,但是专用于前景图像。例如,可以设置为 center、top、bottom 等值。

范例 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 帧布局的内容 --><TextViewandroid:layout_width="500dp"android:layout_height="300dp"android:background="#00ff00" /><TextViewandroid:layout_width="150dp"android:layout_height="150dp"android:background="#ff0000" /><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:background="#00ffff" /><!-- 前景图像,例如遮罩层或者水印 --><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/meimei"android:foreground="@android:color/darker_gray"android:foregroundGravity="center"/></FrameLayout>

运行结果:

趣味实例

随手指点击而移动的图片

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/mylayout"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:background="@drawable/bg" >
</FrameLayout>
MainActivity.java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.app.Activity;
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);final MeiMeiView meimei = new MeiMeiView(MainActivity.this);//为我们的妹子添加触摸事件监听器meimei.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {//设置妹子显示的位置meimei.bitmapX = event.getX() - 150;meimei.bitmapY = event.getY() - 150;//调用重绘方法meimei.invalidate();return true;}});frame.addView(meimei);}
}

 MeiMeiView.java

package com.example.myapplication;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;public class MeiMeiView extends View {//定义相关变量,依次是妹子显示位置的X,Y坐标public float bitmapX;public float bitmapY;public MeiMeiView(Context context) {super(context);//设置妹子的起始坐标bitmapX = 0;bitmapY = 200;}//重写View类的onDraw()方法@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//创建,并且实例化 Paint 的对象Paint paint = new Paint();//根据图片生成位图对象Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.meimei);//绘制妹子canvas.drawBitmap(bitmap, bitmapX, bitmapY,paint);//判断图片是否回收,木有回收的话强制收回图片if(bitmap.isRecycled()){bitmap.recycle();}}
}

Android GridLayout ( 网格布局 )

GridLayout 是 Android 中一种非常灵活的布局容器,允许您以网格形式排列子视图。相比于 TableLayout,GridLayout 提供了更多的灵活性和自定义性。

GridLayout 的主要特性:

  • 自定义行和列:可以通过 rowCount 和 columnCount 属性来指定网格布局的行数和列数,决定了整个网格的大小。
  • 子视图的位置:可以使用 layout_row 和 layout_column 属性来直接指定子视图所在的行和列。行和列的索引从0开始。
  • 子视图横跨行和列:使用 layout_rowSpan 和 layout_columnSpan 属性可以指定子视图横跨的行数和列数。这使得可以创建跨越多个单元格的复杂布局。
  • 对齐方式:通过 layout_gravity 属性,可以指定子视图在其单元格内的对齐方式。例如,可以设置为 top, center, bottom, start, end 等。
  • 自适应大小:子视图可以根据内容自适应大小,也可以通过 layout_width 和 layout_height 属性进行设置。

GridLayout 属性

1、排列方式:

  • android:orientation:用于设置子组件的排列方式,可选值为 vertical(默认,垂直排列)或 horizontal(水平排列)。
  • android:gravity:用于设置子组件的排列方式,可选值包括 center(居中)、left(靠左)、right(靠右)、bottom(底部)等。如果需要同时使用多种排列方式,可以使用位运算符,例如 left|bottom。

2、设置网格布局的行和列:

  • android:rowCount:用于设置网格布局有几行。
  • android:columnCount:用于设置网格布局有几列。

3、设置组件所在的行或列:

  • android:layout_row:用于设置组件位于第几行。
  • android:layout_column:用于设置组件位于第几列。

4、设置组件跨越的行和列:

  • android:layout_rowSpan:用于设置组件跨越几行。
  • android:layout_columnSpan:用于设置组件跨越几列。

计算器布局

GridLayout 布局最经典的就是 计算器 了,这是一个天然的网格布局。

下面是具体代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:columnCount="4"android:orientation="horizontal"android:rowCount="6" ><TextViewandroid:id="@+id/displayTextView"android:layout_columnSpan="4"android:layout_gravity="fill"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:background="#dddddd"android:text="0"android:textSize="50sp" /><Buttonandroid:id="@+id/buttonClear"android:layout_columnSpan="2"android:layout_gravity="fill"android:text="清空" /><Buttonandroid:id="@+id/buttonBack"android:layout_columnSpan="2"android:layout_gravity="fill"android:text="回退" /><Buttonandroid:id="@+id/button1"android:text="1" /><Buttonandroid:id="@+id/button2"android:text="2" /><Buttonandroid:id="@+id/button3"android:text="3" /><Buttonandroid:id="@+id/buttonPlus"android:text="+" /><Buttonandroid:id="@+id/button4"android:text="4" /><Buttonandroid:id="@+id/button5"android:text="5" /><Buttonandroid:id="@+id/button6"android:text="6" /><Buttonandroid:id="@+id/buttonMinus"android:layout_width="wrap_content"android:text="-" /><Buttonandroid:id="@+id/button7"android:text="7" /><Buttonandroid:id="@+id/button8"android:text="8" /><Buttonandroid:id="@+id/button9"android:text="9" /><Buttonandroid:id="@+id/buttonMultiply"android:text="*" /><Buttonandroid:id="@+id/button0"android:layout_columnSpan="2"android:layout_gravity="fill"android:text="0" /><Buttonandroid:id="@+id/buttonDot"android:layout_width="wrap_content"android:text="." /><Buttonandroid:id="@+id/buttonDivide"android:text="/" /><Buttonandroid:id="@+id/buttonEquals"android:text="=" /></GridLayout>

MainActivity.java

package com.example.myapplication;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private TextView displayTextView;private StringBuilder currentInput;private double operand1, operand2;private char operator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化变量displayTextView = findViewById(R.id.displayTextView);currentInput = new StringBuilder();// 为数字按钮设置点击侦听器setNumberButtonClickListener(R.id.button0);setNumberButtonClickListener(R.id.button1);setNumberButtonClickListener(R.id.button2);setNumberButtonClickListener(R.id.button3);setNumberButtonClickListener(R.id.button4);setNumberButtonClickListener(R.id.button5);setNumberButtonClickListener(R.id.button6);setNumberButtonClickListener(R.id.button7);setNumberButtonClickListener(R.id.button8);setNumberButtonClickListener(R.id.button9);// 为操作按钮设置点击侦听器setOperatorButtonClickListener(R.id.buttonPlus, '+');setOperatorButtonClickListener(R.id.buttonMinus, '-');setOperatorButtonClickListener(R.id.buttonMultiply, '*');setOperatorButtonClickListener(R.id.buttonDivide, '/');// 为清除按钮设置点击侦听器findViewById(R.id.buttonClear).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {clearDisplay();}});// 为退回按钮设置点击侦听器findViewById(R.id.buttonBack).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {removeLastDigit();}});// 设置等于按钮的点击监听器findViewById(R.id.buttonEquals).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {performCalculation();}});// 设置点按钮的点击监听器findViewById(R.id.buttonDot).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {appendDot();}});}private void setNumberButtonClickListener(int buttonId) {Button button = findViewById(buttonId);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {appendDigit(button.getText().toString());}});}private void setOperatorButtonClickListener(int buttonId, final char operator) {Button button = findViewById(buttonId);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {setOperator(operator);}});}private void appendDigit(String digit) {currentInput.append(digit);updateDisplay();}private void appendDot() {if (!currentInput.toString().contains(".")) {currentInput.append(".");updateDisplay();}}private void setOperator(char op) {if (currentInput.length() > 0) {operand1 = Double.parseDouble(currentInput.toString());operator = op;clearDisplay();}}private void performCalculation() {if (currentInput.length() > 0) {operand2 = Double.parseDouble(currentInput.toString());double result = 0;switch (operator) {case '+':result = operand1 + operand2;break;case '-':result = operand1 - operand2;break;case '*':result = operand1 * operand2;break;case '/':if (operand2 != 0) {result = operand1 / operand2;} else {// 处理除以零clearDisplay();displayTextView.setText("Error");return;}break;}clearDisplay();currentInput.append(result);updateDisplay();}}private void removeLastDigit() {if (currentInput.length() > 0) {currentInput.deleteCharAt(currentInput.length() - 1);updateDisplay();}}private void clearDisplay() {currentInput.setLength(0);updateDisplay();}private void updateDisplay() {displayTextView.setText(currentInput.toString());}
}

注意: 如果想要让某个组件填满横越过的行或列,需要添加属性: android:layout_gravity = "fill"。

Android AbsoluteLayout 绝对布局

在Android中,AbsoluteLayout 是一种布局方式,它允许你使用绝对坐标来指定子视图的位置。然而,需要注意的是,AbsoluteLayout 已经被弃用(deprecated)了,因为它存在一些问题,例如不同屏幕尺寸和密度可能导致布局混乱。

推荐使用更灵活的布局方式,如 RelativeLayout、LinearLayout、ConstraintLayout 等,以便更好地适应不同设备和屏幕尺寸。

AbsoluteLayout 四大控制属性

在 Android 中,AbsoluteLayout 使用了四个主要的属性来控制子视图的位置和大小。这些属性如下:

  • android:layout_width: 用于设置组件的宽度。可以使用具体的数值,如 100dp,或者使用 wrap_content、match_parent 等常用值。
  • android:layout_height: 用于设置组件的高度。同样可以使用具体的数值或者常用值,如 wrap_content、match_parent。
  • android:layout_x: 设置组件的 X 坐标,即水平位置。以 dp 作为尺寸单位,指定组件左边缘距离父容器左边缘的距离。
  • android:layout_y: 设置组件的 Y 坐标,即垂直位置。同样以 dp 作为尺寸单位,指定组件顶部边缘距离父容器顶部边缘的距离。

例子:

尽管 AbsoluteLayout 已经被弃用,但还是可以提供一个示例,以演示其用法。请注意,为了更好的屏幕适应性和灵活性,强烈建议使用更现代的布局方式!!!!!!。如 ConstraintLayout 或 RelativeLayout。

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="16dp"android:layout_y="135dp"android:text="用 户 名"tools:layout_editor_absoluteX="36dp"tools:layout_editor_absoluteY="64dp" /><EditTextandroid:id="@+id/login_email"android:layout_width="256dp"android:layout_height="wrap_content"android:layout_x="64dp"android:layout_y="123dp"android:inputType="textEmailAddress"tools:layout_editor_absoluteX="124dp"tools:layout_editor_absoluteY="64dp" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="16dp"android:layout_y="193dp"android:text="密 码"tools:layout_editor_absoluteX="36dp"tools:layout_editor_absoluteY="82dp" /><EditTextandroid:id="@+id/login_password"android:layout_width="256dp"android:layout_height="wrap_content"android:layout_x="64dp"android:layout_y="180dp"android:inputType="textPassword"tools:layout_editor_absoluteX="124dp"tools:layout_editor_absoluteY="87dp" /><Buttonandroid:id="@+id/login_btn"android:layout_width="256dp"android:layout_height="wrap_content"android:layout_x="63dp"android:layout_y="247dp"android:text="登 陆"tools:layout_editor_absoluteX="145dp"tools:layout_editor_absoluteY="271dp" /></AbsoluteLayout>

运行结果:

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

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

相关文章

K210开发板开箱介绍

一、正面有一个电容触摸屏 二、左上角是一个Type-C接口&#xff0c;可用来供电以及下载程序 三、右上角是一个三向的拨动开关&#xff0c;分别是向左、向右、向下三个通道 四、右侧这个是复位按键 五、这部分是wifi模块的一个串口以及按键 六、wifi模块在开发板的背面&#xff…

板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 来自【汤米尼克的JAVAEE全套教程专栏】

板块零 IDEA编译器基础&#xff1a;第三节 下载和在IDEA中集成 Tomcat服务器 一、为什么选择Tomcat&#xff08;1&#xff09;常见的JAVA WEB服务器&#xff08;2&#xff09;选择Tomcat的理由 二、Tomcat 8.5下载解压三、Tomcat 结构目录四、在IDEA中集成Tomcat 假设我们已经…

day06-Flex布局

01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;左…

【element-ui】el-select下拉框el-date-picker弹出框定位问题解决方案

问题描述&#xff1a; 项目开发过程中发现el-select和el-date-picker弹出框显示时候&#xff0c;滚动屏幕&#xff0c;导致弹出框定位出现问题。 首先考虑到看一下element-ui官网提供的api&#xff0c;如下图 1、select提供了popper-append-to-body属性的配置 代码如下&#x…

【lesson44】进程间通信之匿名管道

文章目录 理解进程通信管道理解使用管道1.创建管道2.fork创建子进程3.构建单向通信信道子进程构建通信父进程构建通信 使用管道的完整版代码扩展Task.hppProcessPool.cc 理解进程通信 进程运行具有独立性—>进程想通信&#xff0c;难度其实是比较大的---->进程通信的本质…

DFS——剪枝

dfs在每个点&#xff08;状态&#xff09;的情况比较多&#xff0c;但是节点比较少的时候很常用&#xff0c;我们将每个状态的情况延伸出去&#xff0c;可以画出一棵搜索树。dfs会搜到每一种情况&#xff0c;所以我们实际上可以按照任意顺序来判否。为了优化搜索我们可以在搜索…

喵的一下午(分享今天的趣事)

2024/2/7 晚 喵喵我呀&#xff0c;起的很晚。又没有敲算法。于是&#xff0c;今天就没法发CSDN了。 每天&#xff0c;我还是特别喜欢看阅读量增加没&#xff0c;有没有人点赞&#xff0c;或者说添加收藏&#xff0c;当然&#xff0c;如果又多一个关注的朋友&#xff0c…

数据结构——单链表详解

目录 前言 一.什么是链表 1.概念 ​编辑 2.分类 二.单链表的实现(不带头单向不循环链表) 2.1初始化 2.2打印 2.3创建新节点 2.4头插、尾插 2.5头删、尾删 2.6查找 2.7在指定位置之前插入 2.8在指定位置之后插入 2.9删除pos位置 2.10删除pos之后的 2.11销毁链表…

《java 从入门到放弃》1.1 jdk 安装

1.jdk 是啥&#xff1f; jdk&#xff08;Java Development Kit&#xff09;&#xff0c;简单来说&#xff0c;就是java的开发工具。允许java 程序就是用它了。 jre &#xff0c;里面放的是java用的那些公用的包。 2.jdk下载 2.1 官网下载地址&#xff1a;Java Downloads | …

32USART串口

目录 一.通信接口 二.时序 三.USART简介 ​编辑四.数据帧 五.起始位侦测和采样位置对齐 &波特率计算 六.相关函数 七.编码格式设置 &#xff08;1&#xff09; UTF-8编码&#xff08;有的软件兼容性不好&#xff09;​编辑 &#xff08;2&#xff09;GB2312编码 八.…

【python数据分析基础】—dataframe中index的相关操作(添加、修改index的列名、修改index索引值等)

文章目录 前言一、添加、修改index的列名二、修改index索引值 前言 本文主要讲dataframe结构中index的相关操作&#xff0c;index相当于是数据表的行。 一、添加、修改index的列名 新建一个dataframe表&#xff0c;我们可以自定义index的值&#xff0c;如下&#xff1a; imp…

SSL协议是什么?关于SSL和TLS的常见问题解答

SSL&#xff08;安全套接字层&#xff09;及其后继者TLS&#xff08;传输层安全&#xff09;是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用&#xff0c;但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…

Instagram SEO如何优化?10个技巧

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

vue3学习——自定义插件,注册组件(引入vue文件报红线)

在src/components文件夹目录下创建一个index.ts文件 import { App, Component } from Vue import SvgIcon from /components/SvgIcon/index.vue import Pagination from /components/Pagination/index.vue const globalComponents: { [name: string]: Component } { SvgIcon,…

第三模块 面向对象网络并发编程

第三模块 面向对象&网络&并发编程 面向对象基础1. 初识面向对象1.1 对象和self1.2 常见成员1.3 应用示例 2. 三大特性2.1 封装2.2 继承练习题2.3 多态 3. 扩展&#xff1a;再看数据类型总结作业 从今天开始&#xff0c;我们将进入系列课程第3个模块的的学习&#xff0c…

TCP和UDP相关问题(重点)(5)——5.TCP三次握手和四次挥手(非常重要)

5.1三次握手的过程 一次握手&#xff1a;客户端发送带有SYN(x)标志的数据包到服务端&#xff0c;然后客户端进入SYN_SEND状态&#xff0c;等待服务器端的确认。 二次握手&#xff1a;服务端发送带有SYN(y)ACK(x1)标志的数据包到客户端&#xff0c;然后服务端进入SYN_RECV状态。…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…