面向对象基础

扫码查看

成员变量

成员变量的默认值:

基本类型整数(byte,short,int,long)0
浮点数(float,double)0.0
字符(char)‘\u0000’
布尔(boolean)false
数据类型默认值
引用类型数组,类,接口null

成员变量的内存图:

区域名称作用
程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址
本地方法栈当程序中调用了native的本地方法时,本地方法执行期间的内存区域
方法区存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
堆内存存储对象(包括数组对象),new来创建的,都存储在堆内存
虚拟机栈用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放

成员方法

方法也叫函数,是一个独立功能的定义,是一个类中最基本的功能单元

把一个功能封装为方法的目的是,可以实现代码重用,从而减少代码量

方法的使用原则:

(1)必须先声明后使用

(2)不调用不执行,调用一次执行一次

成员方法的分类:

  • 实例方法:没有static修饰的方法,必须通过实例对象来调用
  • 静态方法:有static修饰的方法,也叫类方法,可以由类名来调用

如何声明方法:

(1)方法声明的位置必须在类中方法外

(2)语法格式:

【修饰符】 返回值类型 方法名(【参数列表:参数类型1 参数名1,参数类型2 参数名, ...... 】){
        方法体;
        【return 返回值;】
}

如何在其它类中调用方法:

(1)实例方法

对象名.实例方法(【实参列表】)  //必须通过对象来访问

(2)类方法

类名.类方法(【实参列表】)  //推荐

对象名.类方法(【实参列表】) //不推荐
  • 形参:在定义方法时方法名后面括号中声明的变量称为形式参数(简称形参),即形参出现在方法定义时
  • 实参:调用方法时方法名后面括号中使用的值/变量/表达式称为实际参数(简称实参),即实参出现在方法调用时

总结:

(1)调用时,需要传“实参”,实参的个数、类型、顺序要与形参列表一一对应

如果方法没有形参,就不需要也不能传实参

(2)调用时,如果方法有返回值,可以接收或处理返回值结果,当然也可以不接收,那么此时返回值就丢失了

如果方法的返回值类型是void,不需要也不能接收和处理返回值结果

在本类中访问本类的成员变量和成员方法

直接用,不需要加“对象名.”和“类名.”

唯一例外:静态方法中不能直接访问本类的非静态的成员变量和成员方法

  1 class Test{
  2
  3 	static void test(){
  4 		System.out.println("");
  5 	}
  6 	void method(){
  7 		 test();
  8 	}
  9
 10     public static void main(String[] args){
 11         method();//错误
 12         test();//正确
 13     }
 14 }

方法调用内存分析

方法不调用不执行,调用一次执行一次,每次调用会在栈中有一个入栈的动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值,但方法执行结束后,会释放该内存,称为出栈。如果方法有返回值,就会把结果返回调用处;如果没有返回值,就直接结束,回到调用处继续执行下一条指令

栈结构:先进后出,后进先出

方法的参数传递机制

方法的参数传递机制:实参给形参赋值

方法的形参是基本数据类型时,形参值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值

成员变量与局部变量的区别

(1)声明的位置不同

  • 成员变量:类中方法外
  • 局部变量:方法中

(2)初始值不同

  • 成员变量:有默认值
  • 局部变量:必须手动初始化

(3)内存存储位置不同

  • 成员变量:
    • 类变量:方法区
    • 实例变量:堆
  • 局部变量:栈

(4)生命周期

  • 成员变量:
    • 类变量:和类的生命周期相同,该类所有对象共享
    • 实例变量:每一个对象的实例变量的生命周期是独立的,随着对象的创建而创建,随着对象的回收而消失
  • 局部变量:随着方法被调用执行在栈中分配,方法调用结束内存就释放,而且还有作用域问题

(5)修饰符

  • 成员变量:有很多修饰符,例如:public,private,static等
  • 局部变量:不能有修饰符
01-11 15:33
查看更多