面向对象(static、方法区、main方法、帮助文档、单例设计模式)

static关键字
静态,是一个修饰符,用于修饰成员变量,成员函数(不能修饰局部变量,函数)
new出多个对象,对象中都有值相同的country,这样会耗费内存空间,
那么,可以使用static关键字
private static country = "China";

静态成员可以被类名直接调用
类名.静态成员
 
静态成员存储的内存区域:方法区/共享区/数据区
类中定义的方法也在这个区域,类中的共享数据也在这里
 
1.静态方法只能访问静态成员(方法、变量)
如下,show方法为静态的,当打印的参数是非静态的name,是不行的
因为,name是随着对象的创建而创建的,但此时,没有创建任何对象
2.静态方法中不可以定义this,super关键字
因为静态优先于对象而存在
 
局限性:静态虽好,只能访问静态
----------------------------------------------------------------------------------
main方法
jvm在调用主函数时,传入的是new String[0];
主函数也是函数,可以被重载
 
一个类也可以调用另一个类的主函数 - -!
 
 
可以在一个类中(没有主函数)new另一个类使用
 
如果看到一个这样的调用,没有new对象就去调用,那么那个方法应该为静态的
 
可以试一试java库函数能不能new出来呢,如果不能,那么java库里面类的构造函数应该被私有化了
 
------------------------------------------------------------------------------------
帮助文档:
你创建的工程的说明书
java的说明书通过文档的注释来完成   
/**
@author 艾斯
@version V1.1 
*/
---------------------------------------------------
---------------------------------------------------------------------------
设计模式:
作者:四人帮 -  -! 偏思想,不偏代码
java总结出的23种设计模式
 
说几个典型的:
 
1.单例设计模式:一个类在内存中只存在一个对象
情景:比如eclipse平台的字体颜色设置,本页设置后,再打开一个新的,字体都是设置后的颜色
怎么弄呢:首先,要保证该类不能随便new对象,以保证只能new一个对象;
所以,将构造函数私有化
然后,要保证该类能够new出一个对象,可以再类中new一个,但是无法调用啊,因为构造函数被私有了
那么,就提供一个公有的方法返回这个对象
但是,这个公有的方法也不能调用啊,因为构造函数被私有了
所以,可以将这个公有的方法定义为static,不用new就可以调用
但是,既然公有的方法static了,那么,里面的参数s(即返回的对象)也应该定义为static啊
所以,是如下图的代码
 
并且,注意,每次通过共有方法new出来的都是同一个对象,
因为类中已经写死了,new出来的对象为s
而在main函数中定义的变量都是指向s
如图,ss,s1都指向s(且是通过方法区附地址给这两个变量的)
 
单力设计模式只需要这三步:
构造函数私有化
私有静态的类变量接收new出来的对象
共有静态的方法啊返回这个类变量
------------------------------------------------------------------
单例设计模式的另外一种写法(懒汉式),上面的方法叫(饿汉式),面试可能考
对象方法被调用的时候才初始化(对象的延迟加载)
两者的区别呢:就在内存开辟上
懒汉式,调用Single.getInstance()方法的时候,方法区内的s变量才会去堆内存开辟一块空间
而饿汉式,在这个方法调用之前,已经在对内存中开辟了空间
怎么记:懒,太懒,什么时候需要什么时候才new;
饿,太饿,先new了再说
但一般都是用饿汉式,为什么呢
因为计算机运行,同一时间只能执行一个任务;而后台执行的多个任务,
实际是计算机在多个线程之间快速的切换,所以,如果使用懒汉式,可能会出现一个问题
假如 s1,s2两个变量,当s1运行到if(s1==null)时,想成切换到了s2,if(s2 ==null)
线程切换到了s1,s1继续执行,new出来一个对象,线程切换到了s2,s2继续执行,new出了一个对象
这个,就new出了两个对象,无法保证唯一了
 
解决方法synchronized(同步)相当于上了一个锁,一次只能有一个执行
public static synchronized Single getInstance(){
    。。。
}
但是这个修饰符一加进来,效率就低了
所以,定义单例时,建议使用饿汉式
 
 
posted @ 2014-11-30 21:45  aisi_liu  阅读(352)  评论(0编辑  收藏  举报