Java 编程思想笔记:Learn 3

成员初始化

  1. 局部变量如果未初始化则会编译时抛出异常
void f(){
  int i;
  i++;
}
  1. 要是类的数据成员是基本类型,那么就会有一个初始值。如果类的数据成员是一个对象的话,默认初始值是 null。
public class ApiTestDaoTest{
    boolean t;
    char c;
    byte b;
    short s;
    int i;
    long l;
    double d;
    float f;
    ApiTestDaoTest reference;
    Integer Int;

    @Test
    public void printInitialValues(){
        System.out.println("data type initial value ");
        System.out.println("boolean "+ t);
        System.out.println("char "+c);
        System.out.println("byte "+b);
        System.out.println("int "+i);
        System.out.println("short "+s);
        System.out.println("long "+l);
        System.out.println("float "+f);
        System.out.println("double "+d);
        System.out.println("reference " + reference);
        System.out.println("Integer " + Int);
    }
}

data type initial value 
boolean false
char  
byte 0
int 0
short 0
long 0
float 0.0
double 0.0
reference null
Integer null

构造器初始化

构造器来进行初始化,是为了在运行时刻,可以调用方法或执行某些动作来确定初始值。

初始化顺序

  1. 在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法中,他们仍然会在任何方法(包括构造器)被调用之前得到初始化:
class Window{
    Window(int marker){
        System.out.println("Window marker == "+marker);
    }
}

class House{
    Window w1 = new Window(1);

    House(){
        System.out.println("House()");
        w3 = new Window(33);
    }

    Window w2 = new Window(2);

    void f(){
        System.out.println("f()");
    }

    Window w3 = new Window(3);
}

House h = new House();
h.f();

由输出可见,w3 这个引用会被初始化2次。一次是在作为 House 的初始值,一次是House 的构造器中(第一次的引用对象将被丢弃,并作为垃圾回收)。

5.7.2 静态数据的初始化

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

//  static 不能用于局部变量。static 可以定义一个方法或者属性,但是不能定义一个方法内的一个变量,如下:
void a(){
  static int a = 3; // 会报错
}

如果想在定义处进行初始化,采取的方法与非静态数据没什么不同。

初始化的顺序是先静态对象,后是 “非静态” 对象。——这块没太整明白。

  1. 即使没有显示地使用 static 关键字,构造器实际上也是静态方法。假设有个 Dog 类,当首次创建类型为 Dog 的对象时或者 Dog 类的静态方法/静态域首次被访问时,Java 解释器必须查找类路径,以定位 Dog.class 文件。
  2. 然后载入 Dog.class (这将创建一个 Class 对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在 Class 对象首次加载的时候进行一次。
  3. 当用 new Dog() 创建对象时,首先将在堆上为 Dog 对象分配足够的存储空间。
  4. 分配的这块存储空间上,Dog 所有的基本类型数据都设置了默认值,而引用则被设置为了 null。
  5. 执行所有出现于字段定义处的初始化动作
  6. 执行构造器

显式的静态初始化

Java 允许将多个静态初始化动作组织成一个特殊的 “静态子句”:

public class Spoon{
  static int i;
  static {
    i = 47;
  }
}

这段静态代码块也仅执行一次。当首次生成这个类的一个对象时,或者首次访问属于这个静态代码块的数据成员时,这段静态代码块会执行一次。

非静态实例初始化

Java 中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。

{
  int i = 0;
  int a = 1;
}

数组初始化

数组是类型相同的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。数组是通过方括号下标操作符[] 来定义的,要定义一个数组,只需要在类型名后加上一对空方括号即可;

编译器不允许指定数组的大小。现在拥有的只是对数组的一个引用(你已经为该引用分配了足够多的存储空间),而且也没给数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须写初始化表达式。对于数组,初始化动作可以出现代码的任何地方,但也可以使用一种特殊的初始化表达式,它必须在创建数组的地方出现。这种特殊的初始化是由一对花括号括起来的值组成的。在这种情况下,存储空间的分配(等价于使用 new)将由编译器负责,

int[] a1 = {1,2,3,4};

int a2 = a1;,这个操作只是复制的一个引用:

    @Test
    public void printInitialValues(){
        int[] a1 = {1,2,3,4};
        int[] a2;
        a2 = a1;
        for(int i=0;i<a2.length;i++){
            a2[i] = a2[i] + 1;
        }
        for(int i : a1){
            System.out.println(i);
        }
    }
// 2 3 4 5

由此可见,a1 和 a2 只是同一个数组的引用的不同别名。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 第一章 对象导论 对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据和方法,并且每一个对象都可以唯一地...
    niaoge2016阅读 823评论 0 0
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,516评论 1 51
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,183评论 1 44
  • 2018年1月21日 星期日 气温-33℃ 受委托,上午去村上慰问贫困户。 走进村里,映入眼帘...
    家乡雪韵阅读 575评论 2 8
  • N一34 特别开心, 喜从天降般, 微信都顺利登录了, 大大小小八个, 正好2018, 似乎是发的节奏。 和妹妹聊...
    我是真幸福阅读 123评论 0 1