Java基础知识

来源:互联网 发布:python bloom filter 编辑:程序博客网 时间:2024/06/10 04:50

这篇文章是最初学习Java时做的笔记,不想丢掉,就当做学习记录吧,都是些零散知识点。
1、对于局部变量必须初始化,否则一旦在后面使用它则会出错,但对于类的数据成员则没有此要求,会有默认值。
2、JVM的垃圾回收机制由一条后台线程完成,他本身也是非常消耗性能的,若内存由垃圾回收机制完成,则会:
不断分配内存使得可用内存大量减少,从而降低程序运行性能;
大量的回收使得垃圾回收的负担加重,降低程序的运行性能
3、类变量(static变量)的初始化时机总是先于实例变量(非static变量)之前,所以实例变量可以在未定义类变量之前使用类变量
比如:
public class example
{
int num1=num2+1;
static int num2=0;
} 不会有错
static变量与方法既可以用类名访问,也可以用实例对象访问
static方法只能调用static变量与方法,不能调用非静态变量和方法,反过来则可以
4、当创建任何java对象时,程序总会依次调用每个父类非静态初始化块、父类构造器执行初始化,最后才调用本类的非静态初始化块、构造器执行初始化
super用于显示调用父类构造器,this用于显示调用本类中另一个重载的构造器,两者的调用只能在构造器中使用,且在代码第一行,因此构造器中的 super调用和this调用只能使用其中之一,而且最多只能使用一次。
构造器只是负责对java对象实例变量执行初始化, 在执行构造器代码之前,对象所占内存已经由new关键字申请并被分配下来,内存里的值默认是空值
如果子类重写了父类的方法,则子类彻底覆盖该方法;对于实例变量则不会;
当子类无权访问父类的方法时(比如方法前使用private等等),即使子类写了一个和父类相同的方法,也不会覆盖父类方法,而只是一个普通方法。
对于一个引用类型的变量而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明时该变量的类型;
当通过该变量访问它所引用的对象的方 法时,该方法行为取决于它所实际引用的对象的类型
5、 final可以修饰变量,被赋初值之后,不能对它重新赋值;
final可以修饰方法,该方法不能被重写
final可以修饰类,该类不能派生子类
在任何内部类中访问的局部变量都必须使用final修饰
6、内存管理小技巧:
a.尽量使用直接量,当需要使用字符串,还有Byte、short、integer等等包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建他们
b.使用StringBuilder和StringBuffer进行字符串拼接,若使用多个String对象进行字符串连接运算,在运行时将生成大量临时字符串,它们保存在内存中,从而导致程序性能下降
c.尽量少使用静态变量
d.避免在经常调用的方法、循环中创建java对象
7、基本类型转换图
8、java语言规定,for while do循环中的重复执行语句不能是一条单独的局部变量定义语句,如果程序要使用循环来定义局部变量,则该
局部变量定义语句必须放在花括号内才有效。
for(int i=0;i<10;i++)
int a;
该语句则有错,必须加花括号
9、String s=null;
s instanceof string为false;
instanceof运算符除了可以保证某个引用变量时特定类型的实例外,还可以保证该变量没有引用一个null,这样就可以将该引用变量转型为该类型,并调用该类型的方法,而不用担心会引发ClassCastException错误
10、java的重载解析过程分为以下两个阶段:首先选取所有可获得并且匹配调用的方法或者构造器,然后确定调用哪个方法,选出最精确的哪个方法,某个方法的形参要求参数范围越小,则该方法越精确。
11、非静态内部类不能拥有静态成员,当程序需要使用内部类时,应尽量使用静态内部类,因为当使用静态内部类时,外部类相当于静态内部类的一个包,而且静态内部类不能访问外部类的非静态成员变量。
12、基本类型存储了实际的值,而并非指向一个对象的引用,在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方,但是在为对象赋值的时候,操作的是对象的引用,他们会指向同一块区域。当形参是一个对象时,他的值也有可能发生变化。
13、==和!= 比较的是对象的引用,自己定义的类的equal的默认行为也是比较引用,要想比较实际内容需要自己重新定义,而系统类(如Integer) 已经实现了equal的方法重写
14、访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(无关键字)、和private
15、每一个非基本类型的对象都有一个toString 的方法,而且当编译器需要一个String而你却只有一个对象时,该方法便会被调用。
16、java 中除了 8个基本的数据类型(char short int long float double boolean byte )以外,其余的全都是引用类型 ( 类.接口.数组 )
占用的字节数分别为: 2 2 4 8 4 8 1 1
17、不同于c,if的条件里可以为整型变量,非零为true,0为false, java里面则只能是布尔型
18、接口与抽象类的区别:
接口中的方法都是抽象方法,而抽象类则不一定
接口可以多继承,而抽象类则不行
接口中基本数据类型为static 而抽类象不是的
19、几种引用类型
a.强引用
如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

b.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

c.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。

d.虚引用(PhantomReference)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解
被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
20、ArrayList和数组间的相互转换 List list = Arrays.asList(“王利虎”,”张三”,”李四”);
HashSet 存储键,通过add添加元素,元素无序,不按添加元素的顺序显示,而且元素不重复,不然会覆盖以前的值。
HashMap存储键值对,通过Put添加元素,由get方法提取键对应的值,同样要求元素不重复,不然会覆盖以前的值。
ArrayList 存储值,通过add添加元素,元素有序,按添加元素的顺序显示,而且元素可以重复。

0 0
原创粉丝点击