第4章 初始化和清除(下)

4.4 成员初始化

局部变量在使用之前必须初始化。

package com.sunny.hello.c4;

public class Test {
    void f() {
        int i;
        //i++; 编译错误,因为i未初始化
    }
}

但是,若将基本类型设为一个类的数据成员,情况则会变得稍微有些不同。由于任何方法都可以初始化或使用那个数据,所以在正式使用前,若还是强迫程序员将其初始化为一个适当的值,就可能不是一种实际的做法。然而,若为其赋予一个垃圾值,同样

是非常不安全的。因此,一个类的所有基本类型数据成员都会保证获得一个初始值。

package com.sunny.hello.c4;

public class InitialValues {

    public static void main(String[] args) {
        Measurement d = new Measurement();
        d.print();
    }
}
class Measurement {
    boolean t;
    char c;
    byte b;
    short s;
    int i;
    long l;
    float f;
    double d;
    void print() {
        System.out.println("Data type Inital value\n"
                + "boolean " + t + "\n"
                + "char " + (int)c + " \n"
                + "byte " + b + "\n"
                + "short " + s + " \n"
                + "int " + i + "\n"
                + "long " + l + " \n"
                + "float " + f + " \n"
                + "double " + d + "\n");
    }
}

运行结果:

Data type Inital value
boolean false
char 0
byte 0
short 0
int 0
long 0
float 0.0
double 0.0

  4.4.1 规定初始化

class Measurement {
    boolean b = true;
    char c = ‘x‘;
    byte B = 47;
    short s = 60;
    int i = 999;
    long l = 1;
    float f = 3.14f;
    double d = 3.14159;
    Depth o = new Depth();

    // ...
}

class Depth {

}

  4.4.2 构建器初始化

1.初始化顺序

package com.sunny.hello.c4;

public class OrderOfInitialization {

    public static void main(String[] args) {
        Card t = new Card();
        t.f();
    }
}

class Tag {
    Tag(int marker) {
        System.out.println("Tag(" + marker + ")");
    }
}

class Card {
    Tag t1 = new Tag(1);
    Card() {
        System.out.println("Card()");
        t1 = new Tag(33);
    }
    Tag t2 = new Tag(2);
    void f() {
        System.out.println("f()");
    }
    Tag t3 = new Tag(3);
}

运行结果:

Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()

在执行Card这个类的构造函数之前,会对Card类中所有的成员变量进行初始化。

package com.sunny.hello.c4;

public class StaticInitialization {

    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        t2.f2(1);
        t3.f3(1);
    }
    static Table t2 = new Table();
    static Cupboard t3 = new Cupboard();
}
class Bow {

    Bow(int marker) {
        System.out.println("Bow(" + marker + ")");
    }

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

}
class Table {

    static Bow b1 = new Bow(1);
    Table() {
        System.out.println("Table()");
        b1.f(1);
    }
    void f2(int marker) {
        System.out.println("f2(" + marker + ")");
    }
    static Bow b2 = new Bow(2);
}
class Cupboard {

    Bow b3 = new Bow(3);
    static Bow b4 = new Bow(4);
    Cupboard() {
        System.out.println("Cupboard()");
        b4.f(2);
    }
    void f3(int marker) {
        System.out.println("f3(" + marker + ")");
    }
    static Bow b5 = new Bow(5);
}

运行结果:

