开发者社区> ghost丶桃子> 正文

Java编程思想学习笔记——初始化与清理(二)

简介:
+关注继续查看

成员初始化

Java尽力保证:所有变量在使用前都能得到适当的初始化。

  • 方法的局部变量:未初始化,编译错误。
void f(){
        int i;
//        System.out.println(i);//编译错误
    }
  • 类的数据成员(字段)是基本类型:保证都会有一个初始值。
public class InitialValues {
    boolean bl;
    char c;
    byte bt;
    short s;
    int i;
    long l;
    float f;
    double d;
    InitialValues reference;
    void printValues(){
        System.out.printf(
                "\nboolean:"+bl
                +"\nchar:"+c
                +"\nbyte:"+bt
                +"\nshort:"+s        
                +"\nint:"+i
                +"\nlong:"+l
                +"\nfloat:"+f
                +"\ndouble:"+d
                +"\nreference:"+reference
        );
    }

    public static void main(String[] args) {
        new InitialValues().printValues();
    }
}

结果输出:

boolean:false
char:
byte:0
int:0
long:0
float:0.0
double:0.0
reference:null
  • 指定初始化

在定义类成员变量的地方为变量赋值

public class InitialValues {
    boolean bl=true;
    char c='a';
    byte bt=22;
    short s=0xff;
    int i=1202;
    long l=1;
    float f=3.14f;
    double d=3.14159;
}

同样的方式初始化非基本类型的对象

class Apple{}
public class InitialValues {
    Apple apple = new Apple();
}

调用方法来初始值

    int i1 = getIntValue();
    int i2 = getDoubleValue(2);

    private int getDoubleValue(int i) {
        return i*2;
    }

    private int getIntValue() {
        return 2;
    }

构造器初始化

无法阻止自动初始化的进行,它将在构造器被调用之前发生。

public class ConstructorInitial {
    int i ;
    ConstructorInitial(){
        System.out.println(i);
        i=1;
        System.out.println(i);
    }

    public static void main(String[] args) {
        new ConstructorInitial();
    }
}

结果:

0
1

初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。

静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。
静态初始化只有在必要的时候才会进行。
初始化顺序是:静态对象-->非静态对象。

对象创建的过程
假设有个名为Dog的类:

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

显示的静态初始化
Java允许将多个静态初始化动作组织成一个特殊的"静态块"

class Cup{
    Cup(int marker){
        System.out.println("Cup("+marker+")");
    }
    void f(int marker){
        System.out.println("f("+marker+")");
    }
}
class Cups{
    //静态成员变量
    static Cup cup1;
    static Cup cup2;
    //显式的静态初始化
    //静态块
    static {
        System.out.println("static initialization");
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }
    Cups(){
        System.out.println("Cups()");
    }
}
public class Initialization {
    public static void main(String[] args) {
        Cups.cup1.f(100);
        /**
         *static initialization
         Cup(1)
         Cup(2)
         f(100)
         */
    }
//    static Cups cups = new Cups();
    /**
     * static initialization
     Cup(1)
     Cup(2)
     Cups()
     */
}

非静态实例初始化
实例初始化:用于初始化每一个对象的非静态变量。

class Cup{
    Cup(int marker){
        System.out.println("Cup("+marker+")");
    }
    void f(int marker){
        System.out.println("f("+marker+")");
    }
}
class Cups{
    //静态成员变量
    static Cup cup1;
    static Cup cup2;
    Cup cup3,cup4;
    //显式的静态初始化
    //静态块
    static {
        System.out.println("static initialization");
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }
    //非静态实例初始化
    {
        System.out.println("non-static initialization");
        cup3 = new Cup(3);
        cup4 = new Cup(4);
    }
    Cups(){
        System.out.println("Cups()");
    }
}
public class Initialization {
    public static void main(String[] args) {
        new Cups();
        /**
         *static initialization
         Cup(1)
         Cup(2)
         non-static initialization
         Cup(3)
         Cup(4)
         Cups()
         */
    }
}
原文地址:http://www.cnblogs.com/JohnTsai/p/4590503.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaScript面向对象的编程指南学习笔记
JavaScript面向对象的编程指南学习笔记 第一章 1,用自己的语言描述出,什么是对象、类、封装、聚合、继承、多态? 对象,拥有属性和方法的任何抽象概念。 类,可以实例化,有共同属性或方法(行为)的相似对象,的模板 封装,提供接口,隐藏接口的实现 聚合,将大功能(对象)拆分成小功能(小对象)去实现的逆过程。
8930 0
Python学习笔记:lambda表达式与函数式编程
1,lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。
1335 0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制
SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和END之间的语句 DO WHILE 重复执行直到条件为假则退出循环 DO UNTIL 重复执行直到条件为真则退出循环 DO OVER 对隐含下标
1325 0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程
SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) 结构化查询语言(SQL) SAS宏语言 2. 宏触发:% 是一个宏语句或宏函数;&是一个宏变量引用 3. 局部宏变量:一般程序定义的为宏变量。 全局
1774 0
java编程学习笔记——mybatis SQL注入问题
 SQL 注入攻击   首先了解下概念,什么叫SQL 注入:   SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞。
1393 0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作
SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定分组变量,用于控制SET,MERGE,UPDATE或MODIFY语句。 BY<DESCENDING>variable-1 <...<DESCENDI
1483 0
服务端编程示例|学习笔记
快速学习服务端编程示例
73 0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(1)系统简介和编程基础
SAS学习笔记之《SAS编程与数据挖掘商业案例》(1)系统简介和编程基础 1. SAS系统简介 1.1 SAS是先编译后执行的语言,data步标志着编译的开始。 数据指针:当前内存缓存区,输入数据所在位置。 PDV:Program Data Vector,在DATA步中所有涉及的变量被编程当前向量的一部分。 2. SAS编程基础 2.1 SAS逻
1583 0
1955
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载