Java面向对象之static关键字,可变参数,递归,数组常见算法,对象数组,方法参数

第一章.static关键字

1.static的介绍以及基本使用

1.概述:static是一个静态关键字
2.使用:a.修饰一个成员变量:static 数据类型 变量名b.修饰一个方法:修饰符 static 返回值类型 方法名(形参){方法体return 结果}3.调用静态成员:类名直接调用(不用new对象)4.静态成员特点:a.静态成员属于类成员,不属于对象成员(非静态的成员属于对象成员)b.静态成员会随着类的加载而加载c.静态成员优先于非静态成员存在在内存中d.凡是根据静态成员所在的类创建出来的对象,都可以共享这个静态成员
public class Student {String name;int age;static String classRoom;
}
public class Test01 {public static void main(String[] args) {//先给静态成员赋个值Student.classRoom = "222";Student s1 = new Student();s1.name = "郭靖";s1.age = 28;//s1.classRoom = "111";System.out.println(s1.name+","+s1.age+","+Student.classRoom);System.out.println("==============");Student s2 = new Student();s2.name = "黄蓉";s2.age = 26;//s2.classRoom = "111";System.out.println(s2.name+","+s2.age+","+Student.classRoom);}
}

2.static修饰成员的访问特点

1.在静态方法中能直接访问非静态成员嘛?  不能想要调用的话:new对象调用  2.在非静态方法中能直接访问静态成员嘛? 能a.同类:直接调用类名调用b.不同类:类名调用3.在静态方法中能直接访问静态成员嘛?能a.同类:直接调用类名调用b.不同类:类名调用4.在非静态方法中能直接访问非静态成员嘛?能a.同类:直接调用new对象调用b.不同类:new对象调用

总结:

1.不管在不在同一个类中,非静态成员都可以new对象调用

2.不管在不在同一个类中,静态成员都可以类名调用

问题1:既然static成员那么好使(类名直接调用),那么我们在实际开发中,能不能将所有的成员都定义成静态的呢?不能原因:由于静态成员会随着类的加载而加载,如果将所有的成员都变成静态的,那么类一加载,静态成员都会进内存,会大量占用内存空间问题2:那么静态成员都啥时候定义呢?一般情况下,我们在抽取工具类的时候可以将工具类中的所有成员都定义成静态的问题3:啥时候定义工具类?比如我们在写代码的过程中,发现有的功能在反复实现,代码一样,功能一样,此时就可以抽取出来,形成工具类
public class ArraysUtils {/*构造方法用private修饰工具类中的成员都是静态的,静态成员都是类名调用,不需要new对象所以工具类中的构造方法都是用private修饰如果构造方法被private修饰,那么在别的类中,就不能利用构造方法new对象*/private ArraysUtils(){}//定义一个方法,实现获取int数组最大值public static int getMax(int[] arr){int max = arr[0];for (int i = 1; i < arr.length; i++) {if (max<arr[i]){max = arr[i];}}return max;}
}
public class Test01 {public static void main(String[] args) {int[] arr = {5,3,4,6,7,54,8};int max = ArraysUtils.getMax(arr);System.out.println("max = " + max);}
}
public class Test02 {public static void main(String[] args) {int[] arr = {5,4,5,7,8,9};int max = ArraysUtils.getMax(arr);System.out.println("max = " + max);}
}

第二章.可变参数

1.需求:定义一个方法,实现n个整数相加2.分析:方法参数位置,只明确了参数的类型,但是不明确参数个数,此时就可以定义成可变参数

1介绍和基本使用

1.定义格式:数据类型...变量名2.注意:a.可变参数的本质是一个数组b.参数位置不能连续写多个可变参数,而且当可变参数和其他普通参数一起使用时,可变参数需要放到参数列表最后   
public class Demo01Var {public static void main(String[] args) {sum(1,2,3,4,5);sum1(1,1,2,3,4);}public static void sum(int...arr){int sum = 0;for (int i = 0; i < arr.length; i++) {sum+=arr[i];}System.out.println(sum);}public static void sum1(int i,int...arr){}}

1.1字符串拼接

需求一:返回n个字符串拼接结果,如果没有传入字符串,那么返回空字符串""

public class Demo02Var {public static void main(String[] args) {String result = concat("张无忌", "张翠山", "张三丰", "张三");System.out.println("result = " + result);}public static String concat(String...s){String str = "";for (int i = 0; i < s.length; i++) {str+=s[i];}return str;}
}

需求二:n个字符串进行拼接,每一个字符串之间使用某字符进行分隔,如果没有传入字符串,那么返回空字符串""

比如:concat("-","张三丰","张翠山","张无忌") -> 返回 -> 张三丰-张翠山-张无忌
public class Demo03Var {public static void main(String[] args) {String result = concat("-", "张三丰", "张翠山", "张无忌");System.out.println("result = " + result);}public static String concat(String regex, String... s) {String str = "";for (int i = 0; i < s.length; i++) {if (i == s.length - 1) {str += s[i];} else {str += s[i] + regex;}}return str;}
}

第三章.递归

1.概述:方法内部自己调用自己
2.分类:a.直接递归public static void method(){method()}b.间接递归:A(){B()}B(){C()}C(){A()}3.注意:a.递归必须要有出口,否则会出现"栈内存溢出"b.递归即使有出口,递归次数不不要太多    
public class Demo01Recursion {public static void main(String[] args) {method();}public static void method(){method();}
}

示例一:需求:利用递归输出3到1

public class Demo02Recursion {public static void main(String[] args) {method(3);}public static void method(int n){if (n==1){System.out.println(n);//结束方法return;}System.out.println(n);n--;method(n);}
}

示例二:求n!(n的阶乘)

1.需求:定义一个方法,完成3的阶乘3*2*1
2.分析:假如定义一个方法,代表n的阶乘 -> method(n) -> n接收几,就代表几的阶乘method(1)  1method(2)  2*1 -> 2*method(1)method(3)  3*2*1 -> 3*method(2)method(n) -> n*method(n-1)
public class Demo03Recursion {public static void main(String[] args) {int method = method(3);System.out.println("method = " + method);}public static int method(int n){if (n==1){return 1;}return n*method(n-1);}
}
1700189156331

示例三:计算斐波那契数列(Fibonacci)的第n个值

不死神兔
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡
问:一对刚出生的兔子,一年内繁殖成多少对兔子? 

规律:一个数等于前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55…

1700190062858
1.假设:定义一个方法,叫做method,参数传递month,代表月份2.分析:method(1)     1method(2)     1method(3)     2 -> method(1)+method(2)method(4)     3 -> method(2)+method(3)method(5)     5 -> method(3)+method(4)   method(n) -> method(n-2)+method(n-1)
public class Demo04Recursion {public static void main(String[] args) {int method = method(12);System.out.println("method = " + method);}public static int method(int n){if (n==1 || n==2){return 1;}return method(n-1)+method(n-2);}
}

第四章.数组常见算法

1.数组翻转

1.概述:数组对称索引位置上的元素互换

public class Demo01Reverse {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7};for (int min = 0,max = arr.length-1;min<max;min++,max--){int temp = arr[min];arr[min] = arr[max];arr[max] = temp;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}

2.冒泡排序

