方法与数组

JAVA中内置方法使用前提是需要导包

sqrt计算某个浮点型的平方根

public static double sqrt(double a) 原型
返回类型是double 参数类型是double

使用形式:Math.sqrt(double x)

pow计算某个浮点型的次方

使用形式:(double)pow(double x,double y)

random生成一个0到1的随机数,返回一个浮点型

int wzj=(double)(random()*100)

Random生成【0,X)的随机数

Random rad=new Random();
int wzj=rad nextInt(101);
生成[0,101);随机数

equals比较两个字符串是否相等

 

public boolean equals(object obj) 返回一个布尔常量
    
使用方法:str1.equals(str2)

方法

// 方法定义 
修饰符 返回值类型 方法名称([参数类型 形参 ...])
{ 
方法体代码; 
[return 返回值]; 
}

方法类似于C语言的函数

public static 返回值 方法名 参数

方法命名要用小驼峰的形式 (第一个单词首字母小写其他单词首字母大写)
在java当中,方法必须写在类当中
在java当中,方法不能嵌套定义
在java当中,没有方法声明

定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
一个方法可以被多次调用.

调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体
--->被调方法结束返回--->回到主调方法继续往下执行

实参和形参的关系

方法的形参相当于数学函数中的自变量,比如:1 + 2 + 3 + … + n的公式为sum(n) = 

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。
形参的名字可以随意取,对方法都没有任何影响,
形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

在Java中,实参的值永远都注意:
实参的值永远都是拷贝到形参中,形参和实参本质是两个实体是拷贝到形参中,形参和实参本质是两个实体

传值调用时无法改变实参

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,
而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,

因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,
在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,
因此对形参x和y操作不会对实参a和b产生任何影响。

解决方法

传引用类型参数(例如数组)

因为引用变量存放了对象的地址

public static void main(String[] args) { 
int[] arr = {10, 20}; swap(arr); 
System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]); 
}

public static void swap(int[] arr) { 
int tmp = arr[0]; 
arr[0] = arr[1]; 
arr[1] = tmp; } 
}
// 运行结果 arr[0] = 20 arr[1] = 10

方法重载

由于有不同的参数类型和参数个数所以为了避免多次重新命名方法的名字,就出现了方法重载

1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同) 
3. 与返回值类型是否相同无关

方法签名

在同一个作用域中不能定义两个相同名称的标识符。
比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

方法签名即:经过编译器编译修改过之后方法最终的名字。
具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:
1. 先对工程进行编译生成.class字节码文件
2. 在控制台中进入到要查看的.class所在的目录
3. 输入:javap -v 字节码文件名字即可

递归

1.自己调用自己

2.一定要一个趋近于终止的条件。(即当参数等于多少时,返回一个准确的值)

3.回归时每一次return都是返回给上一个调用的函数

4.当出现调用函数后面还有程序时:传递的时候不执行调用函数后面的程序,回归的时候把值返回给调用函数后才能执行调用函数下面的程序。

 比较以下代码

数组 

1. 理解数组基本概念
2. 掌握数组的基本用法
3. 数组与方法互操作
4. 熟练掌握数组相关的常见问题和代码

 数组的创建

T[] 数组名 = new T[N];

T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度

new表示创建一个对象。数组表示引用变量

引用变量是用来指向对象的地址,可以理解为数组名是首元素地址。

数组存放的地址是一个哈希值。

int[] array1 = new int[10]; 
// 创建一个可以容纳10个int类型元素的数组

double[] array2 = new double[5]; 
// 创建一个可以容纳5个double类型元素的数组 

String[] array3 = new double[3]; 
// 创建一个可以容纳3个字符串元素的数组

 数组的初始化

数组的初始化主要分为动态初始化以及静态初始化。 
1. 动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];

2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

语法格式: T[] 数组名称 = {data1, data2, data3, ..., datan};

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0}; 
String[] array3 = new String[]{"hell", "Java", "!!!"};
【注意事项】
静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
静态初始化时, {}中数据类型必须与[]前数据类型一致。
静态初始化可以简写,省去后面的new T[]。
// 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
如果不确定数组当中内容时,使用动态初始化,否则建议使用静态态初始化。

静态和动态初始化也可以分为两步,但是省略格式不可以
int[] array1; 
array1 = new int[10]; 

int[] array2; 
array2 = new int[]{10, 20, 30};
 
// 注意省略格式不可以拆分, 否则编译失败 
// int[] array3; 
// array3 = {1, 2, 3}; 没有写new的是省略格式
如果没有对数组进行初始化,数组中元素有其默认值
如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如

 数组的使用

遍历数组

使用length,直接算出数组元素个数

int[]array = new int[]{10, 20, 30, 40, 50}; 
for(int i = 0; i < array.length; i++){
 System.out.println(array[i]); 
}

for-each

int[] array = {1, 2, 3}; 
for (int x : array) { 
System.out.println(x); 
}
for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 
可以避免循环条件和更新语句写错

知识点总结 

寄存器在CPU的运算器上
cpu包含运算器和控制器

内存:处理缓存数据。
CPU:处理实时数据。

关系:内存把数据从硬盘调到内存中(称为缓存),然后等待CPU对内存中缓存数据的提取。
也就是说,CPU不是直接从硬盘上调用数据,而是在处理内存调用的硬盘数据。

 

 C语言中内存

JVM的简单布局 

程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址

虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,
栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,
保存的都是与方法执行时相关的一些信息。
比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 
只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 
本地方法栈和虚拟机栈是一起的

堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 
(例如前面的 new int[]{1, 2, 3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,
堆中的数据只要还有在使用,就不会被销毁。

方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数
据. 方法编译出的的字节码就是保存在这个区域

 目前主要学习堆和虚拟机栈

基本变量与引用变量区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
public static void func() { 
int a = 10; 
int b = 20; 
int[] arr = new int[]{1,2,3}; 
}
在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。

a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。

array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。
通过该地址,引用变量便可以去操作对象。

有点类似C语言中的指针,但是Java中引用要比指针的操作更简单

 当一个对象没有引用变量存放时就会被回收。和C语言动态内存分配差不多都在堆区


 观察下面两个函数调用,数组作为实参时的变化

实参是数组名字即对象的地址,传址调用(形参指向0x11)。func1又重新new了一个对象地址是0x22,将新对象的地址传给array,此时array指向新对象,又因为当离开func1后,变量出栈被销毁,此时创建的新对象因为没有引用变量指向也被销毁,所以array并没有被改变。 

实参是数组名字即对象的地址,传址调用(形参array就指向了0x11)。可以把array看成所谓的指针,array【0】相当于*(arr+0)将99赋值给array的第一个元素 ,值就发生了改变,所以打印结果是99,8,7。

 解引用表示访问这个地址

认识null

当引用变量不知道指向哪个对象时,就赋值null表示空引用(即不指向对象的引用)

int[] arr = null; 
System.out.println(arr[0]);
// 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 
因此不能对这个内存进行任何读写操作. 一旦尝试读写, 
就会抛出 NullPointerException.

注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值