java学习中,static 修饰符使用、static方法、静态代码块、主函数为何如此写、单例设计模式(java 学习中的小记录)

java学习中,static 修饰符使用、static方法、静态代码块、主函数为何如此写、单例设计模式(java 学习中的小记录)

作者:王可利(Star·星星)

 

static (静态修饰符)

1.用来修饰成员变量

    成员变量被static修饰 就叫静态成员变量,如果没有修饰叫非静态成员变量。

     静态成员变量的访问方式:

            1.用对象进行访问,直接点语法拿到。如:对象名.变量名

            2.通过类名来直接访问。 如:类名.变量名

      注意:不要认为方便把所有的变量都用static修饰,只有当数据真正需要共享是才需要用static修饰。

               只有静态变量才能用类来访问,非静态变量只能用对象来访问,类是不能访问的。

静态变量和非静态变量的区别:

    1.作用上来看:

        a.静态变量是用来共享的,所有的对象都可以访问到

        b.非静态变量就是用来描述同一类事物的公共属性。

    2.数量和存储的位置上:

        a.静态变量存在静态方法区(数据共享区),并且只有一份数据。

        b.非静态变量存在堆区中,对象有N个,数据就有N个。

    3.生命周期:

        a.静态变量是在随着类文件的加载而加载,随着类文件消失而消失。

        b.非静态变量是随着对象创建而创建,随着对象的消失而消失。

2.修饰方法 

    static 修饰的方法和OC中的类方法有点相似,OC中类方法只能用类名来调用,类是不允许访问属性的。

     而java中static修饰的方法是可以用对象名来调用的,也可以用类名来调用,不过推荐使用类名调用。(这样的话就可以知道是直接知道是静态方法)。

     如: public static void study(){

                     静态方法

            }

      调用:类名.方法名();  /  对象名.方法名();

      结构上就是在普通方法 public 后面多加了一个static,用static修饰的方法是静态方法,不叫类方法。

     static 修饰的方法使用需要注意的点:

     1.静态方法可以用对象和类名调用。非静态方法只能用对象来调用。

     2.静态方法是可以访问静态成员变量的,但是不能够访问非静态的成员变量。非静态方法可以访问任何的成员变量。

        原因:有可能静态方法被调用了,但是对象还没有被创建出来,自然就没有成员变量。

     3.静态方法中可以直接访问静态方法,但是不能访问非静态方法。非静态方法是可以访问静态方法。

        原因:有可能静态方法被调用了,但是对象还没有被创建出来,又因为非静态方法只能由对象来调用,所以调用不了。

                  如果对象被创建出来,静态方法早就存在内存中了。

     4.静态方法中是不允许出现this关键字 或者 super关键字的。

        this:表示一个方法调用者对象。

 

特点:静态的数据在就存在于非静态的数据存在内存中。

 

什么时候使用static来修饰方法?

     当一个方法不需要直接访问非静态数据,这个时候就可以用static来修饰(定于工具类 如:arrays)

静态代码块

大括号{}前面加一个static就是静态代码块。

格式:

     static{

   

     }

编译java.class文件被使用的时候就执行了。使用到这个类的时候就使用了。

权限修饰符:

1.public :公共的,公开的,权限是最大的,在任何的情况下都可以调用。

2.private:私有的,权限是最小的,只能自己本类中访问。

3.protected:受保护的。

主函数为什么要这样来定义?

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

1.为什么使用 public:

    main 主方法是由jvm(java虚拟机)来调用的,jvm实际也是一个程序,所以是为了保证jvm能够在任何情况下来调用主函数。

2.为什么使用 static:

    如果没有static 这个时候调用主方法就需要通过对象来调用,jvm如果创建对象不知道该传递什么参数(如:构造方法有无参的,或者N个参数的),所以为了避免麻烦,就将方法定义成了静态的方法,这个时候就不需要考虑对象了,直接用类名就可以调用。

3.为什么返回值是void :

    main 是由jvm调用,返回值是给jvm ,jvm接收返回值是没有任何意义的,所以就不需要返回值。

4. main:

    main 不是一个关键字,没有特别的含义,因为很多语言都以main 作为函数的入口,所以main 已经约定好了的,这个就叫入口。

5.args:

   用来接收程序运行的时候传进来的参数。

    如:额外知识:

    Object-c 中遍历数组有一个是 for in 的方法,在java中 for循环增强是 foreach 方法,括号里面用的是 冒号 :不是分号;

    代码如下:

 1 public class Star_static {
 2 
 3     public static void main(String[] args) {
 4         
 5         //增强for循环, java 叫 foreach循环 这里args传的就是一个参数。
 6         for(String s : args){
 7             System.out.println(s);
 8         }
 9     }
10 } 

可以这样在Demo6 后面写参数,控制台传递参数,不过这样不方便,一般使用 Scanner会比较多。这个用的比较少。

 

单例设计模式

单例设计模式:一个类只能够创建一个对象出来,不管在哪里使用都是这个类。

软件行业中设计模式大概有23种:

可能在java学习中会讲到下面的设计模式:

1.单例设计模式

2.观察者设计模式

3.模块设计模式(mvc)

4.装饰设计模式

5.工厂设计模式

设计模式:用来解决同一个问题的解决方案。

如何实现单例设计模式?(目的:阻止别人用new来多次创建对象)

详见一下代码注释分析:

 1 class  SingleDog{
 2     
 3     String name;
 4     
 5     //阻止让别人用 new 来对次创建对象 (保证对象唯一)
 6     //private 私有方法只能在本类使用,如果使用public的话,外面的类就可以通过点语法拿到然后创建多个,就不唯一了。这样就相当于是成员变量了。
 7     private static SingleDog s = new SingleDog();
 8     
 9     //私有化构造方法,防止通过new来创建对象
10     private SingleDog(){}
11     
12     //提供一个静态的方法(不用创建对象就可以调用)来接收唯一的对象
13     public static SingleDog getInstance(){
14         return s;//返回之前new的那个对象
15     }
16 }
17 
18 public class Star_dlsjmm {
19 
20     public static void main(String[] args) {
21         SingleDog star1 = SingleDog.getInstance();//调用类中无参数的构造方法
22         star1.name = "星星";
23         SingleDog star2 = SingleDog.getInstance();
24         SingleDog star3 = SingleDog.getInstance();    
25         //如果打印的结果 star2 ,star3    不是空的 就是单例了
26         System.out.println(star1.name);
27         System.out.println(star2.name);
28         System.out.println(star3.name);
29     }
30 }

经过测试发现,单例设计模式是成功的。打印的三个对象都一样,没有出现null。

总结:

    饿汉单例设计模式:

      步骤:

         1.定义一个私有的静态成员变量来引用对象(私有的静态对象),设置对象唯一。

         2.私有化构造方法,防止new对象。

         3.创建一个公开的静态方法,返回上面的对象。

    懒汉单例设计模式(要用的时候才创建对象):

      步骤:

          1.定于一个私有的静态成员变量,不要赋值。

          2.私有化构造方法,防止new对象。

          3.创建一个公开的静态方法,判断是否存在对象,如果不存在就创建一个,如果存在就直接返回。

posted @ 2016-12-01 17:07  王可利(Star·星星)  阅读(4150)  评论(0编辑  收藏  举报