 数组的排序,是将数组中的元素按照大小进行排序,默认都是以升序的形式进行排序,数组排序的方法很多,我们讲解的是数组的冒泡排序。排序,都要进行数组 元素大小的比较,再进行位置的交换。冒泡排序法是采用数组中相邻元素进行比较换位。arr[i](前一个元素)   arr[i+1](后一个元素)

2.1 代码实现

public class Demo02Bubble {public static void main(String[] args) {//定义一个数组,长度为5,最大索引为4int[] arr = {5,4,3,2,1};/*第一圈越界原因:当i变化到4的时候-> arr[4]>arr[5] -> 直接操作了5索引,所以越界了越界解决:我们可以让arr.length-1如果arr.length-1-> 比较就是i<4 -> 此时i最大可以变化到3当i变化到3时 -> arr[3]>arr[4] -> 正好是最后两个元素进行比较*//*for (int i = 0; i < arr.length-1-0; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第二圈/*for (int i = 0; i < arr.length-1-1; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第三圈/*for (int i = 0; i < arr.length-1-2; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第四圈/*for (int i = 0; i < arr.length-1-3; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*//*外层循环代表比较了几圈n-1圈*/for (int j = 0; j < arr.length-1; j++) {/*内层循环代表每一圈比较的次数每圈都少比较一次*/for (int i = 0; i < arr.length-1-j; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}

3.二分查找

1.前提:数组中的数据必须是有序的
2.查询思想:a.老式查询:遍历数组,一个一个比较 -> 查询效率慢b.二分查找:每次找中间索引对应的元素进行比较查询(每一次查询少一半数据)

public class Demo03Binary {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7,8,9};int index = binary(arr, 60);System.out.println(index);}public static int binary(int[] arr,int data){//定义三个变量,分别代表最大索引,最小索引,中间索引int min = 0;int max = arr.length-1;int mid = 0;//查找while(min<=max){mid = (min+max)/2;if (data>arr[mid]){min = mid+1;}else if(data<arr[mid]){max = mid-1;}else{return mid;}}return -1;}
}

第五章.对象数组

1.对象数组

1.需求:定义一个长度为3的数组,存储3Person对象,遍历数组,将三个Person对象中的属性值获取出来
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class Demo01ObjectArray {public static void main(String[] args) {/*Person p = new Person();1.定义一个存储int型数据的数组:int[]2.定义一个存储double型的数组:double[]3.定义一个存储String型的数组:String[]4.定义一个存储Person型的数组:Person[]*///定义数组Person[] arr = new Person[3];//创建三个对象Person p1 = new Person("金莲",26);Person p2 = new Person("涛哥",18);Person p3 = new Person("张三",20);//将三个对象保存到数组中arr[0] = p1;arr[1] = p2;arr[2] = p3;/*遍历当i = 0  arr[0] 就是 p1对象当i = 1  arr[1] 就是 p2对象当i = 2  arr[2] 就是 p3对象*/for (int i = 0; i < arr.length; i++) {//Person p = arr[i];System.out.println(arr[i].getName()+"..."+arr[i].getAge());}}
}

练习1

1)定义学生类Student声明姓名和成绩成员变量(2)测试类ObjectArrayTest的main中创建一个可以装3个学生对象的数组,并且按照学生成绩排序,显示学生信息
public class Student {private String name;private int score;public Student() {}public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}
}
public class Demo02ObjectArray {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("金莲",26);students[1] = new Student("大郎",50);students[2] = new Student("涛哥",18);for (int j = 0; j < students.length-1; j++) {for (int i = 0; i < students.length-1-j; i++) {if (students[i].getScore()>students[i+1].getScore()){Student temp = students[i];students[i] = students[i+1];students[i+1] = temp;}}}for (int i = 0; i < students.length; i++) {System.out.println(students[i].getName()+"..."+students[i].getScore());}}
}

第六章.方法参数

1.基本数据类型做方法参数传递

基本类型做方法参数传递,传递的是值,不是变量本身
方法运行:压栈
方法运行完毕:弹栈 -> 释放栈内存
public class Demo01Param {public static void main(String[] args) {int a = 10;int b = 20;method(a,b);System.out.println(a);//10System.out.println(b);//20}public static void method(int a,int b){a+=10;b+=20;System.out.println(a);//20System.out.println(b);//40}
}

2.引用数据类型做方法参数传递

引用数据类型做方法参数传递时,传递的是地址值
public class Demo02Param {public static void main(String[] args) {int[] arr = {10,20};method(arr);System.out.println(arr[0]);//20System.out.println(arr[1]);//40}public static void method(int[] arr){arr[0]+=10;arr[1]+=20;System.out.println(arr[0]);//20System.out.println(arr[1]);//40}
}

第七章.命令行参数(了解)

通过命令行给main方法的形参传递的实参称为命令行参数

public class TestCommandParam{//形参:String[] argspublic static void main(String[] args){for(int i=0; i<args.length; i++){System.out.println("第" + (i+1) + "个参数的值是:" + args[i]);}}
}

运行命令:

java TestCommandParam
java TestCommandParam 1 2 3
java TestCommandParam hello atguigu

在这里插入图片描述

第八章.其他操作

1.快速生成方法

1.初学者要求先定义,再调用;不是初学者,就可以先调用,再定义方法a.快捷键:alt+回车2.快速将一段代码抽取到一个方法中:a.选中要抽取的方法b.按ctrl+alt+m      

2.debug调试

1.概述:调试代码的一种手段2.作用:a.能清楚的看到每个变量在代码执行过程中的变化b.找错3.使用:a.在想要开始debug的那一行左边点击一下,出现红色小圆点(断点)b.右键-> 点击debug    

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

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

相关文章

后端返回前端时间格式化

时间格式化的方法总共包含以下 5 种。 1.前端时间格式化 JS 版时间格式化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function dateFormat(fmt, date) { let ret; const opt { "Y": date.getFullYear().toString(), // 年 …

Python学习从0开始——Kaggle深度学习002

Python学习从0开始——Kaggle深度学习002 一、单个神经元1.深度学习2.线性单元示例 - 线性单元作为模型多个输入 3.Keras中的线性单元 二、深度神经网络1.层多种类型的层 2.激活函数3.堆叠密集层4.构建Sequential模型 三、随机梯度下降1.介绍2.损失函数3.梯度下降法1.梯度下降法…

FL Studio(FL 21)软件下载-详细安装教程视频

​fl studio 编曲软件即,简称FL,是音乐人熟知的水果编曲软件.可以完成完整的音乐制作环境或数字音频工作站(DAW)就是大家熟悉的水果 编曲软件&#xff0c;一个全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室。…

海南云亿商务咨询有限公司解锁抖音电商新纪元

在当今数字化浪潮中&#xff0c;抖音电商以其独特的魅力和强大的用户基础&#xff0c;迅速成为企业营销的新宠。海南云亿商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领先企业&#xff0c;凭借专业的团队和丰富的经验&#xff0c;为众多企业提供了高效、精准的电商服…

Keepalived介绍、安装和简单使用

目录 1 Keepalived1.1 keepalived介绍1、keepalived原理2、keepalived原理3、VRRP工作模式 1.2 keepalived安装配置1、安装配置2、keepalived配置文件详解3、通过配置文件实现资源监控 1.3 案例1、nginx keepalived 实现高可用2、nginx keepalived 实现高可用 - 非抢占模式 总…

嵌套查询(一)-谓词IN、量词ANY、量词ALL、比较运算符

一、在多个表之间进行数据查询&#xff0c;除了可以使用连接查询之外&#xff0c;也可以使用嵌套查询&#xff0c;那么什么是嵌套查询呢&#xff1f;如何使用嵌套查询呢&#xff1f; 1、将一个SELECT-FROM查询&#xff0c;嵌套在另一个SELECT查询语句中&#xff0c;那么这个SE…

swagger美化

参考资料 https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 版本选择 需要先确认springboot版本&#xff0c;再确认swagger版本是2还是3&#xff0c;最后还要关注Springfox的版本。 确认springboot版本的方法 简单的看当前项目使用的就行 例子 https:…

前端面试项目细节重难点(已工作|做分享)(九)

面试官&#xff1a;请你讲讲你在工作中如何开发一个新需求&#xff0c;你的整个开发过程是什么样的&#xff1f; 答&#xff1a;仔细想想&#xff0c;我开发新需求的过程如下&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;理解需求文档&#xff1a; 首先&#x…

这三款使用的视频、图片设计工具,提供工作效率

Videograp Videograp是一款专注于视频生成的工具&#xff0c;特别适合需要快速剪辑和编辑视频的用户。Videograp具备以下特点&#xff1a; 影音比例转换&#xff1a;Videograp支持调整视频的分辨率和比例&#xff0c;使其更适合不同的播放环境和设备。 AI快剪&#xff1a;该工…

期望14K,某小公司java社招面试经历

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 面试的是一家几百人的公司&#xff0c;基本面试的考察有八股文&#xff0c;也有按照项目问你的&#xff0c;总的来说比较全面吧 1、java代理模式 …

k8s 自动伸缩机制-------HPA 超详细解读

目录 在K8s中扩缩容分为两种&#xff1a; 前言 弹性伸缩是根据用户的业务需求和策略&#xff0c;自动“调整”其“弹性资源”的管理服务。通过弹性伸缩功能&#xff0c;用户可设置对定时、周期或监控策略&#xff0c;恰到好处地增加或减少“弹性资源”&#xff0c;并完成实例…

Android native层的线程分析(C++),以及堆栈打印调试

文章目录 Android native层的线程分析(C)&#xff0c;多线程实现1.native线程的创建第一部分&#xff1a;android_thread模块第二部分&#xff1a;linux_thread模块 2.测试linux_thread模块3.Android native的Thread类3.1源码分析 4.native层堆栈调试方法1. 引用库2. 头文件3. …

前端实现获取后端返回的文件流并下载

前端实现获取后端返回的文件流并下载 方法一&#xff1a;使用Axios实现文件流下载优点缺点 方法二&#xff1a;使用封装的Request工具实现文件流下载优点缺点 方法三&#xff1a;直接通过URL跳转下载优点缺点 结论 在前端开发中&#xff0c;有时需要从后端获取文件流&#xff0…

性能测试3【搬代码】

1.Linux服务器性能分析命令及详解 2.GarafanainfluxDB监控jmeter数据 3.GarafanaPrometheus监控服务器和数据库性能 4.性能瓶颈分析以及性能调优方案详解 一、无界面压测时&#xff0c; top load average:平均负载 htop 二、Garafana监控平台 传统项目&#xff1a;centosphpm…

网站接口是怎么开发的,开发之后是怎么用的

网站接口的开发流程 1.确定接口需求 在开发接口之前我们先要知道&#xff0c;要开发什么样的接口&#xff0c;这个接口是用来干什么的&#xff0c;得先知道相关的需求&#xff0c;才能规划下一步&#xff0c;比如客户想要一个文章列表&#xff0c;那么我们就知道这个需求…

kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现增量同步

1、之前kettle cdc mysql的时候使用的方案是canalkafkakettle&#xff0c;今天我们一起学习下使用kettle的插件Debezium直接cdc mysql。 注&#xff1a;CDC (Change Data Capture) 是一种技术&#xff0c;用于捕获和同步数据库中的更改。 1&#xff09;Debezium步骤解析mysql b…

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介&#xff1a; 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆&#xff0c;并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域&#xff0c;为相关部门提供重要的数据支持。 系统实现&#xff1a; 视频流输入&#xff1a;系…

Antd 自定义列表全选功能

背景 需要为List组件自定义全选功能&#xff0c;如下图所示&#xff1a; 全选checkbox需要与下面每一项的checkbox联动&#xff1b;当从第一页翻页到第二页的时候&#xff0c;第一页已选的内容保持&#xff0c;可以对第二页勾选&#xff0c;同时保证全选checkbox的状态是正确的…

当JS遇上NLP:开启图片分析的奇幻之旅

前言 在当今科技飞速发展的时代&#xff0c;JavaScript&#xff08;JS&#xff09;作为广泛应用的编程语言&#xff0c;展现出了强大的活力与无限的可能性。与此同时&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也正在经历着深刻的变革与进步。 当这两者碰撞在一…

【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析

文章目录 并发简史&#x1f5a5;️初期探索&#xff08;20世纪50-60年代&#xff09;并发理论基础&#xff08;1965年以后&#xff09;并行计算的兴起&#xff08;1970年代至1980年代&#xff09;现代并发技术&#xff08;1990年代至今&#xff09; 线程的优势&#x1f60d;发挥…