java和php中static+final+synchronized 总结
Static
一句话:方便在没有创建对象的情况下来进行调用(方法/变量)。句
静态属于类,非静态属于对象。
另外记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。
static方法:
1、静态方法没有this。
因为它不依附于任何对象就可以进行访问,既然都没有对象,就谈不上this了。
2、静态方法中不能访问类的非静态成员变量和非静态成员方法。
静态方法不属于对象,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用
static不可以调 非静态的,但 非静态的可以调用 静态的。
static变量:
静态变量和非静态变量的区别:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static代码快:
static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。但尼玛,php中可以,修饰function中的局部变量
Final:
实际上,所有的private function(),都是隐式的final。即子类都不可调用覆盖。
final变量: 不可修改。
final方法:在继承中使用该方法不会被覆盖。
final类:当将类定义为final时,不准继承。即,出于某种考虑,你对该类的设计永不需要做任何变动,或者出于安全的考虑,你不希望他有子类。
Synchronized: //实现多线程顺序执行
用来修饰function,使得多线程顺序执行该函数,而不是同时执行。
Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法。
======================================================================================
php中static 全局静态 和 局部静态
1、局部静态:
function 中 声明static变量,虽然不常见,但也有面试题碰到,记住:function中的static变量,属于function,出了function无效,但它一直驻留在内存,再次进入function,static变量仍然有效。可以用来检测function被调用的次数。 //一次加载,驻留内存
$count = 5; function get(){ static $count = 0; //java中,static不可修饰局部变量,php中可以. return $count ++; } echo get(); //0 echo $count; //5 ++$count; echo get(); //1 echo $count; //6 输出是:0 5 1 6
2、全局静态:
同样,静态属于类,非静态属于对象。对于 static var = 0; 调用 本类中用:self::var,子类中parent::var,其他类中:Class_name::var.
也是一次加载,驻留内存。
php中final
1、final不能修饰成员属性。
2、final只能修饰类和方法。
作用:被修饰的类不能被子类继承,被修饰的方法不能被子类覆盖。
php中const
1、常量不可以被修改
const var = “const string”; //class A中
A::var //A类外调用
self::var //A类内调用
相关链接:
http://www.cnblogs.com/dolphin0520/p/3799052.html //讲static比较好
http://blog.csdn.net/niguang09/article/details/6035813 //final
http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html //synchronized
http://www.cnblogs.com/xuehong1985/articles/1220954.html //讲php5的新特性
2、解构技能,找出实现80%效果的那20%
3、不要一心二用
4、练习练习再练习!然后获得即时反馈
5、坚持,不要在低谷期放弃