黑马程序员—this&static关键字以及单例设计模式


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

一:this关键字

1this 是用于区分成员变量和局部变量相同的情况。

2this 关键字是代表他所在函数所属对象的引用。当定义类中方法的时候,该函数内部要用到该函数的对象的时候就要this代表该对象。只要该方法要使用到本类对象的时候,都用this表示该对象。

3、它是用于调用成员变量或者成员方法。this也用于构造函数之间的相互调用。

注意点:

this 关键字只能放在构造函数的第一行。

 

this用于调用构造函数要注意一定有一个构造函数是不用this调用的,不然会出现递归的情况,程序会出错。

 

下面就通过一个例子来说明。

class Person
{
	
	private int age;
	private String name;
	
	Person(int age)
	{
		this.age=age;
	}
	Person(String name,int age)
	{
		this(age);//给p1初始化年龄
		this.name=name;
		
	}

	boolean compare(Person p)
	{
		return this.age==p.age;//this代表的是调用此函数的p1
		 /*
		 * 这边如果不加this的话用age=age 那么我们 会有疑惑到底是参数age传递给成员变量age,还是
		 * 成员变量age传递给参数age?
		 * 这时候成员变量将会被屏蔽掉,这时候如果还要用到成员变量的话就得加上this */

	}
	
}
public class thisTest 
{
		public static void main(String[] args)
		{
			 Person p =new Person(24);
			 Person p1=new Person("zhangsan",23);
			
			boolean b=p1.compare(p);
			System.out.println(b);
	
		}
	
}

二:static关键字

   1、静态成员变量或者静态函数都是属于类的,不属于某个对象,它是随着类的加载而加载,随着类的消失而消失。是优先于对象存在。它所修饰的成员变量跟函数是被所有对象所共有的。

 

2、当成员被静态修饰的时候除了可以被对象调用,还可以被类名直接调用。格式是:类名.静态成员。

 

3、实例变量与类变量的区别

1)存放位置:类变量是随着类的加载而存在方法区中,实例变量时随着对象的建立而存在在堆内存中

2)生命周期:类变量的生命周期最长,随着类的消失而消失。实例变量是随着对象的消失而消失

 

4、静态的使用注意事项

1)静态方法只能访问静态成员,不能访问非静态成员。非静态方法可以访问静态方法和非静态方法

2)静态中不可以定义thissuper关键字。因为静态是优先于对象存在的

所以静态方法有节省空间可以直接被类名调用的有点。但是访问却有局限性。

5、什么时候使用static

1)当对象出现共享数据的时候把该数据用static修饰

2)当功能内部没有访问到非静态的数据的时候可以将此功能用静态修饰。

6、静态代码块

特点:随着类的加载而执行,只执行一次。用于给类进行初始化。

  class Person
  {
  	
  	private   int age;
  	private String name;
  	static String country="cn";
  	private int x;
  	static {
  		 
  		 System.out.println("类加载进内存");//对类进行初始化
  		
  	}
  	
  	{
  		System.out.println(name+"...."+age);//给对象进行构造代码块初始化
  	}
  	Person(String name,int age)//对对象进行构造函数初始化
  	{
  		this.name=name;
  		this.age=age;
  	}
  	 void show()
  	 {
  		 System.out.println("name...."+name+"...age...."+age+"....country.."+country);
  	 }
  	 public static void print()
  	 {
  		// System.out.println(x);;//;这个是不能存在的。因为静态中不能访问非静态成员
  		 System.out.println("hahahahaha ");
  	 }
  	
  }
  public class thisTest 
  {
  		public static void main(String[] args)
  		{
  			 Person p =new Person("zhangsan",12);
  			 p.show();
  			 Person.print();//类名直接调用静态方法
  			
  		}
  	
  }

三、单例设计模式

 

解决一个类中只存在一个对象。保证对象的唯一性。所以应该在本类中自定义一个对象,禁止其他类建立该类的对象。所以可以对外提供一些方法方便其他程序访问该对象。

设计步骤:

(1)将构造函数私有化

(2)在类中建立一个本类对象

(3)提供一个方法可以获取到该对象

  public class SingleDemo {
  
  	public static void main(String[] args)
  	{
  		Single s=Single.getInstance();
  		Single s1=Single.getInstance();
  		s.setName("zhangsan");
  		System.out.println(s1.getName());//输出的是zhangsan说明s与
  		//s1指定同一个对象
  	}
  }
  class Single
  {
  	private String name;
  
  	public void setName(String name) {
  		this.name = name;
  	}
  
  	public String getName() {
  		return name;
  	}
  	private Single(){};//构造函数私有化
  //这个是先初始化对象称为饿汉式。Single类一进内存就创建好对象
  	/*private static Single s=new Single();
  	public static Single getInstance()
  	{
  		return s;
  	}*/
  
  private Single s=null;
  public static Single getInstance()
  {
  //这个称为懒汉式也叫做延迟加载。类进内存,对象还没存在。只有调用了	//getInstance才建立对象
  if(s==null)
  S=new Single();
  Return s;
  }
  	
  }

在开发的过程中一般是使用饿汉式,因为懒汉式在多线程的时候会存在安全问题。因为当多个线程都判断s==null,执行s==null后,由于为获取cup执行权,停止在new Single之前,当获取cup执行权后,所有的线程都会执行new Single(),造成对象不唯一。这时候我们就会引入同步的概念。但这时候我们也会有个疑问,同步应该加到哪里?是加到建立对象的时候呢?还是使用同步代码块。不过这两种方式效率都比较低下,所以可以选择双重判断,提高效率。当第1、2线程进入s=null,第1个线程获得锁,第2个线程被锁在外面,所以第1个线程创建s=new Single()对象。当第2个线程获取cup执行权后,s不为空,所以不执行创建对象语句。直接return s。

public static Single getInstance() {

	if(s == null) {

	synchronized (Single.class){
	if(s == null)
	s = new Single();

	}
	return s;
	}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值