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

时间: 2024-09-20 05:55:06

Java编程思想学习笔记——初始化与清理(二)的相关文章

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

初始化 构造器保证初始化 构造器采用与类相同的名称. 默认构造器(default constructor):不接受任何参数的构造器,也叫无参构造器. 构造器也能带有形式参数,就能在初始化对象时提供实际参数. class Foo{ Foo(){ System.out.println("Foo's no-arg Constructor Foo()"); } Foo(int i){ System.out.println("Foo's arg Constructor Foo (&qu

Java编程思想学习笔记——一切都是对象

前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式. 直接操纵元素 用某种基于特殊语法的间接表示(C和C++里的指针) 用引用操纵对象(Java) 在Java中,一切都被视为对象.操纵的标识符实际上是对象的一个引用. 类比为遥控器(引用)来操纵电视机(对象) 只要把握这个遥控器,就能保持与电视机的连接 改变频道或减小音量,实际操纵的是遥控器(引

Java编程思想学习笔记——类型信息

前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定我们在编译时已经知道了所有的类型. (2)另一种是反射机制,它允许我们在运行时发现和使用类的信息. 为什么需要RTTI 以使用了多态的类层次结构的例子举例: 如上图,泛型是基类Shape,而派生出来的具体类有Circle,Square和Triangle. 这是一个类层次结构图,基类位于顶部,而派生类

Java编程思想学习笔记——注解

前言 在Android开发的过程中,我们为了减少重复代码的编写,会使用类似ButterKnife,AndroidAnnotations 这类依赖注解库.代码示例如下: //不使用 Button btn = (Button)findViewById(R.id.btn); //使用ButterKnife @Bind(R.id.btn) Button btn; //使用AndroidAnnotations @ViewById(R.id.btn) Button btn; 可以看出通过注解,我们能大量减少

Java编程思想学习笔记——复用类

前言 复用代码是Java众多引人注目的功能之一. 达到复用代码的方法有: 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型组建新类.(不改变现有类的形式,复用现有类的形式并在其中添加新代码).面向对象程序设计的基石 正文 1.组合语法 将对象引用置于新类中即可(非基本类型:在新类中放置引用,基本类型:直接添加就可以了) /** * 引擎 */ class Engine{ /** * 功率 */ double power; /** * 品牌 */ St

Java编程思想学习笔记——枚举类型

前言 关键字enum可以将一组具名的值有限集合创建一种为新的类型,而这些具名的值可以作为常规的程序组件使用. 正文 基本enum特性 调用enum的values()方法可以遍历enum实例,values()方法返回enum实例数组,且数组中元素保持在enum声明时的顺序. public class TestEnum { public static void main(String[] args) { Fruit[] values = Fruit.values(); for (Fruit frui

Java编程思想学习笔记——接口

1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽象类直接创建对象是不安全的,因为这个抽象类是不完整的.编译器通过这种方式保证了 抽象类的纯粹性. public abstract class Person { public abstract void eat(); public abstract void pee(); public abstrac

Java编程思想学习笔记——字符串

前言 字符串操作是计算机程序设计中最常见的行为. 不可变String String对象是不可变的 重载"+"与StringBuilder String对象是不可变的,可以给String对象加任意多得别名. String对象具有只读特性,所以指向它的任何引用都不可能改变它的值. String a = "a"; String b = a; System.out.println("first: a=" + a + " b=" + b

Java编程思想学习笔记——访问权限修饰词

几种访问权限修饰词 public,protected,private,friendly(Java中并无该修饰词,即包访问权限,不提供任何访问修饰词) 使用时,放置在类中成员(域或方法)的定义之前的,仅仅控制它所修饰的特定定义的访问权. 包访问权限 是默认访问权限,没有任何关键字 对于同一包中的所有其他类对这个成员都有访问权限,对于包之外的所有其他类,则没有访问权限. 取得对某成员访问访问权的途径有如下方式: 用public修饰成员,任何人在任何地方都有访问权限 不加访问权限修饰词,并将其他类放在