面向对象基础知识
- 基础部分大概围绕成员变量,成员方法,构造器三个内容
- 基础部分的重点,是在理解面向对象的一些内存机制!
一、构造器和this关键字
1、构造器分为有参和无参,无参本身就有,但如果定义了有参,就要重新定义无参。具体定义IDEA有快捷,右键+生成里就有。
2、this关键字就是指定当前访问对象,this.xxx可以用于指定访问当前对象的成员变量和方法,有时候你定义的参数和成员变量或者方法同名的情况下就可以用this。
二、封装和javabean
1、封装就是面向对象的三大特性之一,就记得在定义一个对象类的时候,其对应的方法要写在这个类中!可以避免有时候不清楚方法应该在哪定义。
2、javabean就是一些个实体类,在定义这些类的时候,成员变量设为private,同时提供专门的getter和setter的方法,给外面修改变量值。还有必须提供无参构造器,有参可写可不写,写了就一定要补无参。
三、成员变量(类中定义)与局部变量(方法中定义)的区别!
四、面向对象内存机制(理解方法区、堆内存、栈内存)!
只需要明白,实例化一个对象后,对象是和当前方法一起定义在栈内存里的,而对象的成员变量的信息存储在堆内存中,栈内存里存放指向对应堆内存中的地址,而成员的方法还是放在方法区里,堆内存里会记录对应方法的地址信息,也就是调用的时候,从栈内存到堆内存再到方法区。
JAVA不需要像C++一样释放内存空间,存在垃圾回收机器,定时清理堆内存里没有东西指向的一些信息。
五、String类和ArrayList类
- JAVA中提供的可以直接用的非常常见的两种类
- 简单记录一些可能会忘的东西看,具体在使用中再去查api文档和一些对应方法
String类
1、定义的两种方式,及其内存空间分配的区别
a、直接以""方式初始化定义,会把字符串存在堆内存的字符串常量池中,栈内存中对象存在指向常量池的地址。
b、用构造器来初始化,这种方法就是和上面说的对象的定义内存分配一致,会直接在堆内存中存储。
如图,用构造器来定义,即使内容一样,存储空间也是不一样的,因为是开辟了一个新的变量空间
2、String类的一些常用api
首先是对比两个字符串是否相等不能用==,因为两个字符串的对象里存放的是地址而不是它们的值,==会去比较地址是否指向同一个地方,而不是内容是否相等,这个在python中也有遇到。
ArrayList类(Python中的list,C++中的vector)
1、构造方式
a、首先用构造器定义,同时可以加上泛型去固定存储类型(<>这个在写C++的时候也遇到过)
ArrayList<Double> nums = new ArrayList<>(); // java.lang中包装了基本数据类型的面向对象的class形式
b、泛型不能是基本数据类型,java.lang中提供了基本数据类型的面向对象形式0的包装
2、常用的api和使用方式
a、用add来添加数据,注意String和ArrayList都不能像数组那样按索引读写数,都要用特定的api来操作。
3、ArrayList的内存机制
因为ArrayList中存的还是一些对象,所以指向的位置存放的还是地址,如图