黑马程序员——唯一性

来源:互联网 发布:数控加工中心编程软件 编辑:程序博客网 时间:2024/05/17 01:12
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在学习过程中发现有很多方法可以使得资源唯一,总结一下

1,使用静态

静态的特点:优先于对象存在,被所有对象所共享。

示例:

public class Ap{  static int i=47;  public void call()  {      System.out.println("调用call()方法");    for(i=0;i<5;i++)      {                System.out.print(i+" ");       if(i==4)         {             System.out.println("\n");         }      }  }   public Ap(){}  public static void main(String[] args)  {    Ap a1=new Ap();    Ap a2=new Ap();    a2.i=60;    System.out.println("第一个实例对象调用变量i的结果:"+a1.i);    a1.call();    System.out.println("第二个实例对象调用变量i的结果:"+a2.i);    a2.call();  }}

运行结果:


从运行的结果可以看出a1和a2这两个对象调用的i都是同一个,原因是i是被静态所修饰的,使得被对象所共享。

2,单例设计模式

单例设计模式其实就是解决一个类在内存中只有一个对象。

这里就演示一下懒汉式。

class TestStream {     private String name;     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }      //该类只能有一个实例     private TestStream(){}    //私有无参构造方法     //该类必须自行创建     private static TestStream ts=null;     //这个类必须自动向整个系统提供这个实例对象     public static TestStream getTest(){         if(ts==null){             ts=new TestStream();         }         return ts;     }     public void getInfo(){         System.out.println("output message "+name);     } }public class TestMain {     public static void main(String [] args){         TestStream s=TestStream.getTest();         s.setName("Java");         System.out.println(s.getName());         TestStream s1=TestStream.getTest();         s1.setName("Java");         System.out.println(s1.getName());         s.getInfo();         s1.getInfo();         if(s==s1){             System.out.println("创建的是同一个实例");         }else if(s!=s1){             System.out.println("创建的不是同一个实例");         }else{             System.out.println("application error");         }     } }
运行结果:



3,构造函数

下面是一个多线程通信中的示例

class Res{String name;String sex;boolean flag;}class Input implements Runnable{private Res r;Input(Res r)    {    this.r = r;}    public void run()    {   int x=0;       while(true)   {     synchronized(r)  {   if(r.flag)   try{r.wait();}catch(Exception e){}       if(x==0)       {             r.name="jake";         r.sex = "man";           }      else   {       r.name="李丽";       r.sex= "女女女";   }   x = (x+1)%2;   r.flag = true;   r.notify(); }   }   }}class Output implements Runnable{    private Res r;Output(Res r){     this.r = r;}    public void run()    {  while(true)  {  synchronized(r)  {  if(!r.flag) try{r.wait();}catch(Exception e){}             System.out.println(r.name+"....."+r.sex); r.flag = false; r.notify();  }      }}}class  InputOutDemo{public static void main(String[] args) {Res r = new Res();Input i = new Input(r);Output o = new Output(r);    Thread t1 = new Thread(i);Thread t2 = new Thread(o);t1.start();t2.start();}}

上面的例子保证了Input和Output中使用的Res是同一个



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击