UseOfMethods - 方法的使用 - Java

news/2024/5/10 2:13:10/文章来源:https://blog.csdn.net/DarkAndGrey/article/details/120921932

文章目录

  • 什么是方法?
    • 方法就是一个代码片段. 类似于 C 语言中的 "函数".
    • 方法可以理解为是一个 功能,实现某种我们想要达到的效果,而且这个功能是可以被重复使用的。
    • 方法存在的意义(不要背, 重在体会):
    • 方法的语法格式
      • 代码实例1(求 1~n的和)
      • 图 1
      • 如果你想让方法(函数)返回一个值,就是说带回一个值回到主函数,再对其打印也行
      • 程序实例2(程序实例1的改版)
      • 图2
    • 既然讲到函数(方法),也就会涉及函数栈帧问题,
      • 函数栈帧图(图3),想了解 c方面的或者想对比一下的,可以看这篇文章[函数栈帧销毁与创建(vs2013)- 修改版](https://blog.csdn.net/DarkAndGrey/article/details/119826033?spm=1001.2014.3001.5501)
    • 注意事项
  • 方法调用的执行过程
    • 基本规则
      • 代码示例: 计算 1! + 2! + 3! + 4! + 5!
        • 图4
  • 实参和形参的关系
    • 举个例子(交换a与b值)
      • 我们先来用常规形式来写
      • 这里是交换实参
        • 图5
        • 图6
      • 用方法来写
        • 图7
        • 图8
        • 图9
  • 没有返回值的方法
    • 代码示例
      • 图10
      • 图11
      • 图12
  • 方法的重载
    • 代码示例
      • 图13
    • 由此,我们需要 方法的重载:一个函数同时兼容多种参数的情况
      • 代码实例2
        • 图14
    • 记住
    • 另外切记
      • 例如:
      • 再来看一个错误示范
        • 图 15
    • 图16
    • 补充一个知识点:
    • 由上我可以总结出 方法重载的规则
  • 方法递归
    • 递归的概念
    • 使用递归之前,需要一个前提
      • 代码示例
      • 图17
    • 那我该怎么去写一个可以使用的递归呢?
      • 代码实例2
      • 图 18
    • 其实终止条件,相当于数学里的起始条件
    • 举个例子
    • 代码实现
      • 图19
    • 再来看几道例题
      • 求 1~n之间的和
        • 图20
      • 按照顺序打印一个数字的每一位(例如1234 打印出 1 2 3 4)
        • 图21
    • 递归执行过程分析
      • 继续实践
      • 写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19
        • 图22
      • 求斐波那契数列的第 N 项(递归)
      • 代码如下
      • 图23
    • 注意用 递归的方法来求 斐波那契数,效率很低
      • 图 24
    • 这里我推荐 迭代 方法(循环)
      • 求斐波那契数列的第 N 项(迭代/循环)
      • 图 25
    • 递归小结
      • 递归是一种重要的编程解决问题的方式.
  • 本文结束

什么是方法?

方法就是一个代码片段. 类似于 C 语言中的 “函数”.

(其实方法就是函数另一个称呼,只不过为了区分 C语言和Java,所以在Java中叫方法,C叫函数,唯一不同的就是两者实现的方式)

方法可以理解为是一个 功能,实现某种我们想要达到的效果,而且这个功能是可以被重复使用的。

 打个比方: 方法就好像是 制作面包的磨具,如果你想得到一个这样形状,或者说达到某种效果,你就去使用该磨具。(该函数能完成某一个 功能/任务/效果)
而且,你可以换材料,但你不能用它做其他的东西,这个磨具是专门正对面包的(函数实现的功能,是专门针对某一种情况)也就是说你做面包要使用材料必须属于面粉这一类的东西,无非即使质量的好坏
(函数接收的参数值是可以改变大小的,类型不能变,否则参数类型不匹配,是无法成功调用函数的功能)

方法存在的意义(不要背, 重在体会):

    1. 是能够模块化的组织代码(当代码规模比较复杂的时候).2. 做到代码被重复使用, 一份代码可以在多个位置使用.3. 让代码更好理解更简单.4. 直接调用现有方法开发, 不必重复造轮子

方法的语法格式

public static 返回值 方法名称(形式参数列表){函数体/方法体;
}

代码实例1(求 1~n的和)

import java.util.Scanner;public class UseOfMethods {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 为输入数据做准备int n = scanner.nextInt();// 接收一个整型数据,将其赋给 nsumadd(n);// 调用函数(方法)sumadd,并向 sumadd方法 传参(n)。}public static void sumadd(int n){// 这里接收参数,和C语言一样,可以定义一个相同的变量名,来接收传参数。但必须类型和参数个数要相同int sum =0;// 定义一个求和变量,将其初始化for(int i =0;i<=n;i++){sum += i;// 将1~10的每个数值累加起来}System.out.println(sum);// 输出累加的结果}
}// 图1

图 1

在这里插入图片描述
不知道你们有没有发现程序中 我们的 sumadd方法没有写在 main方法上面而是下面,学过C的朋友可能会问 “不需要在前面声明函数吗?”

答案是不用,在Java中 是没有函数声明的概念,它就是要用的时候,直接去调用


另外在普及一个内容,方法的参数叫做形参,main方法的参数叫实参形参相当于实参的一份拷贝,这种传参方式被称为 按值传递(传值)
由此引申出一个知识点, 在Java中 是没有 传址 的概念,只有传值,所以我们在调用方法的时候,只需要注重 形参 和 实参 的类型 和 个数 是否匹配(相同)


如果你想让方法(函数)返回一个值,就是说带回一个值回到主函数,再对其打印也行

程序实例2(程序实例1的改版)

import java.util.Scanner;
public class UseOfMethods {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 为输入数据做准备int n = scanner.nextInt();// 接收一个整型数据,将其赋给 nint ret = sumadd(n);// 调用方法(函数)sumadd,并想 sumadd方法 传参(n)。System.out.println(ret);}public static int sumadd(int n){// 这里接收参数,和C语言一样,可以定义一个相同的变量名,来接收传参数。但必须类型和参数个数要相同int sum =0;// 定义一个求和变量,将其初始化for(int i =0;i<=n;i++){sum += i;// 将1~10的每个数值累加起来}return sum;}
}// 图2,注意圈起来的部分

图2

在这里插入图片描述
有的人可能会说 我可不可以 不创建一个 与方法的返回值相同类型的变量 来接收它的值,直接输出行吗
答案是可以的
写法: System.out.println(sumadd(n));
因为 sumadd 是返回值的输出语句,只是将它返回来的值给打印了而已。
如果方法的返回值为 void(无返回),那么程序会报错(输出语句会说:我都准备好了,你就给我看这? 就这!


既然讲到函数(方法),也就会涉及函数栈帧问题,

   每个函数,在被调用的时候,都会开辟栈帧(开辟属于自身的内存空间)

函数栈帧图(图3),想了解 c方面的或者想对比一下的,可以看这篇文章函数栈帧销毁与创建(vs2013)- 修改版

在这里插入图片描述


注意事项

    1. public 和 static 两个关键字在此处具有特定含义, 我们暂时不讨论, 后面会详细介绍.2. 方法定义时, 参数可以没有. 每个参数要指定类型3. 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void4. 方法定义时的参数称为 "形参", 方法调用时的参数称为 "实参".5. 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.6. Java 中没有 "函数声明" 这样的概念

方法调用的执行过程

基本规则

    定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.比如:int b = sumadd();,它在执行该语句时,遇见调用方法的代码,会先去执行调用方法,下面程序它暂时不会去关。System.out.println(b); 调用方法的代码执行完了之后,才会轮到该语句执行当方法被调用的时候, 会将实参赋值给形参.(int a = 10; sumadd(a); public static void sumadd(int A); 这里的A,其实就是a值的一份拷贝  )参数传递完毕后, 就会执行到方法体代码.当sumadd方法执行完毕之后(遇到 return 语句), 就执行完毕,,同时将其值带回main方法中,并将其赋给变量b(类型匹配)继续往下执行并且一个方法可以被多次调用.

代码示例: 计算 1! + 2! + 3! + 4! + 5!

public class UseOfMethods {public static void main(String[] args) {int n  =5;int sum = factorialSum(n);// 调用函数计算 5 的阶乘和是多少,将其赋给sumSystem.out.println(sum);}public  static  int factorialSum(int n){int sum = 0;int  ret = 1;for(int i = 1;i<=n;i++){ret *= i;// 每个数字的阶乘sum+=ret;// 将每个数字的阶乘累计相加}return sum;}// 图 4
}

图4

在这里插入图片描述
使用方法的优点也就体现出来了,创建一个专门计算阶乘和的函数,只要我的传参没问题,它就能帮我完成想要的效果。
注意 自定义方法名,要让人看得懂是什么意思,见名知其用。看到名字知道它是用来干什么的,接下看代码,往这个思想靠拢,大大提升代码的阅读性


实参和形参的关系

举个例子(交换a与b值)

我们先来用常规形式来写

这里是交换实参

public class UseOfMethods {public static void main(String[] args) {int a = 10;int b = 20;System.out.println("交换前:a = " + a + " b = " + b);
//        1
//        int tmp =a;
//        a =b;
//        b = tmp;// 图 5//2.异或a = a^b;b = a^b;// b = a^b^b(b^b == 0) == 0 ^ a == aa = b^a;// a = b^a == a(b) ^ a^b(a) == 0 ^ b == b// 图 6// 两种方法均可以交换两者数据System.out.println("交换后:a = " + a + " b = " + b);}
}

图5

在这里插入图片描述

图6

在这里插入图片描述


用方法来写

public class UseOfMethods {public static void main(String[] args) {int a = 10;int b = 20;System.out.println("交换前:a = " + a + " b = " + b);swap(a, b);System.out.println("交换后:a = " + a + " b = " + b);}public static void swap(int x, int y) {int tmp = x;x = y;y = tmp;}}

图7

在这里插入图片描述


图8

在这里插入图片描述


由图 7,8.可知这样写不会发生任何改变,因为只是交换形参,也就是说 交换的是 swap方法的参数
不是在交换 main方法的参数,这里的x,y,只是a和b的值的一份拷贝
有人肯定会说像C里面一样,传地址呗
记住 在Java中,是无法取得栈上变量的地址的,也就是说取不到局部变量的地址( 图 9)

图9

在这里插入图片描述
如果要去做,只能把 a 和 b 的值,放到堆上(动态空间上)放在堆上的都是对象。
这道题留着 我们讲 对象和类,或者数组的时候,再进行讲解。以我们现在的基础还不足以解决该问题。


没有返回值的方法

方法的返回值是可选的. 有些时候可以没有的

代码示例

public class UseOfMethods {public static void main(String[] args) {int a = 0;int b = 1;sum(a,b);}public static void sum(int x,int y){System.out.println(x+y);// 我在方法中就已经将我们想打印的结果 图 10,所以不需要返回值//但是规定 无返回,就不能 return 返回一个值
//        return x+y; 图 11,都报错了,就别谈运行// 但是可以这么写return ;// 虚晃一枪,你能奈我何?// 图 12}
}

图10

在这里插入图片描述


图11

在这里插入图片描述


图12

在这里插入图片描述


方法的重载

 有些时候我们需要用一个函数同时兼容多种参数的情况, 我们就可以使用到方法重载

代码示例

public class UseOfMethods {public static void main(String[] args) {int a = 10;int b = 20;int ret = add(a, b);System.out.println("ret = " + ret);double a2 = 12.5;double b2 = 18.5;double ret2 = add(a2, b2);//图 13System.out.println("ret2 = " + ret2);}public  static  int add(int x,int y){return  x+y;}
}

图13

在这里插入图片描述


由此,我们需要 方法的重载:一个函数同时兼容多种参数的情况

那我们怎么实现呢?

代码实例2

public class UseOfMethods {public static void main(String[] args) {int a = 10;int b = 20;int ret = add(a, b);System.out.println("ret = " + ret);double a2 = 12.5;double b2 = 18.5;double b3 = 9.0;double ret2 = add(a2, b2,b3);//图 13System.out.println("ret2 = " + ret2);}public  static  int add(int x,int y){return  x+y;}public static double add(double x,double y,double z){return (x+y+z);}
}// 图 14

图14

在这里插入图片描述


记住

 方法重载的重点在于函数名要相同,参数个数或者类型要不同。(两者中必有一者不同)而返回值 不重要,只要你接收返回的值的类型是相匹配的就行,要不然无法进行赋值。

另外切记

不要写的一摸一样(参数个数和类型都相同),这样相当于 一个变量被重复定义,是会出错的

例如:

public  static  int add(int x,int y){return  x+y;}public  static  int add(int x,int y){return  x+y;}

再来看一个错误示范

public class UseOfMethods {public static void main(String[] args) {int a = 10;int b = 20;int ret = add(a, b);System.out.println("ret = " + ret);}public  static  int add(int x,int y){return  x+y;}public static double add(int x,int y){return (double)(x+y);}
}// 图 15

图 15

在这里插入图片描述

由图我们可以看出这样写也是不行的,正如我前面所说的 返回值,不是重点参数类型和个数才是重点
只要你参数的类型 和 个数 一模一样,无论你返回值是什么,都算方法的重定义, 程序是会报错的(方法的重定义这是我个人理解)


&ensp

图16

在这里插入图片描述

由此我们可以看出 方法的重载 有多么强大。
我们可以根据 参数的类型和个数 来为我们的方法,加载 几个新的方法,具有更多的功能
现在你知道了吧 方法的重载,有多爽!


补充一个知识点:

 如果一个类的两个方法(无论是在同一个类中声明,还是都由一个类继承的,或者一个声明和一个继承的【总的来说不一定是同一个类里的】)具有相同的名称,但签名不是重写等价的,则称该方法名为重载。 (了解即可)

由上我可以总结出 方法重载的规则

1. 方法名要相同
2. 方法的参数不同(参数个数或者类型,两者选其一,或者都选,反正至少有一个因素是不同的)
3. 方法的返回值类型不影响重载
4. 当两个方法的名字相同, 参数也相同, 但是返回值不同的时候, 不构成重载.


方法递归

递归的概念

   一个方法在执行过程中调用自身, 就称为 "递归".
递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式
递推公式是递归的重点,推出它,递归就很好写。没推出。就。。。嗯~~~

使用递归之前,需要一个前提

1. 有一个趋近于终止的条件(停止递归的条件)
2. 自己调用自己(让它自己扇自己,扇疼了再停下来,不要问我为什么我举这个例子!)


代码示例

public class UseOfMethods {public static void main(String[] args) {func();}这样写,就不满足 使用递归所需的第一个条件 没有一个终止递归的条件所以该程序会无限递归死循环,最终导致栈溢出(栈空间不是无限大,是有限,func方法一直调用自己下去,最终肯定是会 爆满/溢出 的)因为 每次调用 func方法时,都会为其在栈上空间开辟块自己的空间public  static void func(){func();}
}// 图17

图17

在这里插入图片描述


那我该怎么去写一个可以使用的递归呢?

代码实例2

public class UseOfMethods {public static void main(String[] args) {func(3);}public  static void func(int n){if(n==1){// 递归的终止的条件,因为 n == 3.每次自己调用自己时,n都会减1,调用 3 次,就结束了System.out.println(n);return ;}func(n-1);System.out.println(n);}
}// 图18

图 18

在这里插入图片描述


其实终止条件,相当于数学里的起始条件

 你这样想 假设我们不知道 n 为多少,那我们怎么办?先从初始情况分析呗当 n =0时,怎么办?n =1时,怎么办?大于1又怎么办?
en~,是不是有点懂了,当我们处理递归时,我们可以有两种思维
当我们去思考它的终止条件是什么? 你可能会被套娃,套成zz。
这时候,我们反过来想想 这个值的初始值是多少,满足怎样的条件?(就比如说要大于,小于或等于某个条件)
是不是打开新思路了?‘’思考递归的时候,横向思考:根据递推公式(个人理解递推公式跟数学的通项公式有点像)去思考
代码执行:纵向执行的(从上往下,一条条执行)在坐的某些人,经常会自己代入某个数字,然后,拿着数字和代码一个个展开,很烧脑的
虽然我很喜欢这样,但是我只是在我掌握递归规律(递推公式)之后,对代码执行过程的好奇,去展开很小很小的范围。比如1、2、3之类的
太复杂了,对不起,我不玩了。。。这点不值得提倡,我们需要的是掌握其递归规律,才是重中之重。

举个例子

求 n的阶乘(n==5)
1! == 1 //这就是我们的起始条件,也是我们的终止条件
2! == 2*1 == 2 * 1!
3! == 3*2*1 == 3 * 2!
4! == 4*3*2*1 == 4 * 3!
5! == 5*4*3*2*1 == 5 * 4!
你发现了 求 5!的值,它是 5 * (5-1)!
而  4! == 4 * (4-1)!
3!  == 3 * (3-1)!
2!  == 2 * (2-1)!
以此类推 直到遇到 1! 时,他的返回值里不再带其他阶乘,此时 1!是不是很适合作为我们递归的终止条件由此我们发现了 递推公式为 n * (n-1)!
5! == 5 * 4!== 5 * 4 * 3! == 5 * 4 * 3 * 2! == 5 * 3 * 2 * 1(这里只是帮助你们理解,别学,上面的递推公式才是你们该学的)

代码实现

   import java.util.Scanner;public class UseOfMethods{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(factorial(n));sc.close();//关闭输入}public  static  int factorial(int n){if(1==n){return 1;}return n*factorial(n-1);// n * (n-1)! // (n-1)! == factorial(n-1);  即 factorial == !}}// 图19,不懂没关系,我帮你搬下来,对着看1! == 1 //这就是我们的起始条件,也是我们的终止条件2! == 2*1 == 2 * 1!3! == 3*2*1 == 3 * 2!4! == 4*3*2*1 == 4 * 3!5! == 5*4*3*2*1 == 5 * 4!你发现了 求 5!的值,它是 5 *5-1)!而  4== 4 * (4-1)3!  == 3 * (3-1)!2!  == 2 *2-1)!5! == 5 * 4!== 5 * 4 * 3! == 5 * 4 * 3 * 2! == 5 * 3 * 2 * 1程序运行 跟我们刚才藏宝殿是一样的,一层一层的抢。从最里面的开始抢也就从我们终止条件开始n == 1;  return 1;// 这里的返回值 是返回到 调用它的上一层级(藏宝殿核心是第一层吗,抢完了,肯定去抢第二程啊)n == 2   return 2* factorial(2-1) == 2 * 1 == 2n == 3;  return 3 * 2 == 6n == 4;  return 4 * 6 == 24n == 5;  return 5 *   ==考验你们的时候,在下面评论,看你们到底有没有看懂学会递归的字面意思递归 n * factorial(n-1)l  n-1 就是它传过去的值,称为递, factorial(n-1)返回的值,称为归结合称为: 递归。你赚的钱迟早是有一天会花完的。。。赶快跟着我一起卷。

图19

在这里插入图片描述


再来看几道例题

求 1~n之间的和

import java.util.Scanner;public class UseOfMethods {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(sumadd(n));// 图 20sc.colse()// 关闭输入}public static  int sumadd(int n){if(n==1){return 1;}return n + sumadd(n-1);}
}// 自己琢磨,不懂在下方评论,一起探讨。(n 比 n-1 多了1,看似废话,其实是真理)20

图20

在这里插入图片描述


按照顺序打印一个数字的每一位(例如1234 打印出 1 2 3 4)

import java.util.Scanner;
public class UseOfMethods {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();print(n);sc.close();//关闭输入}public  static  void print(int n){if(n<10){System.out.println(n);return;}print(n/10);// 在调用自身是,将 n/10 的值 作为下个自身函数的形参// 最终肯定有 剩一位数的时候,一位数(0~9)肯定是小于10的,别问为什么,问就不会!// 这个也就是我们终止条件// 假设我们输入的是 1234 , 在调用自身是,将 n/10 的值 作为下个自身函数的形参,那么 剩余的最后一位就是 1.所以从1开始打印//  其次是2 (12%10)、 3(123%10)、4(1234%10)System.out.println(n%10);}// 图 21
}

图21

在这里插入图片描述


递归执行过程分析

递归的程序的执行过程不太容易理解, 要想理解清楚递归, 必须先理解清楚 "方法的执行过程", 尤其是 "方法执行结束之后, 回到调用位置继续往下执行“

&ensp;

继续实践

写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19

import java.util.Scanner;public class UseOfMethods {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(sum(n));sc.close();}public static int sum(int n){if(n<10){return n;}return n%10+sum(n/10);}
}// 图 22 ,这题跟上面那题几乎一样,就不讲了,自己琢磨。

图22

在这里插入图片描述


求斐波那契数列的第 N 项(递归)

 1 1 2 3 5 8 13......从第三位开始,等于自身前两位数相加

代码如下

import java.util.Scanner;public class UseOfMethods {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(fibonacci(n));}public static int fibonacci(int n){if(n<3){return 1;}return fibonacci(n-1) + fibonacci(n-2);}
}// 图23

图23

在这里插入图片描述


注意用 递归的方法来求 斐波那契数,效率很低

图 24

在这里插入图片描述

一个数字重复出现,求 第 n位的斐波那契函数,n越大重复的数字越大
所以我不推荐使用递归去处理斐波那契数,因为面试中,使用该方法求解,你绝对GG


这里我推荐 迭代 方法(循环)

求斐波那契数列的第 N 项(迭代/循环)

 1 1 2 3 5 8 13.....从第三位开始,等于自身前两位数相加import java.util.Scanner;public class UseOfMethods {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();fibonacci(n);sc.close();}public static void fibonacci(int n){if(n<3) {System.out.println(1);}else {int a =1;int b =1;int c = 0;for(int i=3;i<=n;i++){//从第三位开始,等于自身前两位数相加c = a+b;a=b;b=c;//  1 1 2 3 5//  a b c//  1 1 2 3 5//    a b c//  1 1 2 3 5//      a b c}System.out.println(c);}}
}// 图 25,只是计算简单加法,效率要高很多

图 25

在这里插入图片描述


递归小结

递归是一种重要的编程解决问题的方式.

    有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效

本文结束

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

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

相关文章

听说,有些网站明文存储用户密码?

前段时间爆出 Facebook 明文存储用户密码&#xff0c;多达 6 亿用户&#xff0c;而它的用户总数是 27 亿&#xff0c;占比 22 % 。 看到这个消息&#xff0c;是不是很震惊? 无独有偶&#xff0c;之前有听过很多银行系统的密码也是明文&#xff08;真假没有验证&#xff09;。…

一个因pid文件丢失,nginx的进程起不来,网站页面无法访问的故事

问题描述&#xff1a; 公司的一个网站首页突然打不开&#xff0c;使用域名访问&#xff0c;页面一片空白。使用IP端口 访问&#xff0c;界面只能看到几个蓝色的标题&#xff0c;没有图片&#xff0c;排版混乱。 分析解决&#xff1a; 1、查看部署官网的nginx进程&#xff0c;进…

网站至今已停超过24小时,郁闷中...

最早想用一卡通来付钱&#xff0c;忘了把证书带在身边&#xff0c;网上银行使用不了了退而求其次&#xff0c;申请支付卡&#xff0c;被银行的人问了一堆的问题&#xff0c;很多天长地久谁能记得那么清楚&#xff0c;失败。再求其次&#xff0c;用别人的卡付帐&#xff0c;谁知…

快速在Ubuntu安装PHP网站

快速安装使用的是tasksel&#xff0c;tasksel是Debian / Ubuntu的工具&#xff0c;安装多个相关软件包作为一个协调的“任务”到你的系统。这个lamp-server^跟taskel这个程序有关。下面是详细步骤&#xff1a; 一、升级当前Linux环境 这里我采用UBUNTU发行版本&#xff0c;需要…

云服务器 ECS 搭建WordPress网站:购买域名

购买域名您可以给自己的网站设定一个单独的域名。您的用户可以使用易记的域名访问您的网站&#xff0c;而不需要使用复杂的 IP 地址。 建议通过 阿里云购买域名。 操作步骤 1.在购买域名页面&#xff0c;搜索想用的域名&#xff0c;如尚未被注册&#xff0c;则可以购买。选择要…

python 第一个网站应用

Hello,第一个网页分析 打开文本编辑器。这里要说一下啦&#xff0c;理论上讲&#xff0c;所有的文本编辑器都可以做为编写程序的工具。前面已经提到的那个python IDE&#xff0c;是一个很好的工具&#xff0c;再有别的也行&#xff0c;比如我就用vim&#xff08;好像我的计算机…

wallhaven壁纸网站改版后爬虫小例子

wallhaven壁纸网站改版后爬虫 新手上路&#xff0c;老司机绕路 最近学习python&#xff0c;尝试写一点小爬虫 这是改版后的wallhaven壁纸网站&#xff0c;爬取热门榜单。首先对网站进行分析 按F12启动开发者工具&#xff0c;对网页进行分析。 现在页面上的图片都是缩略图没有爬…

ASP.NET WEB网站简单入门(简单Demo -发布)

简单分几个阶段 一、简单代码实现 1.新建工程 2.打开设计器&#xff08;查看设计器&#xff09;&#xff0c;托出一个label ,写上Hello 3.点击调试&#xff0c;即可看到网页效果 4.重新生成后&#xff0c;发布到指定路径下 5.弹出网站发布设置面板&#xff0c;点击&l…

爬虫7----动态网站抓取

一、Ajax和动态HTML 二、Selenium 使用教程 一、实例1 二、元素的选取 2.1实例讲解 三、页面操作 1.页面交互和表单填充 代码如下&#xff1a; 2.元素拖拽 3.切换窗口 3.如何切换frame selenium提供了**switch_to.frame()**方法来切换frame 3.1、从frame中切回主文档…

亿恩云主机,网站所有页面头部开始被插入iframe,提交问题给亿恩技术,回应的是沉默...

用的亿恩的云主机&#xff0c;今天发现所有页面头部最开始被插入了如下一段代码&#xff1a; <iframe src http://122.224.95.100:6655/server.exe width0 height0></iframe> 后经检查&#xff0c;服务器上的文件并没有被篡改&#xff0c;补丁也打了&#xff0c;也…

五款开源免费的建站系统推荐

最近研究了下开源的建站系统&#xff0c;推荐5款国内的吧&#xff0c;都有免费版本&#xff0c;有需要可以去试试。 ECTouch ECTouch是一款开源免费的移动商城网店系统。能够帮助企业和个人快速构建手机移动商城并减少二次开发带来的成本。 ECTouch采用PHPMYSQL方式运行&…

学英语好网站

转载于:https://www.cnblogs.com/DeeLMind/p/7627276.html

[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护

这是作者的系列网络安全自学教程&#xff0c;主要是关于网安工具和实践操作的在线笔记&#xff0c;特分享出来与博友共勉&#xff0c;希望您们喜欢&#xff0c;一起进步。前文分享了Python网络攻防基础知识、Python多线程、C段扫描和数据库编程&#xff0c;本文将分享Python攻防…

简单用户登录网站(HttpServlet1.1版本)

案例说明:用户在登录界面输入非空信息,在欢迎页面显示用户信息 Login1.java 用户登录界面 对Login1.java进行Servlet部署 LoginCl1.java 用户业务逻辑处理,采用sendRedirect()方法 对LoginCl1.java进行Servlet部署 Wel1.java 欢迎页面(显示用户信息) 对Wel1.java进行Servlet部署…

网站流量日志数据分析系统

1&#xff0e; 点击流数据模型1.1&#xff0e; 点击流概念点击流&#xff08;Click Stream&#xff09;是指用户在网站上持续访问的轨迹。这个概念更注重用户浏览网站的整个流程。用户对网站的每次访问包含了一系列的点击动作行为&#xff0c;这些点击行为数据就构成了点击流数…

渗透之路 信息收集【第四篇】网站四大套件识别

国内网站架构情况 特性1&#xff1a; 开源cms搭建(直接找cms漏洞) 非cms搭建(即需要代码开发)特性2&#xff1a; 阿里云&#xff0c;腾讯云等(自带防护&#xff0c;难度最大) 小中型IDC空间商 企业内部服务器特性3&#xff1a; 单一站点 多域名站点 多目录站点(多程序站点) 混合…

2017年网站安全狗绕过WebShell上传拦截的新姿势

本文来源&#xff1a;https://www.webshell.ren/post-308.html 今天有一位朋友发一个上传点给我 我一看是南方cms 有双文件上传漏洞 本来可以秒的 但是看到了 安全狗 从图片可以看到http返回信息 有安全狗拦截 哪怎么办呢 我也是搞了以前私藏的姿势 后来发现都不行 发现行…

跟着百度学PHP[14]-COOKIE的应用/网站登陆案例完整案例

先在数据库当中创建以下数据&#xff1a; mysql> create table user(-> id int not null auto_increment,-> username varchar(50) not null default ,-> password char(32) not null default ,-> email varchar(80) not null default ,-> allow_1 smallint …

逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞...

转载自&#xff1a;http://www.zmnhssn.com/?post61 漏洞地址&#xff1a;https://user.qspfw.com 用户登陆界面 具体漏洞地址: 用户密码找回界面&#xff1a;https://user.qspfw.com/page/user/findpwd/forget_pwd.do 这里可以确认网站有没有这个用户&#xff0c;这个用户…

python局域网访问主机网站_管家婆辉煌版如何实现在局域网如何访问

管家婆辉煌版本我们很多客户都在使用&#xff0c;是一款常用的进销存软件&#xff0c;那么局域网如何实现访问呢&#xff1f;在服务器上安装好管家婆服务器端后&#xff0c;然后打开套接字和管家婆辉煌版服务器端&#xff0c;这两个程序建议设置为开机启动&#xff0c;如图就是…