java 基础---函数
函数
定义在类中的有特定功能的独立小程序,也叫方法。(functions,method)。
函数是用来实现操作过程的. 实现一种代码的复用性
函数可以处理数据,可以把数据传入函数体,也可以把数据传出函数体.数据的保存是靠变量来完成.
注意:
如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量的访问是局部变量,而不是成员变量。(就近原则)
- 定义一个函数的格式必须要三部分组成。
返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,….)
{
程序代码
return 返回值;
}
用大括号括起来的称为块,块可以嵌套,块必须正确结束,大括号是一种分隔符
一个语句必须使用分号结尾,一般来说,语句需要放到方法块的内部
标记之间可以有任意空白,空白的目的是为了程序美观易读,所谓标记,包括:标识符(Identifers)、关键字(Keywords)、直接量(Literals)、分隔符(Separators)、操作符(Operators)
定义函数时,需要明确功能的最后结果是什么,明确功能实现的过程中是否需要未知内容参与。
方法的两大特征:是方法中的多态体现。
1,方法的重载 overload
在同一个类中,允许存在一个以上的同名函数,只要他们的参数列表(个数和类型)不同即可。
这样通过参数列表实现相同功能的不同类型的调用。(参数中的排列顺序要在具体的实现方法中判断,不能直接作为方法重载的判断依据。
注意:方法的返回类型对方法的重载是没有任何影响的.也就是:方法的返回类型不是判断重载的依据.
public void run()
{
……
}
public void run(int x)
{
……
}
public void run(int age,String name)
{
……
}
2,在继承关系中 方法的覆盖
在继承关系中,子类和父类出现了一模一样的方法时,父类中的方法就会被隐藏而执行子类中的方法。
这样可以在子类中定义要扩展的方法,实现对功能的升级和维护(不需要修改源码,避免导致不可预知的后果)。
形式参数
用于存储实际的参数变量,传递给函数
函数的参数是数据的入口.
参数类型
传递给函数的数据类型
如果是原生数据类型,相应的变量表示数据本身.
如果是引用数据类型,相应的变量表示对对象的指向.或null/
方法的参数传递机制
基本数据类型在参数传递过程中值不会被改变
引用数据类型在参数传递过程中,实质是方法通过地址值访问对象,是指针对对象操作,而不是变量。一句话,变量中存在的地址值始终没有改变,但对象的状态可能会发生变化。
在java中,绑定就是对象方法的调用,准确的说就是对象句柄与方法的绑定,
绑定分静态绑定和动态绑定。
当声明一个方法为private,Static,final 或者声明一个构造器时,编译器清楚的知道是什么函数调用哪个对象执行了什么方法(还没有运行执行),不存在与实际类型不匹配的现象(类型是确定的),称为静态绑定,静态绑定不存在多态的问题。
动态绑定只用在程序运行的过程中,父类类型的对象(动物)会根据程序方法接口传递的参数不同(猫或狗),而调用不同的方法,这种绑定只有在程序运行期间才会发生,即动态绑定有着不确定性。动态绑定存在动态的问题。
class Point
{
int x;
int y;
}
public class ParamTest
{
/** 主方法写在public修饰的类中.*/
public static void main(String[]args){
ParamTest pt = new ParamTest();
Point point = new Point();
/*将point对象传给changPoint()方法的实质是将point变量指向的对象的地址赋给方法中的形式参数*/
pt.changPoint(point);
System.out.println(point.x);
}
/*在调用方法时,形式参数指向的是主函数中的new Point()对象. */
public void changePoint(Point point){
/*一个引用在一个时候只能指向一个对象. point又指向了新的对象.*/
point =new Point();
point.x = 3;
point.y = 5;
}
}
构造函数(construction)
特点
a) 方法名和类名完全相同(包括大小写)的方法
b) 不能定义返回类型,连void也不能出现,没有返回值。函数的内容不可以定义return语句返回值。.
c) 若类中没有声明构造方法,此类生成对象时,Java编译器会自动为类添加一个没有参数且方法体为空的默认构造函数,以实现对对象的初始化。class Demo{ /*Demo(){}*/}
如果类中定义了构造函数,那么默认的构造函数就没有了.
d) 生成对象,构造函数会自动调用运行,实质就是通过new方法调用了构造函数。
e) 构造方法通常是通过new关键字隐式调用。
f) 构造函数可以重载,无特殊要求用public修饰。
g) 一个类中的重载构造函数之间可以用this关键字调用,this调用必须在构造函数的第一行,实质就是在构造函数中,一个构造函数调用父类或者本类的构造函数的次数只能是一次。
h) 使用new来生成对象的时候,后面的小括号()表示构造方法的参数列表. 如果构造方法不接收参数,那么小括号中的内容为空, 如果构造方法接受参数,那么小括号中的实际参数就需要与构造方法中的定义的形式参数保持一致,(参数数量一致,参数类型一致,)
i) 在一个对象的生成周期中,构造方法只能使用一次,一旦这个对象生成,构造方法就失效。
j) 作用:可以用类来生成对象,和初始化。
public class Constructor
{
public Constructor(){
//default constructor
System.out.println("run");
}
public static void main(String[]args){
Constructor con = new Constructor();
}
}
作用:
用于对对象属性进行初始化.
构造函数和一般函数的不同是在运行上:
构造函数是在对应对象一建立就会执行,是一个初始化动作,且只执行一次.(也是不能显性调用的原因)
一般方法是被对象调用才被执行,并能调用多次.
构造函数在一个类中可以重载.原因是同类型的不同对象有可能有不同的属性和方法:例如人出生,有哭的有不哭的,有起名和没有起名的.
Prson p = new Person();在内存中的过程:
1, 将指定的Person.class 字节码加载进内存
2,在栈内存开辟了栈空间P
3,在堆内存中开辟了空间.分配该对象所具备的属性区域.
4,对对象的属性进行默认初始化
5,对对象的属性进行显性初始化,
6,对对象进行构造函数初始化
7,将该对象的地址值赋给栈内存中的P.p就指向了该对象.
什么时候定义构造函数?
事物已存在就有一些属性和行为,那么就将这些属性和行为定义在构造函数中.
抽象函数 abstract class
有abstract修饰,有声明没有实现的方法。(没有{}就没有实现,有{}就是有实现)
抽象方法的实现是推迟到子类的方法中,为什么?因为一个父类有多个子类,子类对声明的抽象方法有多种实现方式。如排序方法的实现就有好几种。