您的位置:首页 > 其它

静态和单例:饿汉式和懒汉式.

2013-03-25 21:31 113 查看
------- android培训java培训、期待与您交流! ----------
 

static 静态:静态优先对象进内存,在方法区

 类类型:某个类的一个方法的返回类型是这个类的一个实例

1. 静态修饰的成员变量

  |-- 数据是对象共享

  |-- 类名调用       类名.静态方法()

  |-- 跟对类的加载而加载,方法区中的静态区 ,跟随类的消失而消失
  |--当类中的成员函数,都没有访问过类中的成员变量,函数使用static修饰

  |-- 静态修饰的成员变量,不属于对象,所属的是类,类变量

  |--当出现对象共享数据的时候,使用static修饰

2. 静态修饰的成员函数

  |-- 随着类的加载,而加载,方法区中的静态区

  |-- 直接被类名调用

  |-- 静态函数中,不能写this 和 super

  |-- 静态上下文中,不能引用非静态变量,静态不能访问非静态

4. 静态使用场景

  |-- 共享数据,建立定义成静态 static int 变量名大写 = 值
  |-- 当函数中,没有使用过类中的非静态成员变量时,建立将函数定义为静态

6 开发中基本不用,面试的时候基本会用

  |-- 静态代码块,定义在类中,当类加载到内存方法区中,运行一次,以后不会在运行了

  |-- 构造代码块,建立对象就运行一次

5.文档化命令:

javadoc    -d       -author  -version Demo.java
//文档化开头 directory 提取作者 提取版本 类名
//注意要编译的类必须为public


饿汉式:

/*          饿汉式
单例模式:解决对象的唯一性,保证了内存中一个对象是唯一的
解决步骤
1. 不能让你 new 对象
2. 但是,我可以自己建立自己的对象
3. 对外界提供一个方法,返回自己建立的这个对象
4. 不能用new建立对象,但是我调用类中的一个对外方法,获取到该类的对象

代码实现
1.私有化构造函数
2.自己可以访问自己的构造函数,这个对象能是匿名的吗?不能
3.提供公共函数,返回自己建立的对象  s 就OK了
4.既然不能建立对象,调用getInstance方法,但是方法可以被类名调用
*/

class Single{
private Single(){} //构造函数帮对象进行初始化
private static Single s = new Single();//private是为了不让外部类访问变量改值
//因为下面静态了,静态不能访问非静态,所以之类也要加上static
public static Single getInstance(){
//Single是类类型变量,static是为了给类调用
return s;//返回s的值
}
public void show(){
System.out.pringln("你好,我好大家好");
}
}

class SingTest{
public static void main(String[] args){
Single s  = Single.getInstance();
Single s1 = Single.getInstance();//调用类方法, 类名.方法
s.show();
s1.show();//打印输出语句
System.out.println(s);
System.out.println(s1);//打印2个返回来的地址值,看是不是同一个堆内存里的对象
}
}
懒汉式:
class Demo{
public static void main(String[] args){
System.out.println(Single.show());
}
}

class Single{
private Single(){}
private static Single s = null;//程序一加载,方法区里就有S,堆内存里就有对象了,对象的地址值就赋予了S
public static Single show(){
if (s == null){
s = new Single();
}
return s;
}
}

this比较2个字的值:

class Person{
private String name;
private int age;//建立对象的时候,就确定了姓名和年龄
//建立对象的时候,就需要给name age赋值,需要构造函数
Person(String name,int age){
this.name = name;
this.age = age;}//比较功能,自己知道自己的年龄,需要知道对方的年龄
//比较年龄,自己的知道,未知的是对方的年龄,对方的年龄,肯定定义在了对方的对象中
public boolean compare(Person p){//此对象和彼对象比较上
return this.age == p.age; //变量p1调用了compare函数,所以this.age代表p1,也可以省略不写
}
}
class ThisTest {
public static void main(String[] args) {
Person p1 = new Person("张三",20);//给构造函数传值是写在主函数新建对象后面的括号里
Person p2 = new Person("李四",10);
boolean b = p1.compare(p2);  //将p2的值赋予了compare函数
System.out.println("b="+b);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: