面向对象基础
Posted daidai66
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象基础相关的知识,希望对你有一定的参考价值。
成员变量
成员变量的默认值:
基本类型 | 整数(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等
- 局部变量:不能有修饰符
可变参数
格式:
【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){ }
要求:
(1)一个方法最多只能有一个可变参数
(2)如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个
(3)书写≈
【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型[] 形参名){ }
后面这种定义,在调用时必须传递数组,而前者更灵活,既可以传递数组,又可以直接传递数组的元素
方法重载
- 指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关
- 参数列表:数据类型个数不同,数据类型不同,数据类型顺序不同
- 重载方法调用:JVM通过方法的参数列表,调用不同的方法
递归
- 指在当前方法内调用自己的这种现象
- 递归的分类:
- 递归分为两种,直接递归和讲解递归
- 直接递归称为方法自身调用自己
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
- 注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
对象数组
数组是用来存储一组数据的容器,一组基本数据类型的数据可以用数组装,那么一组对象也可以使用数组来装
即数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用数据类型时,称之为对象数组
对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不创建,数组元素的默认值就是null,所以很容易出现空指针异常NullPointerException
以上是关于面向对象基础的主要内容,如果未能解决你的问题,请参考以下文章