在java编程过程中,会经常写到一些关键字,但是对于他们应用的方式其实一直是模仿状态,并没有很实质的去了解,为什么要这么用,导致程序不能优化,或者出现了bug不明所以,因而再详细的去重温了一下各种了解的少的或是易混淆的关键字,就像,通过一只象脚,慢慢的接触,认识到了象的各个部分,然后再从整只大象的角度去理解,系统的归纳总结,达到对全局的把握。
part A:易混淆关键字
明白这些后就可以很简单的使用某一对象的属性,最开始我在所有类的属性中都用的private关键字,之后需要调用这个类中的该属性时,均采用形参的方式,既在实例化对象时将该属性以形参的方式传递给要调用的对象,但是,若是直接使用public修饰符,则可直接在需调用的类中调用,例:
//Data类中
public String string;
public int weight;//将Data类中的属性设为public
//manager类中
Node node=new Node();
node.data.weight++;//直接在其类中调用和修改Data类实例化的对象的属性值
类中的方法大多使用public修饰也是同样的道理。修饰符决定的是能在什么范围内直接调用该属性或方法。private修饰符有其特别的用处,比如在定义权限时,不希望外界修改的属性可以考虑使用private修饰符。
part B:少用但有些场合不得不用的关键字
synchronized:在单线程程序中,这个关键字几乎没什么存在的价值,但是对于多线程程序,当一个变量在多个线程中可能存在同时被使用的情况时,这个关键字就必不可少了,否则程序将报异常。
该关键字就是一把锁,当它修饰某一个变量时则表示,该变量一次只能被一个线程使用,若还有另外一个线程需要使用该变量必须等待前一个线程使用完毕后方可。这样就能防止一个变量被同时使用导致报错。该关键字还能应用于一段代码,我在这里例举的为该关键字应用于变量的案例:
public volatile int p;
//线程1
while(true){
p--;//
}
//线程2
while(true){
p=p+3;//
}
此时程序可能抛出异常,可加上这样一句
synchronized (p){};
static:static是一个经常用到但是不容易理解的关键字,从计算机存储来说,既从他的物理地址来说,static修饰的属性或方法等是放在栈中的,如下图所示,计算机内存分为堆与栈,一般来说,对于一个变量,他的首地址存放于栈中,内容放置于堆中,通过栈中的地址来寻找,但是对于static修饰的变量来说,内容是直接存放于栈中的,并不需要去寻址。
static修饰的函数或变量使用不需要实例化,java中最常见的且必须使用static的是主函数main,我最开始一直不明白为什么main函数一调用就必须使用static,否则报错,这是因为main函数在未实例化前就必须使用,而static刚好具备这个功能,static修饰的代码在编译前就能执行。