对11.16上课内容的理解

    其实我没有写博客的习惯,也不想养成这个习惯,现在也没有这个能力。但是我喜欢看博客。回忆一下,2012年,我进入职校,开始是学幼师专业,后来又感觉力不从心,就转去学习计算机专业,接触计算机图形设计(主要是office、PS、Flash方面,其实我什么也没学会,只自学了五笔打字),2014年,我进入江工这个更大的职校,开始自学C语言,也只学会了皮毛,学校开始是教VB,VB我学得很认真,自已花半学期做了一个进销存管理系统,但没什么用。后来又教了C语言、java、数据库,还学习了硬件,但老师都是在念书,我们大家要么旷课,要么上课睡觉聊天玩手机。2016年3月,进入贝沃学习,先后接触的老师都很负责,同学们都很勤奋,相反,我显得很落后。

    11.17老师上课主要讲的是java中static的用法。关于static的用法,在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”简页言之,方便在没有创建对象的情况下来进行调用方法或变量。

    类的构造器,可以算是静态方法(原因:静态方法可以在未创建对象时调用,而构造方法在对象未创建时调用,可以看作静态方法),也不完全是静态方法(原因:静态方法不能调用非静态方法,而构造方法可以调用非静态方法,所以构造器不算是静态方法)。---此说法有待考证

    ps:简单说:
    从Java语言层面看,构造器不是静态方法。事实上规范专门规定了构造器不是方法。
    从JVM层面看,构造器属于特殊的初始化方法,但仍然不被归类为静态方法。
    无论从哪个层面看,构造器都是可以静态分派的(statically dispatched)。但要特别注意的是,并非所有可以静态分派的代码都是静态方法,这是规范里有定义的术语。
    无论从哪个层面看,构造器都要接收从调用方传入的隐藏this参数。Java的静态方法不需要接收该参数,而实例方法要接收该参数。这方面构造器更接近于可以静态分派的实例方法,例如私有实例方法。这就是为什么从构造器可以调用this上的实例方法。
书中的Dog例子,确实当Dog被首次实例化或其静态方法/静态变量被首次访问时,会触发Dog类的初始化。但构造器在此并不可以归类到静态方法的一侧。事实上构造器并不能被单独调用,而必须用在new表达式里,此时触发类初始化的正是new,而不是对构造器的调用——new与构造器调用是两码事。(关于构造器是否为static方法,参考地址:https://www.zhihu.com/question/35860619/answer/64802279 )

    可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动作来确定初值,这为编程带来了更大的灵活性。但要牢记:无法阻止自动初始化的进行,它将在构造器被调用之前发生。因此,假如使用下述代码:

public class Counter{
int i;
Counter{
i=7;}
};

    那么i首先会被置为0,然后变成7.对于所有基本类型和对象引用,包括在定义时已经初值的变量,这种情况都是成立的;因此,编译器不会强制你一定要在构造器的某个地方或在使用它们之前对元素进行初始化——因为初始化早已得到了保证。

    在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。例如:

    无论创建多少个对象、静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的默认初始化值就是null。

posted on 2016-11-17 09:48  jgxy  阅读(160)  评论(0编辑  收藏  举报

导航