当前位置: 首页 > news >正文

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域

目录

一、成员方法

(一)方法的快速入门

(二)方法的调用机制(重要)

(三)方法的定义

(四)注意事项和使用细节

1.访问修饰符(作用是控制方法的使用范围)

2.返回的数据类型

3.方法名

4.形参列表

5.方法体

6.方法调用细节说明

(五)传参机制

1.基本数据类型的传参机制

2.引用数据类型的传参机制

2.1方法传参传入数组

2.2方法传参传入对象

2.3传参后对象=null 

2.4传参后创建新的对象

(六)对象的克隆

(七)方法的递归调用

1.方法的递归执行机制

2.使用递归的重要规则

3.方法递归经典题目

3.1计算n的阶乘

3.2斐波那契数列

3.3猴子吃桃问题

3.4汉诺塔

(八)方法的重载(OverLoad)

(九)可变参数

二、作用域

(一)基本使用

(二)注意事项和细节使用

(三)跨类访问对象属性的2种方式


一、成员方法

(一)方法的快速入门

        在某些情况下,我们需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄、姓名...),还有一些行为,比如:说话、跑步、唱歌...这些都要用成员方法才能完成。

方法代码示例:

public class Method01 { public static void main(String[] args) {//方法使用//1. 方法写好后,如果不去调用(使用),不会输出//2. 先创建对象 ,然后调用方法即可Person p1 = new Person();//调用getSum方法,同时num1=10, num2=20//把 方法 getSum 返回的值,赋给 变量 returnResint returnRes = p1.getSum(10, 20); System.out.println("getSum方法返回的值=" + returnRes);}
}class Person {String name;int age;//方法(成员方法)//添加getSum成员方法,可以计算两个数的和//1. public 表示方法是公开的//2. int :表示方法执行后,返回一个 int 值//3. getSum 方法名//4. (int num1, int num2) 形参列表,2个形参,可以接收用户传入的两个数//5. return res; 表示把 res 的值, 返回public int getSum(int num1, int num2) {int res = num1 + num2;return res;}
}

(二)方法的调用机制​​​​​​​(重要)

下图是JVM内存中,方法的调用机制分析图:

成员方法的好处:提高代码的复用性;可以将实现的细节封装起来,然后供其他用户来调用即可。

(三)方法的定义

访问修饰符 返回数据类型 方法名(形参列表){语句;return 返回值;
}
  1. 形参列表:表示成员方法输出,例如上面的getSum(int num1,int num2)
  2. 返回数据类型:表示成员方法输出,void表示没有返回值
  3. 方法体:表示为了实现某一功能代码块
  4. return语句不是必须的:当有返回数据类型时,必须要有return语句

(四)注意事项和使用细节

1.访问修饰符(作用是控制方法的使用范围)

如果不写默认访问,有4种:public、protected、默认、private

2.返回的数据类型

  1. 一个方法最多有一个返回值,要想返回多个值,就可以返回一个数组;
  2. 返回类型可以为任意类型,包含基本数据类型或引用数据类型(数组,对象);
  3. 如果方法要求有返回数据类型,则方法体中,最后的执行语句必须为return 值;而且要求返回值类型必须和return的值类型一致或兼容;
  4. 如果方法返回值类型是void,则方法体中可以没有return语句,或者只写return;

3.方法名

        遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如得到两个数的和getSum这种,开发中按照规范来命名。

4.形参列表

  1. 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
  2. 参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int[][] map)
  3. 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数!
  4. 方法定义时的参数类型为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参;形参和实参的类型要一致或兼容、个数、顺序必须一致!

5.方法体

        方法体中写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但是方法体里面不能再定义方法!即:方法不能嵌套定义。 

6.方法调用细节说明

1)同一个类中的方法调用:直接调用即可

