Java基础知识备忘录(二)

Java中变量的内存分配
Java中的内容分为栈和堆
栈一般比较小,堆一般比较大
栈中取值速度比较快,堆中取值速度比较慢
基本数据类型存放在栈中,因为数据比较小
引用类型虽然后出现在栈中,但是只有头部(引用),真正的身体存放在堆中,因为引用数据类型一般都比基本数据类型大

基本数据类型数值的修改是直接修改栈里的值
引用类型数据若要修改,则需要在堆上新申请一块空间,再将栈里的指针指向新的空间,原来的空间就成为了垃圾(例如String)
以上可以说明字符串是否修改问题
String不能修改,即使看起来值修改了,也只是指向了新申请的字符串空间而已,原字符串的内容不会变。

没有引用的内存会被JVM再适当的实际回收。

java内存分配中还有一个方法区:
方法区里保存得当然都是方法
运行常量区:
方法区里包含这一个运行常量区,这个区域保存着方法运行时需要使用的常量
方法运行使得局部变量申请在栈里
静态区:
静态区也在方法区里保存,这里保存静态变量和静态方法。

常量时不允许修改的,常量可以供多人使用。
String常量知识:
String常量:
如果新创建的String常量(不使用new)和已存在的String常量(不使用new)相等,则会从这里(运行常量区)拷贝一份地址,不会申请新的空间。
使用new会直接再堆上新申请一个空间,常量区新建一个常量(如果重复则不创建),堆上的空间指向这个常量。

所有的局部变量都存放在栈里
java声明数组一般将中括号写在前面:
数组使用引用类型保存
再数组类型里,长度作为属性存在

int[] a = {123};
int[] a = new int[]{1,2,3};
int[] a = new int[3];

数组引用也可能在堆里创建(多维数组)
多维数组其实是一位数组的组合

Java中的方法:
Java中的方法是按照方法名和参数一起作为唯一ID的
参数不一样方法名一样则视为不同方法

方法在栈里有自己的内存空间,声明周期为方法调用开始和结束.
如果是方法中使用了基本数据类型,则会将该数据从原存储位置复制一份到方法自己的栈空间,相当于建立了副本,对副本修改,不会影响到原数据:

public static void main(String[] args){
	int i = 5;
	A(i);
	System.out.println(i);//5
}
public static void A(int i){
	i = 1;
}

如果方法的参数为引用数据类型,则复制的是方法在栈中的引用,产生一个指向相同数据的引用,如果直接对副本引用数据修改,则会直接影响数据,如果将副本引用指向新的空间,则该引用和原数据就没有关系了,不会影响到原数据。

三种变量存储位置:
成员变量:堆里
局部变量:栈里(引用类型有两部分,内容堆里,引用栈里)

GC的作用:清理不需要对象的内存空间(空间还在,存的数据没了),如果有新对象且大小合适,就分配,并不需要新对象重新申请空间。
栈里的空间会在程序运行到有效域之外清空,而堆里的空间由JVM用计数器统计堆空间的信息,如空间上的引用个数,如果引用个数为0,空间会被清空,而空间的回收由JVM控制,不需要手动控制。

Java中的权限控制:

public protected default private
同一个类 true true true true
同一个包 true true true false
子父类 true true false false
不同包 true false false false

Java中的内部类:
内部类一般不使用static修饰,如果这样就相当于是个外部类
内部类可以使用:public、protected、default、private修饰
如果内部类不是使用staitc修饰,则内部不能使用static修饰属性
内部类和外部类的关系就像寄生虫和宿主一样,宿主没有寄生虫也能存在,但是寄生虫一定要有宿主才能存在
内部类的访问权限和内部类定义的权限有关,即使内部类方法为public,如果类定义为private,除外部类的其他类使不能使用的。
如果要访问外部类的同名属性可以使用 : 外部类名.this.属性名 来访问
如果内部类定位为public,则除外部类,其他类也可以访问内部类,访问时需要用:外部类名.内部类名 来访问,创建时需要先创建外部类,才可以再创建内部类。
内部类可以直接访问外部类的属性和方法,但是外部类不能直接访问内部类的属性和方法。
(原因猜测:因为一对多的关系,外部类可以由多个内部类,内部类只可以有一个外部类,为了防止出现有多个内部类而找不到属性的情况,规定只能使内部类对外访问,禁止外部类对内部类的访问)

局部内部类:
内部类一般定义再某个类里,局部内部类则定义再某个方法里,只再方法里有效

在java中,使用java.lang包下面的功能是不需要导入包的,这个包自动导入

当把对象直接输出是,会调用对象的toString()方法

eclipse中可以勾选使用字段自动生成toString()方法

基本类型使用 == 比较
引用类型使用equals比较(需要重写equals,否则在内部调用的是比较引用,除了String类型)
如何重写equals?
将equals的Object参数强制转换为本类类型的参数,然后将本类中的属性一个一个取出,参数的属性也一个一个取出,使用if判读是否都相等,都相等,返回true,否则返回false。

发布了68 篇原创文章 · 获赞 12 · 访问量 5210

猜你喜欢

转载自blog.csdn.net/qq_40963076/article/details/104562314