现在的位置: 首页 > 综合 > 正文

java、静态代码块、static和单列设计模式

2018年05月06日 ⁄ 综合 ⁄ 共 2574字 ⁄ 字号 评论关闭

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

一:static关键字

 (1)静态的意思。可以修饰类的成员(成员变量和成员方法);
 (2)静态成员的特点:
  A:随着类的加载而加载,生命周期最长。
  B:优先于对象存在。
  C:被所有的对象所共享。
  D:比非静态成员多了一种访问方式。可以通过类名直接调用。而且建议这样做。
 (3)什么时候需要使用static修饰呢?
  当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。
  简单说:共性用static修饰,特性不用static修饰。(饮水机和水杯。)
 (4)注意事项
  A:静态方法只能访问静态成员的。
  B:静态方法中不能使用this,super关键字。
  C:main是静态的。
   **格式如下:

public static void main(String[] args)
   {
}

     ***由于它被jvm调用,所以权限要足够大,所以用public权限修饰符。
     ***为了jvm可以不用创建对象直接调用它,所以用static修饰。
     ***void jvm不需要任何返回。但是方法体结尾默认有return;
     ***main jvm只认识这个名字。
     ***String[] 有可能需要传入参数。
     ***args 字符串数组的名字,为了方便使用。
 (5)静态代码块
   类中加载流程?
   静态代码块--构造代码块--构造方法。

实例:

class Dog
{
 static
 {
    System.out.println("a");//第四步
 }
}
class MainDemo
{
 static
 {
  System.out.println("b");//第一步
 }
 public static void main(String[] args)
 {
  System.out.println("c");//第三步
  Dog d = new Dog();
  Dog d1 = new Dog();
  System.out.println("d");//第五步
 }
 static
 {
   System.out.println("e");//第二步
 }
}

结果为:// b e c a d

注意:静态代码块:类中加载流程?
      -- 静态代码块--构造代码块--构造方法。--

二:静态的应用
      工具类ArrayTool
   因为使用的都是class文件。所以你应该先编译ArrayTool,然后在编译ArrayTest,最后执行ArrayTest。但是如果引用的工具类特别多的情况下,这样就很麻烦,所以java提供好的方式:只编译ArrayTest即可。(其实它首先在classpath下找ArrayTool.class,如果没有,接下来在当前类下找ArrayTool.class文件。 如果还没有,它就会找ArrayTool.java文件,并且进行编译。如果都没有,就报错。) 制作工具说明书:代码中有文档注释,用javadoc解析。
        javadoc -d arrayTool -author -version ArrayTool.java
                  -d 后面跟目录
                   ArrayTool.java 源代码文件

                   javadoc: 错误 - 找不到可以文档化的公共或受保护的类。
                  改用public修饰一下即可

三:设计模式

       java中有23种设计。

单例设计模式:保证类在内存中只有一个对象。
 如果保证类在内存中只有一个对象呢?

    (1)控制类的创建,不让外部类来创建类的对象。private
    (2)在本类中定义一个本来的对象。Student s;
    (3)提供公共的访问方式。

public static Student getInstance()
                      {return s}

单例写法两种:
(1)饿汉式 开发一般用这种方式,因为它的线程安全。

class SingleDemo {
 // 私有化构造函数,让外界无法new新的对象
 private SingleDemo() {}

 // 创建自己类的对象
 private static SingleDemo s = null;

 // 创建一个函数
 public void show() {
  System.out.println("这是饿汉式");
 }

 // 对外定义一个访问的的方法,返回一个对象
 public static SingleDemo getSingle()

   { return s; }

public class Single {

 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  SingleDemo s1 = SingleDemo.getSingle();
  s1.show();
 }

}

(2)懒汉式:这种方式具有线程安全问题,延迟加载

package cn.itcast;


class SingleDemo {
// 私有化构造函数,让外界无法new新的对象
private SingleDemo() {}

// 创建自己类的对象
private static SingleDemo s = null;

// 创建一个函数
public void show() {
System.out.println("这是懒汉式");
}

// 对外定义一个访问的的方法,返回一个对象
public static SingleDemo getSingle() {
if (s == null) {   //cpu在做快速的切换,当执行到此处,进行判断的过程中,切换又判断,这样就会造成线程不安全
return s = new SingleDemo();// 如果不将new的对象赋给S,这样就变成了2个对象
} else {
return s;// 返回类类型对象
}
}

public class Single {


public static void main(String[] args) {
// TODO Auto-generated method stub
SingleDemo s1 = SingleDemo.getSingle();
s1.show();
}

}

 

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

抱歉!评论已关闭.