Java学习笔记一

时间:2021-10-05 11:28:36

因为之前一直在学习C++,所以对于面向对象还是学的比较好,只是把我觉得的地方记录下来,以后可以拿来复习复习。

Java文件的命名有个规则要必须知道
通常的情况下,Java程序文件的文件名是可以任意的。但是有一种情况例外:如果Java程序源代码里定义了一个public类,那么这个文件的文件名就必须与public类的类名相同。由于Java文件的文件名要与该文件里的public类的类名一致,所以一个文件里的public类也就只能有一个了

对于Java的垃圾回收机制这个也是我刚开始接触Java非常喜欢的一个东西,因为之前在做c++的时候,内存的回收都要是程序员自己进行解决,虽然现在c++中已经有了智能指针,但是我确实还没怎么用过,但是已经上班的学长们说智能指针貌似有时候还有些问题。
对于Java的垃圾回收都是JRE在后台自动进行的,JRE会负责回收不再使用的内存。通常是JRE会提供一条超级线程来进行检测和控制,一般都是CPU空闲的时候或者内存不足才会进行回收,也就是说内存何时回收,程序员是无法确定的

在Java中,什么样的内存算是垃圾呢?就是没有 对象引用 指向原先非配给这个引用的 内存的时候,这个内存就是垃圾了。
虽然这样很方便,但是这样会影响程序的性能,毕竟Java虚拟机要跟踪程序中的对象,才能确定哪些内存是可以回收的。

这里注意,垃圾回收的是无用对象的内存空间!,这些内存空间都是JVM**堆内存**里的内存空间,只能回收内存,对于物理资源比如数据库连接,磁盘IO什么的就不行了。为了能够更快的回收内存,可以通过是引用设置为null。

对于Java的强制转换,这里有一个在以前确实没接触过,就是

System.out.println(3+4+"hello");

这句话我以为会出问题,结果输出 7hello 这就是说3+4的结果是7 由于后面是String类型,所以int类型的7 就转换成了String类型了

关于位操作符,有要说的:
首先是左移操作符<< 这个操作符没什么,就是正常的移位,空出来的位置补零
但是右移就不一样了,右移分两种>>,>>>这两种中 >> 是说空出来的位置补符号位,正数就是补零了,负数就是补1了,但是>>>右移的时候就是补零,就不会区分正负数了。

说下关于缓存的问题,这个跟c++里面一样的,

        String p1 = new Strin("hello");
String p2 = new Strin("hello");
System.out.println(p1 == p2);//输出结果为false

String t1 = "hello";
String t2 = "hello";
System.out.println(t1 == t2);//输出结果为true

这种结果就是p1,p2是引用的两个不同的内存,而t1,t2引用的是相同的内存。
这里要注意,对于引用来说,符号“ == ”的意思是判断两个引用是否引用的是否是同一个对象,而不是判断两个对象的内容是否一样

对于Java来说,对于基本数据类型来说,他们是正常的值传递,而对于复杂点的就是引用类型了,比如数组,就是一个引用类型了,所以下面的程序的结果:

public class Test
{
static void func(int[] a)
{
a[0] = 9;
}

static void tes(int a)
{
a = 9;
}

public static void main(String[] args)
{
int[] a = {1,2,3};

func(a);

for(int t : a)
{
System.out.println(t);//数组的值被改变了
}

int b = 0;
tes(b);
System.out.println(b);//值没有改变
}
}

现在Java还有一种循环的方式就是foreach循环方式

        for(type variableName : array | collection)
{
//variableName自动迭代访问每个元素
}

例如:

        String[] books = {"hello", "world", "hey"};
for(String tmp : books)
{
//会自动输出books中的三个字符串
System.out.println(book);
}