public class MethodDetail {public static void main(String[] args) {A a = new A();a.sayOK();// print()方法被调用 n=10// 继续执行sayOK()~~~}
}class A {public void print(int n) {System.out.println("print()方法被调用 n=" + n);}public void sayOK(){ // sayOK可以直接调用同类中其他成员方法print(10);System.out.println("继续执行sayOK()~~~");}
}

2)跨类中的方法A类调用B类方法:需要通过对象名调用。比如 对象名.方法名(参数); 

public class MethodDetail {public static void main(String[] args) {A a = new A();a.m1();}
}class B {public void hi() {System.out.println("B类中的hi()方法被执行");}
}class A {// 在A类中访问B类的方法public void m1() {System.out.println("m1()方法被调用");// 先创建B对象B b = new B();// 然后再调用方法b.hi();System.out.println("m1()方法继续执行");}
}

3)特别说明:跨类的方法调用和方法的访问修饰符相关。

(五)传参机制

1.基本数据类型的传参机制

基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!

因为多个方法的调用会在栈中开辟各自独立的空间,基本数据类型不是引用,不同的方法中的变化不会互相影响。

public class MethodParameter01 {public static void main(String[] args) {AB ab = new AB();int a = 10;int b = 20;ab.swap(a, b); //调用swapSystem.out.println("main方法 a=" + a + " b=" + b);//a=10 b=20}
}class AB {public void swap(int a,int b){System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);//a=10 b=20//完成了 a 和 b的交换int tmp = a;a = b;b = tmp;System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);//a=20 b=10}
}

上述代码内存图: 

2.引用数据类型的传参机制

引用数据类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

2.1方法传参传入数组
public class TestDemo1 {public static void main(String[] args) {AAB aab = new AAB();int[] arr = {1, 2, 3};aab.test100(arr);System.out.println("main的arr输出:" + Arrays.toString(arr));// test100的arr输出:[200, 2, 3]// main的arr输出:[200, 2, 3]}
}class AAB {// test100方法,接收一个数组,在方法中修改数组public void test100(int[] arr) {arr[0] = 200;System.out.println("test100的arr输出:" + Arrays.toString(arr));}
}

2.2方法传参传入对象
public class TestDemo1 {public static void main(String[] args) {AAB aab = new AAB();Person p = new Person();p.name = "jack";p.age = 10;aab.test200(p);System.out.println("main 的p.age=" + p.age); // 10000}
}class Person {String name;int age;
}class AAB {public void test200(Person p) {p.age = 10000;// 修改对象属性}
}

2.3传参后对象=null 
public class TestDemo1 {public static void main(String[] args) {AAB aab = new AAB();Person p = new Person();p.name = "jack";p.age = 10;aab.test200(p);System.out.println("main 的p.age=" + p.age); // 10}
}class Person {String name;int age;
}class AAB {public void test200(Person p) {
//        p.age = 10000;// 修改对象属性p = null;}
}

2.4传参后创建新的对象
public class TestDemo1 {public static void main(String[] args) {AAB aab = new AAB();Person p = new Person();p.name = "jack";p.age = 10;aab.test200(p);System.out.println("main 的p.age=" + p.age); // 10}
}class Person {String name;int age;
}class AAB {public void test200(Person p) {
//        p.age = 10000;// 修改对象属性
//        p = null;p = new Person();p.name = "tom";p.age = 99;}
}

(六)对象的克隆

对象的克隆:编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象
注意:要求得到新对象和原来的对象,是两个独立的对象,只是他们的属性相同

编写方法的思路:
1.方法的返回值类型:Person
2.方法的名字:copyPerson
3.方法的形参:(Person p)
4.方法体,创建一个新对象,并复制属性,返回即可

代码如下:

public class TestDemo1 {public static void main(String[] args) {AAB aab = new AAB();Person p = new Person();p.name = "alice";p.age = 12;Person p2 = aab.copyPerson(p);System.out.println("p的hashCode:" + p.hashCode() + " 姓名=" + p.name + " 年龄=" + p.age);// p的hashCode:1163157884 姓名=alice 年龄=12System.out.println("p2的hashCode:" + p2.hashCode() + " 姓名=" + p2.name + " 年龄=" + p2.age);// p2的hashCode:1956725890 姓名=alice 年龄=12System.out.println(p == p2); // false}
}class Person {String name;int age;
}class AAB {public Person copyPerson(Person p) {Person p2 = new Person();p2.name = p.name;p2.age = p.age;return p2;}
}

(七)方法的递归调用

1.方法的递归执行机制

        递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于解决复杂问题,同时可以让代码变得简洁。方法的递归就是,栈不断地开辟后,直到遇到返回条件,才会一个个关闭。

给出一段代码,画出内存图:

public class Recursion01 {public static void main(String[] args) {T t1 = new T();t1.test(4);}
}class T {public void test(int n) {if (n > 2) {test(n - 1);}System.out.println("n=" + n);}
}

上面的结果输出:

当添加else分支后,只会输出2,因为其他的方法没有打印部分,只有当n=2的时候才会打印: 

public void test(int n) {if (n > 2) {test(n - 1);} else {System.out.println("n=" + n);}}

2.使用递归的重要规则

  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
  2. 方法的局部变量是独立的,不会相互影响,比如n变量
  3. 如果方法中使用的是引用类型变量(比如数组、对象),就会共享该引用类型的数据
  4. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁同时当方法执行完毕或者返回时,该方法也就执行完毕

3.方法递归经典题目

3.1计算n的阶乘
public class Recursion01 {public static void main(String[] args) {T t1 = new T();int result = t1.factorial(5);System.out.println(result);}
}class T {public int factorial(int n) {if (n == 1) {return 1;} else {return factorial(n - 1) * n;}}
}

计算n的阶乘内存图:

3.2斐波那契数列

请使用递归的方式求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的值是多
思路分析
1. 当n = 1 斐波那契数 是1
2. 当n = 2 斐波那契数 是1
3. 当n >= 3  斐波那契数 是前两个数的和
4. 这里就是一个递归的思路

public class TestDemo1 {public static void main(String[] args) {T t = new T();System.out.println(t.fibonacci(7)); // 13}
}class T {public int fibonacci(int n) {if (n >= 1) {if (n == 1 || n == 2) {return 1;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}else {System.out.println("您的输入有误!");return -1;}}
}
3.3猴子吃桃问题

        猴子吃桃问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天,想再吃时(即还没吃),发现只有1个桃子了。问题:最初共多少个桃子?

思路分析——逆推
1. day = 10 时 有 1个桃子
2. day = 9 时  有 (day10 + 1) * 2 = 4
3. day = 8 时  有 (day9 + 1) * 2 = 10
4. 规律就是  前一天的桃子 = (后一天的桃子 + 1) *2   ==> 后一天的桃子 = day + 1
5. 递归

public class TestDemo1 {public static void main(String[] args) {
//        demo1();T t = new T();System.out.println(t.peach(1)); // 1534}private static void demo1() {// 已知第10天剩下1个桃子int peachesOnTenthDay = 1;// 逆向推算到第一天for (int i = 9; i >= 1; i--) {// 每一天的桃子数量是前一天的桃子数量加1的两倍peachesOnTenthDay = (peachesOnTenthDay + 1) * 2;}// 输出第一天摘的桃子数量System.out.println("第一天猴子共摘了 " + peachesOnTenthDay + " 个桃子。");}
}class T {public int peach(int day) {if (day == 10) {return 1;} else if (day >= 1 && day <= 9) {return (peach(day + 1) + 1) * 2;} else {System.out.println("day在1-10");return -1;}}
}
3.4汉诺塔

        汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一 根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

public class TestDemo1 {public static void main(String[] args) {T t = new T();t.tower(3, 'A', 'B', 'C');}
}class T {//num 表示要移动的个数, a, b, c 分别表示A塔,B 塔, C 塔public void tower(int num, char a, char b, char c) {// 如果只有一个盘num == 1if (num == 1) {// 把a移动到c即可System.out.println(a + "->" + c);} else {//如果有多个盘,可以看成两个 , 最下面的和上面的所有盘(num-1)//(1)先移动上面所有的盘到 b, 借助 ctower(num - 1, a, c, b);//(2)把最下面的这个盘,移动到 cSystem.out.println(a + "->" + c);//(3)再把b塔的所有盘,移动到c ,借助atower(num - 1, b, a, c);}}
}

以3个圆盘为例,结果:

(八)方法的重载(OverLoad)

        Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致。重载减轻了起名和记名的麻烦。

注意事项和使用细节:

  1. 方法名:必须相同
  2. 形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求
  3. 返回类型:无要求

方法重载示例:

public class OverLoad01 { public static void main(String[] args) {// System.out.println(100);// System.out.println("hello,world");// System.out.println('h');// System.out.println(1.1);// System.out.println(true);// MyCalculator mc = new MyCalculator();System.out.println(mc.calculate(1, 2));System.out.println(mc.calculate(1.1, 2));System.out.println(mc.calculate(1, 2.1));}
}class MyCalculator  {//下面的四个 calculate方法构成了重载//两个整数的和public int calculate(int n1, int n2)  {System.out.println("calculate(int n1, int n2) 被调用");return n1 + n2;}//没有构成方法重载, 仍然是错误的,因为是方法的重复定义// public void calculate(int n1, int n2)  {// 	System.out.println("calculate(int n1, int n2) 被调用");// 	int res =  n1 + n2;// } // 没有构成方法重载,也是方法的重复定义// public int calculate(int a1, int a2)  {// 	System.out.println("calculate(int n1, int n2) 被调用");// 	return a1 + a2;// } //一个整数,一个double的和public double calculate(int n1, double n2) {return n1 + n2;}//一个double ,一个int的和 public double calculate(double n1, int n2) {System.out.println("calculate(double n1, int n2) 被调用..");return n1 + n2;}//三个int的和public int calculate(int n1, int n2,int n3) {return n1 + n2 + n2;}
}

(九)可变参数

注意事项和使用细节

  1. 可变参数的实参可以为0个或任意多个。
  2. 可变参数的实参可以为数组
  3. 可变参数的本质就是数组
  4. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  5. 一个形参列表中只能出现一个可变参数
public class TestDemo1 {public static void main(String[] args) {T t = new T();int[] arr = {1, 2, 3};t.sum(arr); // 传入数组t.sum(1, 5, 9); // 传入多个参数}
}class T {// 参数列表可变public void sum(int... nums) {int n = 0;for (int i = 0; i < nums.length; i++) {n += nums[i];}System.out.println("接收的参数个数=" + nums.length);System.out.println("和为:" + n);}
}
public class TestDemo1 {public static void main(String[] args) {T t = new T();String res = t.showScore("张三", 85.6, 90.5, 60);System.out.println(res);// 张三的3门课程总分为:236.1}
}class T {// 参数列表可变public String showScore(String name, double... num) {double sum = 0;for (double score : num) {sum += score;}return name + "的" + num.length + "门课程总分为:" + sum;}
}

二、作用域

(一)基本使用

  1. 在Java编程中,主要的变量就是属性(成员变量)和局部变量。
  2. 局部变量一般是指在成员方法中定义的变量。
  3. 全局变量:属性,作用域为整个类体;局部变量:除了属性之外的其他变量,作用域为定义它的代码块中。
  4. 全局变量(属性)可以不赋值,直接使用,因为有默认值;局部变量必须赋值后,才能使用,因为没有默认值。
  5. 细节: 属性可以加修饰符(public protected private..);局部变量不能加修饰符。

(二)注意事项和细节使用

  1. 属性和局部变量可以重名,访问时遵循就近原则。
  2. 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
  3. 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁;局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。即在一次方法调用过程中。
  4. 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用);局部变量:只能在本类中对应的方法中使用。
  5. 全部变量/属性可以加修饰符;局部变量不可以加修饰符。

(三)跨类访问对象属性的2种方式

public class TestDemo1 {public static void main(String[] args) {T t = new T();t.test(); // 第1种跨类访问对象属性的方式Person p = new Person();t.test2(p);// 第2种跨类访问对象属性的方式}
}class T {// 参数列表可变public void test() {Person p1 = new Person();System.out.println(p1.name);}public void test2(Person p) {System.out.println(p.name);}
}class Person {String name = "jack";public void say() {String name = "king"; // 属性和局部变量可以重名,访问时遵循就近原则System.out.println("say() name=" + name);}
}

相关文章:

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域

目录 一、成员方法 (一)方法的快速入门 (二)方法的调用机制(重要) (三)方法的定义 (四)注意事项和使用细节 1.访问修饰符(作用是控制方法的使用范围) 2.返回的数据类型 3.方法名 4.形参列表 5.方法体 6.方法调用细节说明 (五)传参机制 1.基本数据类型的传参机制 …...

Vue+Flask

App.vue 首先要安装 npm install axios<template><div><h1>{{ message }}</h1><input v-model"name" placeholder"Enter your name" /><input v-model"age" placeholder"Enter your age" /><…...

深入剖析 Android Lifecycle:构建高效稳定的应用

在 Android 开发中&#xff0c;管理应用组件的生命周期是至关重要的。正确处理生命周期事件可以确保应用的性能、稳定性和用户体验。Android Framework 提供了一系列的机制来管理应用组件的生命周期&#xff0c;而android.arch.lifecycle库则为我们提供了更简洁、更灵活的方式来…...

ElasticSearch分词器、相关性详解与聚合查询实战

目录 1. ES分词器详解 1.1 基本概念 1.2 分词发生时期 1.3 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 2. 相关性详解 2.1 什么是相关性&#xff08;Relevance&am…...

删除二叉树中以x为根节点的子树(包括根结点)

已知二叉树以二叉链表存储&#xff0c;编写算法完成&#xff1a;对于树中每个元素值为x的结点&#xff0c;删除以它为根的子树&#xff0c;并释放相应的空间。 思想&#xff1a; 删除二叉树采用后序遍历。先删除左子树&#xff0c;然后右子树&#xff0c;最后根。 利用层次遍…...

Netty 与 WebSocket之间的关系

WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色&#xff0c;但它们通常是一起使用的&#xff0c;尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别&#xff0c;我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…...

通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免

CSMA/CA&#xff1a;载波监听多路访问/冲突避免 CSMA/CA&#xff08;Carrier Sense Multiple Access/Collision Avoidance&#xff09;&#xff0c;即载波监听多路访问/冲突避免&#xff0c;是一种用于数据传输时避免各站点之间冲突的算法&#xff0c;尤其适用于无线局域网&…...

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试&#xff1a;模拟外卖订单处理&#xff0c;客户支付提交订单后&#xff0c;查询订单详情&#xff0c;后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快&#xff0c;一转眼不到一个月时间&#xff0c;已经完成分享synchronized、volatile、…...

【python爬虫可以获取到谷歌影像吗?】如何有效下载谷歌影像?

【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f; 【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f; 文章目录 【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f;前言1. 使用…...

Windows 上安装 PostgreSQL

Windows 上安装 PostgreSQL PostgreSQL 是一款功能强大的开源关系数据库管理系统,广泛用于各种应用场景。在 Windows 系统上安装 PostgreSQL 相对简单,但需要遵循一系列步骤。本文将详细介绍在 Windows 上安装 PostgreSQL 的过程,并提供一些关键的配置和优化建议。 一、下…...

Vue 技术进阶 day2 数据监视的原理、其他内置指令、自定义指令、生命周期、组件化、VueComponent构造函数

目录 1.Vue监测数据的原理 1.1 原理 1.1.1 数据劫持 1.1.2 观察者模式(Vue内部的实现) 1.1.3 更新组件 1.1.4 计算属性和侦听器 1.2 后添加属性做响应式&#xff08;Vue.set / vm.$set&#xff09; 1.3 对象和数组的响应式 1.4 数据监视案例 2.指令 2.1 内置指令 2.…...

vue.js 原生js app端实现图片旋转、放大、缩小、拖拽

效果图&#xff1a; 旋转 放大&#xff1a;手机上可以双指放大缩小 拖拽 代码实现&#xff1a; html <div id"home" class"" v-cloak><!-- 上面三个按钮 图片自己解决 --><div class"headImage" v-if"showBtn">&l…...

MyBatis的注入问题

对之前文章的补充&#xff1a;MyBatis中的#{}与${}注入问题----原文链接 前言&#xff1a; MyBatis是一个流行的Java持久层框架&#xff0c;用于将对象与数据库中的数据进行映射。然而&#xff0c;如果不当使用&#xff0c;MyBatis也可能受到诸如SQL注入这类的安全问题的影响。…...

基于springboot的评分评教管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的评分评教管理系统1拥有三种角色 管理员&#xff1a;评价管理、学生管理、评分指标管理、课程管理、教师管理、管理员管理等教师&#xff1a;课程管理、学生管理、个人信…...

C嘎嘎入门篇:类和对象(2)

前言&#xff1a; 上一篇小编讲了类和对象&#xff08;1&#xff09;&#xff0c;当然&#xff0c;在看这篇文章之前&#xff0c;读者朋友们一定要掌握好前面的基础内容&#xff0c;因为这篇和前面息息相关&#xff0c;废话不多说&#xff0c;下面小编就加快步伐&#xff0c;开…...

数据库 - Mongo数据库

目录 前言 一、MongoDB的特点 二、Mongo的核心概念 三、MongoDB的优劣势 四、使用场景 五、MongoDB与其他数据库的对比 六、如何安装MongoDB 七、数据库指令操作 &#xff08;一&#xff09;基本数据库操作 &#xff08;1&#xff09;连接 MongoDB &#xff08;2&am…...

工业控制过等保三级需要的网络安全设备及详细讲解

在工业控制系统&#xff08;ICS&#xff09;的安全性日益受到重视的背景下&#xff0c;网络安全等级保护&#xff08;过等保&#xff09;三级作为一种重要的安全标准&#xff0c;对保障工业控制系统的安全运行有着重要的意义。过等保三级主要针对那些对安全性要求较高的系统&am…...

Android开发高级篇:MVVM框架与数据双向绑定

在Android开发中&#xff0c;MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式以其高效、简洁的特点&#xff0c;成为越来越多开发者的首选。MVVM不仅实现了界面&#xff08;UI&#xff09;与业务逻辑的分离&#xff0c;还通过数据双向绑定技术&#xff0c;极大地简化…...

智能招聘系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;企业管理&#xff0c;招聘信息管理&#xff0c;应聘信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;招聘信息&#xff0c;我的 开发系统&…...

Wireshark抓包GRPC协议查看Protobuf编码内容

1.说明 对通过GRPC协议进行通信的流量进行抓包后&#xff0c; 需要先转换为HTTP2协议&#xff0c; 因为默认解析的HTTP协议和TCP协议无法进行后续的查看操作&#xff0c; 然后再通过加载protobuf文件&#xff0c; 对GRPC内的DATA字段进行解码。 2.抓包 本文为了测试方便&…...

selenium 强制、隐式、显示等待(11种预置条件)

注&#xff1a;显示等待和隐式等待不可混用 强制等待 让当前正在执行的代码线程暂停运行。 示例&#xff1a;在电商网站的商品搜索页面&#xff0c;等待 5 秒之后&#xff0c;点击搜索按钮&#xff0c;如果页面加载速度很快&#xff0c;在 2 秒内生成&#xff0c;那么还需要…...

ffmpeg拉取rtsp网络视频流报错解析

在使用ffmpeg调用api方式对一个rtsp网络视频流拉流播放时&#xff0c;应用程序出现了一些错误提示&#xff0c;并且拉流播放的画面也出现了一些马赛克的现象。所以这里便对应用程序所产生的错误提示进行了详细的研究和分析。这里将分析结果贴在下面&#xff0c;若其他朋友遇到类…...

c# iTextSharp 读取PDF

安装 iTextSharp&#xff1a; 可以通过 NuGet 包管理器安装 iTextSharp&#xff1a; Install-Package itext7创建 PDF 文件&#xff1a; using System; using System.IO; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element;class Program {static voi…...

<<迷雾>> 第5章 从逻辑学到逻辑电路(3)--与门 示例电路

与门及其符号&#xff08;2输入端&#xff09; info::操作说明 鼠标单击开关切换开合状态 系统中使用 半方形半圆形 表示与门 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-11…...

Java应用的数据库连接池连接超时处理

Java应用的数据库连接池连接超时处理 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java应用中&#xff0c;数据库连接池是管理数据库连接的重要组件。然而&#xff0c;当数据库负载过高或网…...

机器学习:opencv--摄像头OCR

目录 前言 一、三个函数 1.显示图像 2.点排序 3.透视变换 二、代码实例 1.打开摄像头 2.图像预处理 3.检测特定轮廓 4.对轮廓进行处理 5.释放资源 前言 摄像头OCR指的是利用摄像头捕捉图像中的文字信息&#xff0c;并通过光学字符识别&#xff08;OCR&#xff09;技…...

基于二分查找的动态规划 leetcode 300.最长递增子序列

如题&#xff1a; https://leetcode.cn/problems/longest-increasing-subsequence/description/ 其实常规动态规划的解法就没什么好说的了&#xff0c;有意思的是官方放出了一个二分查找的动态规化解法&#xff0c;时间复杂度能降到O(nlog(n))&#xff0c;但是为什么这样能解&…...

Java8 IntStream流sum的Bug

做. - 力扣&#xff08;LeetCode&#xff09;的时候发现 IntStream流中的sum在相加的过程中会加到突破Int上限导致数据不对&#xff0c;需要装成LongStream流才能有正确的输出。 long sum Arrays.stream(milestones).asLongStream().sum(); 要这样子写&#xff0c;只把sum改…...

PCL 索引空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 索引空间采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…...

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)

作为“贴代码”力推的一个CRUD实践项目PasteTemplate,在对现有的3个项目进行实战后效果非常舒服&#xff01;下面就针对PasteForm为啥我愿称为最佳CRUD做一些回答: 哪里可以下载这个PasteForm的项目案例 目前“贴代码”对外使用PasteForm的项目有"贴Builder(PasteSpide…...

桂林市建设工程质量监督站网站/个人免费域名注册网站

一、multiprocessing模块介绍 python中的多线程无法利用CPU资源&#xff0c;在python中大部分情况使用多进程。python中提供了非常好的多进程包multiprocessing。 multiprocessing模块用来开启子进程&#xff0c;并在子进程中执行功能&#xff08;函数&#xff09;&#xff0c;…...

做外贸在那些网站找客户/福州短视频seo

一种特殊的索引&#xff0c;它会把某个数据表的某个数据列出现过的所有单词生成一份清单。 alter table tablename add fulltext(column1,column2) 只能在MyISAM数据表中创建 少于3个字符的单词不会被包含在全文索引里&#xff0c;可以通过修改my.cnf修改选项 ft_min_word_le…...

西宁电子商务网站建设/免费seo培训

这是松哥之前一个零散的笔记&#xff0c;整理出来分享给大伙&#xff01; MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了。受困于 Linux 和 MySQL 版本问题&#xff0c;很多人经常会搭建失败&#xff0c;今天松哥就给大伙举一个成功的例子&#xff0c;后面有时间再…...

政府部门建设网站流程/系统优化软件哪个好

1. 动态库与静态库的区别 静态库&#xff1a;链接时会被完整的复制到可执行文件中&#xff0c;被多次使用就有多份拷贝。 动态库&#xff1a;链接时不复制&#xff0c;程序运行时由系统动态加载到内存&#xff0c;系统只加载一次&#xff0c;多个程序共用&#xff08;如系统的U…...

宁波专业做网站公司/优化落实新十条措施

下載转载于:https://www.cnblogs.com/wang123/archive/2008/02/21/1076370.html...

建网站 铸品牌 做推广/百度竞价关键词查询

转载&#xff1a;https://blog.csdn.net/qingtiantianqing/article/details/72783952 原文&#xff1a; 使用handler发送消息时有两种方式&#xff0c;post(Runnable r)和post(Runnable r, long delayMillis)都是将指定Runnable&#xff08;包装成PostMessage&#xff09;加入…...