黑马程序员技术交流社区
标题:
谁能通俗的讲解一下java 静态的应用,和单例设计模式!
[打印本页]
作者:
飞一样
时间:
2013-12-29 21:24
标题:
谁能通俗的讲解一下java 静态的应用,和单例设计模式!
为什么看视频觉得讲的很乱,脑袋里没有印象,谁能通俗的讲一下?还有static有什么用?
作者:
chinese
时间:
2013-12-29 21:43
static关键字:
特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用
使用注意:
静态方法只能访问静态成员
但是非静态成员可以访问静态成员;
静态方法中不可以使用this,super关键字
主方法(main)是静态的
public static void main(String[] agrs){}
作者:
由然自美
时间:
2013-12-29 21:44
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
作者:
kun1990
时间:
2013-12-30 00:28
人饮水,需要饮水机,而人有很多,不可能都有一台饮水机,所以饮水机是被共享的,而static也是同样的道理,它是被所有的当前类的对象所共享的
作者:
刘旭升
时间:
2013-12-30 08:54
本帖最后由 刘旭升 于 2013-12-30 08:55 编辑
前面的人帮你多层次的说了STATIC,我就说下单例模式。
单例模式
:解析一下字面,单-->一,独一,仅。 例-->在Java就是单例的意思,也成为对象。
单例模式-->只有一个对象的模式。对象作用就是调用创建该对象类中的成员变量和方法的。
(这个可能罗嗦了,但是你必须要在 名词 和 Java实意 之间建立一种联系,不然别人问你什么是单例,你就会反映不过来,虽然你也知道什么 昨天听松老师讲反射,他说反射和汉语含义没什么关系,这时真的很需要自己建立联系,有的同学没在意过但是记得也很好,其实那是因为他大脑默认建立过了联系(就是习惯)这点自己回想一下就晓得了--->我的小结)
单例作用:避免使用者建立对象来使用功能。
所以1、需要单例自己来建立一个私有的对象,
然后2、建立一个共有方法 目的返回本类对象
(返回的是引用,我自己理解为虎符,谁拥有虎符谁就可以调兵遣将,哪个对象有引用哪个对象就可以实用方法和成员变量)。
private single(){} //②私有构造函数,使得类外不可用该类创建对象。
private static Single s=new Single(); //①私有并静态的本类对象
public static single getInstance(){
return s;
} //③建立一个公有且静态的返回本类对象的方法。
结合毕老师的代码,你在仔细看看,思考思考。
作者:
浮出一个美
时间:
2013-12-30 17:43
楼上都说的很清楚了,我只能给你一段代码和注释,自己好好琢磨
public class Test6 {
//声明一个静态实例变量,赋初值为空
private static Test6 test6 = null;
//私有化构造函数,让其他类不能实例化该类,实现单例
private Test6(){
}
//返回唯一实例,如果实例不存在则初始化,否则返回已经存在的实例
//同步该方法,避免一个线程进了if(test6==null)判断条件,资源马上被回收,
//又由另一个线程执行,又进了if(test6==null),这样则会创建多个实例。
public static Test6 getInstance(){
synchronized (Test6.class) {
if(test6==null){
test6 = new Test6();
}
}
return test6;
}
}
复制代码
作者:
范晓冲
时间:
2013-12-30 23:57
public class StaticModifier{ //static 修饰的属性称为静态属性 static int i=10; int j=20; //static 修饰的方法称为静态方法 public static int add(int a,int b){ return a+b; } public int add2(int a,int b) { return a+b; } public static void main(String args[]){ //访问静态方法和属性时,不用产生一个新的对象,直接通过类名就可以调用了。 System.out.println("静态属性的值为=="+StaticModifier.i); //结果是 20 System.out.println("静态方法的返回值是=="+StaticModifier.add(5,6)); //结果是11 //访问非静态的属性和方法时,需要先new一个新的对象出来,通过对象来调用。 StaticModifier sm=new StaticModifier(); System.out.println("成员变量的值为:"+sm.j); //结果也是 20 System.out.println("非静态方法的返回值是:"+sm.add2(5,6)); //结果也是11, } }
作者:
范晓冲
时间:
2013-12-30 23:58
public class StaticModifier{
//static 修饰的属性称为静态属性
static int i=10;
int j=20;
//static 修饰的方法称为静态方法
public static int add(int a,int b){
return a+b;
}
public int add2(int a,int b) {
return a+b;
}
public static void main(String args[]){
//访问静态方法和属性时,不用产生一个新的对象,直接通过类名就可以调用了。
System.out.println("静态属性的值为=="+StaticModifier.i); //结果是 20
System.out.println("静态方法的返回值是=="+StaticModifier.add(5,6)); //结果是11
//访问非静态的属性和方法时,需要先new一个新的对象出来,通过对象来调用。
StaticModifier sm=new StaticModifier();
System.out.println("成员变量的值为:"+sm.j); //结果也是 20
System.out.println("非静态方法的返回值是:"+sm.add2(5,6)); //结果也是11,
}
}
作者:
Zenith
时间:
2013-12-31 00:05
简单的说下我的理解 希望对你理解有些许帮助.首先,Static 是静态的意思.是当所有方法共享一个属性时,将该属性定义为static后则每创建对象就可以享有.例如你创建一个Person类中定义了3个Student对象,那么每个对象有自己的特有属性,也有共有属性,学生都有国籍 那么当我们把学生定义国籍时就把这个属性抽取出来,然后再输出student.country时.就会自动显示 .
作者:
Zenith
时间:
2013-12-31 00:09
我还没说完 按下Enter 就挂了
当static修饰方法时,方法既可以用对象调用,又可以用类型调用.
静态优先于对象存在
静态只能访问静态
这些你自己去写个代码验证下就明白了 看别人的总结 记住了也会忘记 自己敲出来的总结 想忘也会有点痕迹的 勤练 共勉
作者:
净坛使者
时间:
2013-12-31 19:41
初始化,比起构造方法他更方便,能在里面像一般写程序那样书写你想利用或表达的逻辑,比如,一般情况下构造方法里你是不能调用一般非静态类的方法的,而静态代码块里可以持有某一类的引用而使用一般的方法,这样大大简化了代码,而又起到了初始化的效果。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2