我的重学java计划第一节——static

来源:互联网 发布:php pos系统 编辑:程序博客网 时间:2024/04/30 20:36

文章是拼凑而来的,没有脸写原创,写个转载好了

1、引言
问题一,static的用法
问题二,输出以下代码结果
class HelloA {    public HelloA() {        System.out.println("HelloA");    }        { System.out.println("I'm A class"); }        static { System.out.println("static A"); }}public class HelloB extends HelloA {    public HelloB() {        System.out.println("HelloB");    }        { System.out.println("I'm B class"); }        static { System.out.println("static B"); }        public static void main(String[] args) {      new HelloB();    }}

问题一答案
①修饰变量、修饰方法
②静态块
③静态内部类
④静态导包

问题二答案
static A
static B
I'm A class
HelloA
I'm B class
HelloB
2、static的描述
通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个对象,否则,实际上并未获得任何对象。执行new来创建对象的时候,数据存储空间才被分配,其方法才供外界调用。有两种情形用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少个对象,甚至根本不需要创建任何对象。另一种情形是,希望某个方法不与包含他的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用方法。简单来说,static的主要目的就是创建独立于具体对象的域变量与方法。《Java编程思想(第四版)》
在加载类的同时加载static修饰的部分,此过程只进行一次
3、静态变量和静态方法
——可以被继承(隐藏),但不可override;调用父类的静态成员,可以像调用自己的一样;但调用其子类的静态成员,必须使用“子类名.成员名”来调用。
4、静态代码块
4-1类加载
菜鸡如我就不研究jvm的原理了,现在看不懂的,加载的话,需要知道如下概念:
第一次需要使用类信息时加载。
延迟加载,能不加载就不加载。
4-1-1触发类加载的几种情况: 4-1-1-1调用静态成员时,会加载静态成员真正所在的类及其父类。 通过子类调用父类的静 态成员时,只会加载父类而不会加载子类。 4-1-1-2第一次 new 对象的时候 加载(第二次再 new 同一个类时,不需再加载)。 4-1-1-3加载子类会先加载父类。(覆盖父类方法时所抛出的异常不能超过父类定义的范围) 4-1-1-4如果静态属性有 final 修饰时,则不会加载,当成常量使用。 4-1-1-5如果编译时不能确定其值的话,则运行时加载 .
4-1-2类加载的顺序: 4-1-2-1加载静态成员/代码块: 先递归地加载父类的静态成员/代码块(Object的最先);再依次加载到本类的静态成员。 同一个类里的静态成员/代码块,按写代码的顺序加载。 如果其间调用静态方法,则调用时会先运行静态方法,再继续加载。同一个类里调用静态方法时,可以不理会写代码的顺序。 4-1-2-2调用构造方法:
调用子类构造方法前必须先调用父类构造方法;默认调用父类空参的,也可在第一行写明调用父类某个带参的。 再依次到本类的构造方法;构造方法内,也可在第一行写明调用某个本类其它的构造方法。
4-1-3补充帮助理解,类加载后的绑定:
这里简要说明下Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起来,对java来说,绑定分为静态绑定和动态绑定:
静态绑定:即前期绑定。在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。针对java,简单的可以理解为程序编译期的绑定。java当中的方法只有final,static,private和构造方法是前期绑定的。
动态绑定:即晚期绑定,也叫运行时绑定。在运行时根据具体对象的类型进行绑定。在java中,几乎所有的方法都是后期绑定的。

4-2静态代码块的加载,静态代码块会预加载,只会被执行一次,一般在里面放一些需要提前加载又不需要多次加载的东西,和构造方法还是有一些差别的,第二次new对象时,静态代码块不会再执行一次

4-3静态代码块的使用例子,HibernateUtil 

public class HibernateUtil {    private static final SessionFactory sessionFactory;    private static final ThreadLocal session = new ThreadLocal();    static {        try {            sessionFactory = new Configuration().configure().buildSessionFactory();        } catch (Throwable ex) {            System.err.println("Initial SessionFactory creation failed." + ex);            throw new ExceptionInInitializerError(ex);        }    }}


4-3-2据说在jdbc中很常见
5、静态类
5-1指静态内部类
在内部类中可以将其声明为static的,这个时候,外部类可以直接调用内部类,因为static的内部类是在加载外部类的同时加载的,所以也就是说,并不要实例化外部类就能直接调用静态内部类
public class BaseStatic {  static {        System.out.println("Load base static");    }    public BaseStatic(){        System.out.println("BaseStatic constructor");    }        static class BaseInnerClass{        static{            System.out.println("Base inner class static");        }                public BaseInnerClass(){            System.out.println("BaseInnerClass constructor");        }    }}public class StaticLoadOrderTest{    public static void main(String[] args) {        // TODO Auto-generated method stub        new BaseStatic.BaseInnerClass();    }}


5-2据说在某些传统项目中,测试中会使用到静态内部类。

6静态导包——可以使用import static的功能,导入静态方法,这样可以省略类名……比如
import static java.lang.System.out;import static java.lang.Integer.*;//然后在代码中可以这样用:public class TestStaticImport {public static void main(String[] args) {out.println(MAX_VALUE);}}

特么的这功能脑子有坑啊,鬼特么会这样用啊,导入了import static java.lang.Integer.*;和import static java.lang.Float.*;MAX_VALUE到底是谁啊喂

没了

原创粉丝点击