java---static-和final

2017-01-01 10:46

static

在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”

这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:

方便在没有创建对象的情况下来进行调用(方法/变量)。

很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

static class

一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类。
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的

public class MainInStaticClass {

    static class Main{
    static void main() {
    //将主方法写到静态内部类中,从而不必为每个源文件都这种一个类似的主方法
    new MainInStaticClass().print();
    }
}

static方法

  • static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
  • 但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
  • 调用时直接类名.方法 不用在实例化  MyObject.print2();
package testP.test;

class Person {
    private static boolean name;
    protected String age;
    protected String sex;
    String how;
    public Person() {
        name = false;
    }
    static String getName() {  //静态方法
        String age1 = age; // 报错了,不是static变量
        boolean name1 = name;
    }
}

static变量

  • static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
  • static成员变量的初始化顺序按照定义的顺序进行初始化。

static代码块

  • static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
  • 注意如果有构造函数和static同时使用时,先调用static,然后调用构造函数

实例

package testP.test;

class Person {
    private static boolean name;
    protected String age;
    protected String sex;
    String how;
    Person() {
        System.out.println("Person默认构造函数");
    }
    static {
        System.out.println("Person静态代码显示框");
    }

    static String getName() {
        return  name?"真数据":"假数据";
    }
}


package testP.test;

public class son2 {
    public son2() {
        System.out.println("son2默认构造函数");
    }
    static {
        System.out.println("son2的静态代码");
    }

     public static void main(String[] args) {
         son2 s = new son2();    
        System.out.println(Person.getName());
         }  
}

结果为:
son2的静态代码
son2默认构造函数
Person静态代码显示框
假数据
  • 结果没有调用Person类里面的构造函数,因为构造函数是要在类被实例化后才会被执行

final

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。

final方法

使用final方法的原因有二:

  • 第一、把方法锁定,防止任何继承类修改它的意义和实现。
  • 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

final 类

  • final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

static和final一起

static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 对于方法,表示不可覆盖,并且可以通过类名直接访问。

http://www.cnblogs.com/dolphin0520/p/3799052.html
http://blog.163.com/fanning_7213/blog/static/24965052010731270601/