先说一下static可以修什么
1、类
2、变量
3、方法
4、静态代码块类:
先说一下static修饰类,一般的类是不许用静态来修饰的,有一种情况叫做静态内部类,关于这个可以看我上一篇文章,哪里有介绍。
变量:修饰边变量的时候又叫做全局变量,这样的变量虽然在类内部,但是它并不输入某一个对象。使用方法直接使用类名
public class Father {
public String name;
public static String sex;
}
Father.sex = "男";
Father.Name = "张三";//错误
Father father = new Father();
father.name = "张三";
public class Son extends Father {
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
}
}
father.sex = "女";//警告
从我的注释可以看出来,name不是静态变量,所以直接用类名.变量名会报错
还要提示一点如果一个变量用static修饰,你还用对象对调用可以,但是java会提示一个警告错误,java认为这样的编写不是好的习惯,会让人产生误解,所以会提示警告。
在一些配置文件的变量中常用静态变量。
方法:
静态修饰方式时是不能够被子类重写的。下面看一个例子:
public class Father {
public String name;
public static String sex;
public static void eat()
{
System.out.println("eating。。。。。");
}
}
public class Son extends Father {
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();//错误
}
}
提示错误信息是:
Multiple markers at this line
- This instance method cannot override the static method from Father
- The method eat() of type Son must override or implement a supertype method
- overrides com.example.bb.Father.eat
静态方法不能被重写
在android程序设计第二版46页提到,现在的java中几乎没有必要再使用静态方法,早期的的动态方法要慢于静态方法,所以常常人们用静态方法来优化代码,
但是现在编译在Dalvik环境下,已经不需要这样的优化了,所以过多的使用静态方法会使架构设计不良。
静态模块:
先来简单的接受一下生么叫代码块
简单的理解由{.....}两个中括号包裹起来的就叫做代码块,这样的代码块如果用static修饰就变成了静态代码块。
下面先看一个例子我们通过例子来理解一下静态代码块作用。
public class Father {
{
System.out.println("Father 代码块");
}
static {
System.out.println("Father 静态代码块");
}
public Father()
{
System.out.println("Father 构造方法");
}
}
public class Son extends Father{
{
System.out.println("Son 代码块");
}
static {
System.out.println("Son 静态代码块");
}
public Son()
{
System.out.println("Son构造方法");
}
}
调用测试方法:
public static void main(String[] args) {
new Son();
new Son();
}
运行结果:
Father 静态代码块
Son 静态代码块
Father 代码块
Father 构造方法
Son 代码块
Son构造方法
Father 代码块
Father 构造方法
Son 代码块
Son构造方法
我来解释一下
执行顺序是
第一次执行new Son();
父类静态代码块(只执行一次)---->子类静态代码块(只执行一次)---->父类代码块---->父类构造函数---->子类代码块---->子类构造方法
第二次执行new Son();
父类代码块---->父类构造函数---->子类代码块---->子类构造方法
从代码上分析
静态代码块不属于对象,会在程序new 新对象前执行并且只执行一次。
代码块会比构造方法先执行,并且每次new新的对象都会执行一次。
静态代码块主要就是在加载的时候执行,而且只执行一次,有唯一性。
好啦,关于static就说道这里了,欢迎大家批评指正