方法(调用内存,overload)
方法调用
-
本类中调用静态方法可以省略
类名.
-
return;
终止的是方法,break;
终止的是循环。
public static void m(){
for(int i=0;i<10;i++){
if(i==5)
return; //i==5时,整个m方法结束。
System.out.println("你好!");
}
System.out.println("i");//输出结果为 0,1,2,3,4
}
方法调用的内存模型
-
方法代码一开始被类加载器加载到jvm中形成.class字节码文件,被放在了jvm的方法区内存中。
方法在调用的时候在jvm的栈区中分配一块空间,这个过程称为压栈。
方法执行完后,栈内的空间被完全释放,称为弹栈。
- (方法内的局部变量也会在这个栈区内分配空间,方法结束,局部变量的空间被释放。这也是为什么局部变量存在作用域的限制,作用域外无法被调用,因为空间已经被释放掉了)
方法重载overload
在同一个类中,功能相似的方法可以使用方法重载,方便记忆。
-
方法重载的条件
-
在同一个类中
-
方法名相同
-
参数列表不同(个数,类型,顺序不同都称为不同)
-
-
方法重载与返回值类型以及修饰符无关。
方法覆盖/重写 override
- 构成条件
-
两个类要有继承关系
-
重写后的方法与父类的方法具有:
相同的返回值类型
相同的方法名
相同的形参 -
访问权限不能降低
-
重写之后的方法不能比原方法抛出更多的异常
-
方法覆盖注意事项:
-
方法覆盖只针对于方法,与属性无关
-
构造方法不能被继承,所以也不能被覆盖
-
私有方法不能被覆盖
4.方法覆盖只针对于“实例方法”,“静态方法”覆盖没有意义。
- 解释一下:方法覆盖要与多态联合起来才有意义。子类对父类中的静态方法进行覆盖,由于静态方法的调用与对象无关,所以在多态机制中,将子类对象赋给父类引用时,父类引用调的方法在编译和运行 阶段都是自己的,不会在运行时执行子类的方法,这样一来就不是多态了,方法覆盖就失去了意义。
方法调用时的参数传递(值传递与地址传递)
传递规则只有一个:都是将变量中保存“值”复制一份到方法中,这个“值”可以是一个基本数据类型的字面值(例如100,‘张三’),也可以是一个对象的地址(0x1234)。
- 基本数据类型的参数,属于
值传递
,方法中对变量的操作不影响原来的值 - 引用数据类型的参数,属于
地址传递
,方法中对变量的操作会修改原变量的值(因为传过去的是原变量的内存地址)