publi 返回值类型 方法名(){
//方法的主体
}
return 表达式;
方法返回值:如果方法有返回值,方法中必须使用关键字 return 返回该值,返回值类型为该方法所定义的返回值类型。
强调: 方法中可以使用其他方法
对象名.方法名(); 调用不带参数的方法
成员变量: 类的方法可以直接使用该类定义的成员变量,如果其他类的方法要调用它,必须先创建该类的对象,然后通过. 操作符来引用
局部变量: 他的作用域仅仅在定义该变量的方法内,因此只有在这个方法中能够使用
初始值不同 java会给成员变量一个初始值
java不会给局部变量赋初始值
作用域不同:成员变量的作用于在整个类的内部都是可见的
局部变量的作用域仅限于定义它的方法
在同一个类中,成员变量和局部变量同名时,局部变量具有更高优先级。 (就近原则)
在while循环 do----while循环 if选择结构 switch选择结构中定义的变量作用于也仅仅在这些控制流语句块内。
javaDoc注释
/**
*
*
*
*/
javaDoc注释以/** 开头 以*/ 结尾
每个注释包含一些描述性的文本及若干个javaDoc标签
javaDoc标签一般以 @ 为前缀,常用的 javaDoc标签如下
@author ===作者 @version===版本标识 @parameter===参数及其意义 @since===最早使用该方法/类/接口的JDK版本
@return===返回值 @throws===异常类及抛出条件
如何生成javaDoc文档
<访问修饰符> 返回值类型 <方法名> (<参数列表>){
//方法的主体
}
<访问修饰符>:指该方法允许被访问的权限,只能是public 、protected、private。
返回值类型:如果方法不返回任何返回值,他应该声明为 void 类型。java对待返回值的要求非常严格,方法返回值必须与说明的类型相匹配。使用 return 语句返回值。
<方法名> : 是定义的方法的名字,他必须使用合法的标识符
<参数列表>:是传送给方法的参数列表。列表中各参数间以逗号隔开,参数列表的格式如下
数据类型 参数1,数据类型 参数2,...,数据类型 参数n
调用带参方法和调用无参方法的语法相同,但是在调用带参方法时必须传入实际参数的值。
对象名.方法名(参数1,参数2...,参数n)
先实例化对象,再调用方法
传递时实参的类型、数量、顺序都要与形参一一对应。
形参是定义方法时对参数的称呼,实参是在调用方法时传递给方法的实际值
1.什么是值传递,什么是引用传递
值传递是将需要传递的值作为一个副本传递出去,例如:
int i = 5;
int j = i;
这里把i的值5拷贝了一份副本,作为j的值,结果是i = 5,j = 5.如果改变j的值,也就是拷贝出来的副本的值,
这个改变和原来的值毫无关系,因此改变j的值不会对i的值产生影响.
引用传递,是将引用对象的地址传递出去,例如:
int *p,*p1;
int i = 5; *p = i; //这里将i在内存中的地址赋与了指针p
p1 = p; //将指针p中的地址(即i的内存地址)赋与p1
此时,改变i的值,
i = 10;
由于指针p,p1指向的地址都是i的地址,因此*p 和 *p1 的值都是10.
2.Java中函数参数的传递形式
Java中的数据分为基本数据类型和引用数据类型,我们来对这两种类型进行分析.
对于基本数据类型来说,举个例子:
int i = 10;
add(i);
void add(int temp){
temp +=5;
}
这个很简单,我们都知道调用函数时将i的值10拷贝给函数的参数了,函数调用结束后i的值并没有发生变化,这是很明显的值传递过程,我们来看看在内存中的变化过程.
首先在栈内存中为基本数据类型变量i分配内存空间并初始化值为10,然后开始调用函数add().执行add函数的时候,为temp变量分配栈内存空间,并将i的值拷贝给temp,在add执行之后,temp的值增加了5,随着add函数执行完毕,temp变量的生命周期结束了.可见,这个temp变量和i变量没有关系,temp变量可以随意命名,将其命名为i,也和之前申明的变量i毫无关系.
我找来一幅图,可以看看,在函数运行的时候,只是临时分配产生了一个值与i相同的另外一个变量而已,一旦完成了值得拷贝工作,之后这两个变量就没有任何联系了.因此,对这个临时变量的操作不会对i产生任何影响.
对于引用数据类型参数来说,举个例子:
class Person {
String name = "java";
public void setName(String name){
this.name = name;
}
}
---------------------------------------------------
void changeName (Person p1){
p1.setName("JavaScript");
}
---------------------------------------------------
public static void main (String[] args){
Person p = new Person();
changeName(p);
}
我们来看看这一过程中内存中发生的变化:
首先在堆内存中创建了一个Person对象,然后在栈内存中创建了一个引用类型的变量p,p指向堆内存中的Person对象,即p的值为Person对象在内存中分配空间的首地址值.
调用changeName()函数时,栈中再次创建一个引用类型的变量p1,然后将p中的值拷贝给p1,即p1也指向Person对象. 调用完成后,p1指向的Person对象的name属性被改变为javascript.由于p和p1指向同一个Person对象,因此p指向的Person对象的name值也变为javascript.
这看起来类似于引用传递,但是这仍然是值传递,p1接受的值是p的值的拷贝,函数调用完成后,p的值完全没有改变,仍然是指向之前创建的Person对象,这就是值传递.
整个过程中改变的是Person对象的属性name,由于p和p1都指向这个Person对象,因此p和p1产生了相同的变化,使得看起来像是进行了引用传递.
如果是引用传递的话,那么p1接收的值将会是p的地址,那么p1将不会再指向Person对象,整个程序就会产生错误.
可见,引用数据类型的参数仍然是进行值传递的,只不过这里传递的值是对象在内存中的首地址,在java中即为指向该对象的引用.而引用传递是直接将变量的地址传递给参数,很明显,这样参数接收到的值将不再指向特定的对象,整个程序将会产生错误,要传递地址的话,应该是传递Person对象的地址而不是p对象的地址.
同样用图简单概括一下
概括一下,java中函数参数的传递方式是值传递,不管参数是基本数据类型还是引用数据类型.
在复杂的文件系统中,文件分门别类存储在不同的文件中解决了文件同名冲突的问题
1.包允许将类组合成较小的单元(类似文件夹),易于找到和使用相应的类文件
2.防止命名冲突,java中只有在不同包中的类才能同名
3.包允许在更广的范围内保护类、数据和方法、可以在包内定义类
java中提供包来管理类。声明包使用关键字 package、 导入包使用关键字 import