面向对象基础

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

以上是关于面向对象基础的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

Java基础:封装

面向对象基础

Python基础 面向对象

python基础之面向对象

Python面向对象基础