Bow(1)
Bow(2)
Table()
f(1)
Bow(4)
Bow(5)
Bow(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bow(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bow(3)
Cupboard()
f(2)
f2(1)
f3(1)

4.5 数组初始化

4.5.1 多维数组

4.6 总结

时间: 2024-08-09 22:04:36

第4章 初始化和清除(下)的相关文章

java基础 第4章 初始化和清除

第4章 初始化和清除 "随着计算机的进步,'不安全'的程序设计已成为造成编程代价高昂的罪魁祸首之一." "初始化"和"清除"是这些安全问题的其中两个.许多C程序的错误都是由于程序员忘记初始化一个变量造成的.对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误.清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记.这样一来,那个元素占用的资源会一直保留下去,极易产生资源(主要是内存)用尽的后果. C++

《C++编程思想》第四章 初始化与清除(习题+解答)

相关代码: 1. #include <stdio.h> class tree { int height; public: tree(int initialHeight); ~tree(); void grow(int years); void printsize(); }; tree::tree(int initialHeight) { height = initialHeight; } tree::~tree() { puts("inside tree destructor&quo

《C++编程思想》第四章 初始化与清除(原书代码+习题+解答)

相关代码: 1. #include <stdio.h> class tree { int height; public: tree(int initialHeight); ~tree(); void grow(int years); void printsize(); }; tree::tree(int initialHeight) { height = initialHeight; } tree::~tree() { puts("inside tree destructor&quo

第4章 初始化和清除

4.1 用构建器自动初始化对于方法的创建,可将其想象成为自己写的每个类都调用一次initialize().这个名字提醒我们在使用对象之前,应首先进行这样的调用.但不幸的是,这也意味着用户必须记住调用方法.在Java中,由于提供了名为“构建器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化.若某个类有一个构建器,那么在创建对象时,Java会自动调用那个构建器——甚至在用户毫不知觉的情况下.所以说这是可以担保的!接着的一个问题是如何命名这个方法.存在两方面的问题.第一个是我们使用的

第6章 初始化和清除

1.用构造函数确保初始化 客户程序员在使用对象之前,必须调用初始化对象的结构,但是,他们往往会忘记这些,而这些可以交给库程序员来自动处理.这个就是构造函数.这个函数的名字和类的名称一样,编译器就可以识别. 2.用析构函数确保清除 构造函数和析构函数是没有返回值,而且这个void返回值不同于一般的void函数,他不能做任何其他的事情.当对象创建是自动调用构造函数,当对象超出它的作用域时,自动调用析构函数.非局域性的goto语句不会调用析构函数,但是编译器有时候不会支持. 3.清除定义块 在C中,总

读TIJ -4 初始化和清除

<Think in java·第 4 章初始化和清除> 本章介绍对象的创建和消除. 4.1 用构建器自动初始化 [You can imagine creating a method called initialize( ) for every class you write.]一句话的正确解读是,你(男生)将自己想象成为女生.所以,我专门用一节 < 编程导论(Java)·2.3.6 构造器不是方法>强调这一点. 4.2 方法过载 这一段解释非常经典,按照人们的日常生活介绍重载.同时

Java编程思想---第五章 初始化与清理(下)

第五章 初始化与清理(下) 5.7 构造器初始化 可以使用构造器来进行初始化,在运行时可以调用方法或执行某些动作来确定初值,但是我们无法阻止自动初始化的进行,它将在构造器被调用之前发生.例如: public class Counter { int i; Counter() { i = 7; } } 那么i首先被置为0,然后变成7.编译器不会强制你一定要在构造器的某个地方或在使用它们之前对元素进行初始化,因为初始化早已得到了保证. 5.7.1 初始化顺序 在类的内部,变量定义的先后顺序决定了初始化

6.JAVA编程思想初始化和清除

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040234 随着计算机的进步,'不安全'的程序设计已成为造成编程代价高昂的罪魁祸首之一. 许多 C程序的错误都是由于程序员忘记初始化一个变量造成的.对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误.清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记.这样一来,那个元素占用的资 源会一直保留下去,极易产生资源(主要是内存)用

Prism 文档 第二章 初始化Prism应用程序

                                                                       第二章 初始化Prism应用程序 本章将讨论为了使一个Prism应用程序的启动和运行哪些是必须的.Prism的应用程序在启动过程中需要注册和配置,这被称为引导应用程序. 什么是Bootstrapper? bootstrapper是一个类,通过Prism类库负责一个应用程序建立的初始化.通过使用bootstrapper,对于如何将Prism库组件连接到您的应