java中static关键字的用法
2015-09-29 17:14
543 查看
《Think in Java》中有关于static的解释:static方法就是没有this关键字的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
为什么说static方法就是没有this关键字的方法?
因为this指的是当前对象,当类加载进内存时this所指对象还没产生,而static修饰 的内容一起被加载了。既然static加载时this所指对象不存在,那this就没有任何意义。
static关键字的用法:
1.声明static属性
如果希望一个属性被所有对象所 共同拥有,则将其声明为static类型,声明成static类型的属性和方法之后此属性、方法称之为类属性、类方法,可由类名称直接调用
城市:北京 姓名:Jack 年龄:30
城市:北京 姓名:Rose 年龄:25
----通过p1修改static country属性之后----
城市:哈尔滨 姓名:Jack 年龄:30
城市:哈尔滨 姓名:Rose 年龄:25
每个对象都拥有各自的堆栈空间,堆内存保存的各自的属性,但是所有的static属性是保存在全局数据区的,所有对象指向全局数据区的一个内容,所以当p1对象修改coutry之后,p2调用country也会发生变化。
但实际上一般是通过类名直接调用static属性,即采用“类名称.属性”,所以这里用 Person.country = "哈尔滨"; 更合适
2.声明static方法
如果一个方法使用了static关键字声明,则此方法 可以直接使用类名称调用。
3.声明static代码块
静态代码块:直接使用static关键字声明的代码块就是静态代码块
输出结果:
在主方法所在类中声明的静态代码块
静态代码块
构造块
构造方法
构造块
构造方法
构造块
构造方法
可见,主方法所在类中静态代码块优先于主方法执行,普通类中静态代码块优先于构造块执行,构造块优先于构造方法执行,并且无论实例化多少对象,静态代码块只执行一次构造块会执行多次。静态代码块的主要功能就是静态属性初始化。
4.声明static内部类
要想在其他类中访问内部类,此时可以使用static声明此内部类
我们看一下下面两段程序的区别:
程序一:
程序一正确,程序二错误。程序二要想通过其他类访问内部类的方法必须用static声明内部类才行,即:
为什么说static方法就是没有this关键字的方法?
因为this指的是当前对象,当类加载进内存时this所指对象还没产生,而static修饰 的内容一起被加载了。既然static加载时this所指对象不存在,那this就没有任何意义。
static关键字的用法:
1.声明static属性
如果希望一个属性被所有对象所 共同拥有,则将其声明为static类型,声明成static类型的属性和方法之后此属性、方法称之为类属性、类方法,可由类名称直接调用
class Person{ String name; int age; static String country = "北京"; public Person(String name,int age){ this.name = name; this.age = age; } public void print(){ System.out.println("城市:"+country+" 姓名:"+name+" 年龄:"+age); } } public class StaticDemo01{ public static void main(String[] args){ Person p1 = new Person("Jack",30); Person p2 = new Person("Rose",25); p1.print(); p2.print(); //通过p1修改static属性 System.out.println("----通过p1修改static country属性之后----"); p1.country = "哈尔滨"; p1.print(); p2.print(); } }输出结果:
城市:北京 姓名:Jack 年龄:30
城市:北京 姓名:Rose 年龄:25
----通过p1修改static country属性之后----
城市:哈尔滨 姓名:Jack 年龄:30
城市:哈尔滨 姓名:Rose 年龄:25
每个对象都拥有各自的堆栈空间,堆内存保存的各自的属性,但是所有的static属性是保存在全局数据区的,所有对象指向全局数据区的一个内容,所以当p1对象修改coutry之后,p2调用country也会发生变化。
但实际上一般是通过类名直接调用static属性,即采用“类名称.属性”,所以这里用 Person.country = "哈尔滨"; 更合适
2.声明static方法
如果一个方法使用了static关键字声明,则此方法 可以直接使用类名称调用。
class Person{ String name; int age; private static String country = "北京";//对country属性进行封装 public static void setCountry(String c){ country = c; } public Person(String name,int age){ this.name = name; this.age = age; } public void print(){ System.out.println("城市:"+country+" 姓名:"+name+" 年龄:"+age); } } public class StaticDemo02{ public static void main(String[] args){ Person p1 = new Person("Jack",30); Person p2 = new Person("Rose",25); p1.print(); p2.print(); System.out.println("----通过调用static方法修改之后----"); Person.setCountry("哈尔滨"); p1.print(); p2.print(); } }特别注意的是:使用static方法,不能调用非static属性和方法,因为static方法或属性可以在对象还没实例化时就可以调用了。所以要想在不创建对象的情况下调用某个方法,就可以将这个方法设为static。这里也就能说明为什么main()方法为什么是static的了,因为在执行main()时没有 创建任何对象。
3.声明static代码块
静态代码块:直接使用static关键字声明的代码块就是静态代码块
class Demo{ {//构造块 System.out.println("构造块"); } static{//在普通类中声明静态代码块 System.out.println("静态代码块"); } public Demo(){ System.out.println("构造方法"); } } public class StaticDemo03{ static{ System.out.println("在主方法所在类中声明的静态代码块"); } public static void main(String[] args){ new Demo(); new Demo(); new Demo(); } }
输出结果:
在主方法所在类中声明的静态代码块
静态代码块
构造块
构造方法
构造块
构造方法
构造块
构造方法
可见,主方法所在类中静态代码块优先于主方法执行,普通类中静态代码块优先于构造块执行,构造块优先于构造方法执行,并且无论实例化多少对象,静态代码块只执行一次构造块会执行多次。静态代码块的主要功能就是静态属性初始化。
4.声明static内部类
要想在其他类中访问内部类,此时可以使用static声明此内部类
我们看一下下面两段程序的区别:
程序一:
class Outer{ private String info = "hello world"; class Inner{ public void print(){ System.out.println(info);//内部类获取外部类私有属性 } } public void fun(){ new Inner().print();//实例化内部类对象,并调用内部类方法 } } public class StaticDemo04{ public static void main(String[] args){ new Outer().fun();//实例化外部类对象,调用外部类的fun()方法 } }程序二:
class Outer{ private String info = "hello world"; class Inner{ public void print(){ System.out.println(info);//内部类获取外部类私有属性 } } } public class StaticDemo04{ public static void main(String[] args){ new Outer.Inner().print(); } }
程序一正确,程序二错误。程序二要想通过其他类访问内部类的方法必须用static声明内部类才行,即:
class Outer{ private static String info = "hello world"; static class Inner{ public void print(){ System.out.println(info);//内部类获取外部类私有属性 } } } public class StaticDemo04{ public static void main(String[] args){ new Outer.Inner().print(); } }可以这样理解,如果一个内部类使用static关键字声明,则此内部类可以看成一个外部类,或者看成一个独立的类,可以直接通过外部类.内部类进行访问,但是如果要想访问外部类的属性,则此属性也必须声明成static。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树