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.创建一个公开的静态方法,判断是否存在对象,如果不存在就创建一个,如果存在就直接返回。