java——初始化(构造函数和innt函数)

        先说一下什么是初始化,初始化就是在最开始定义成员变量时给它一个初始的值,这个时候你就会问了,既然后面还要给它赋值为什么要给它初始化呢,不是多此一举么,首先这个初始化是为了防止程序运行时候出现未知的错误,或者bug。

        初始化一般在构造函数中进行,它定义了函数的初始值,使程序可以正常运行,在new对象时构造函数就会自动被执行,它只会被执行一次,之后想修改需要自己再添加一个innt(初始化)方法,这个方法时外部的方法不会自动执行,需要手动调用。

不多说了上代码自己体会:

构造方法的作用:对对象初始化

(1)一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

(2)构造函数是在对象建立时由JVM调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。

(3)普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

(4)构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。

(5)构造函数没有返回值类型。

 

构造函数要注意的细节:

(1)当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。

备注:可以通过javap命令验证。

(2)在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。

public class Init {
    //创建构造方法的初始化
    int a;
    char b;
    short s;
    float f;
    long lo;
    double dou;
    byte e;
    boolean flag;
    Object obj;
//这些基本类型都会保证有一个初始的值。
//可见,java会为类的基本类型的变量提供一个初始值,各类型初始值不同,非基本类型初始为null。
//注意,这里的变量必须是类变量,注意,只会为类变量提供初始化,而局部变量不会。
//如果局部变量没有初始化,会收到一个出错信息(方法内定义一个变量要用的话需要给它初始化赋一个值,不然会报错)。
    public static void main(String[] args) {
        Init init = new Init();
        init.print();
    }

    public void print() {
        System.out.println("int a=" + a + " char b=" + b  +
                " short s=" + s + " float f=" + f + " long lo=" +
                lo + "\n double dou=" + dou + " byte e=" + e + " boolean flag="
                + flag + " Object obj=" + obj);
    }
}

 

运行结果:

int a=0 char b=  short s=0 float f=0.0 long lo=0

 double dou=0.0 byte e=0 boolean flag=false Object obj=null

 

public class InitTest {
    //构造函数中的初始化
    int i;
    Object obj;
    public InitTest(){
        System.out.println("before i="+i+"  obj="+obj);//初始化之前
        i = 1;
        obj = new Object();
        System.out.println("after i="+i+" obj="+obj);//初始化之后
    }
//由此可见,不论是基本类型,还是其他的类。java默认的初始化是最先发生的,位于一切方法之前。
    public static void main(String [] args){
        InitTest init = new InitTest();
    }
}

运行结果:

before i=0  obj=null

after i=1 obj=java.lang.Object@4554617c

<think>我们正在处理一个关于OraclePL/SQL数组初始化的问题。根据用户的问题提供的引用,用户想知道如何正确初始化数组。引用[1]提供了PL/SQL的基本介绍,引用[2][3]则直接涉及数组(VARRAY)的使用。在PL/SQL中,数组通常使用VARRAY(可变数组)或嵌套表(NestedTable)来实现。根据引用[2][3]:-引用[2]中的示例展示了如何声明一个VARRAY类型的数组(c_list),并在声明时初始化(name_listc_list:= c_list();),然后使用extend方法扩展空间。-引用[3]指出VARRAY是固定大小的顺序集合,但注意VARRAY的大小是可以动态改变的(通过extend),不过有一个最大限制。因此,初始化数组的步骤通常包括:1.定义数组类型(例如,VARRAY类型或嵌套表类型)。2.声明该类型的变量。3.初始化变量(对于VARRAY,通常使用构造函数,即类型名后跟括号,括号内可以包含初始元素,也可以为空表示空数组)。具体到初始化:-对于VARRAY:在声明变量时,可以使用构造函数进行初始化构造函数与类型同名,可以传入初始元素列表,也可以不传入(此时为空数组)。例如:TYPEmy_array_typeIS VARRAY(10)OF NUMBER;v_array my_array_type:= my_array_type();--初始化为空或者v_array my_array_type:= my_array_type(1,2,3);--初始化包含三个元素-对于嵌套表:初始化方式类似,但嵌套表没有固定上限。例如:TYPE my_nested_table_typeIS TABLEOF NUMBER;v_nt my_nested_table_type:= my_nested_table_type();--初始化为空或者v_nt my_nested_table_type:= my_nested_table_type(1,2,3);注意:在引用[2]的示例中,数组类型是VARRAY,初始化时使用了空构造函数,然后通过extend方法扩展空间,再逐个赋值。另外,引用[2]中的示例还展示了使用游标循环来填充数组。因此,我们可以总结如下:1.定义数组类型(在声明部分或全局类型定义)。2.声明该类型的变量,并使用构造函数初始化(即使初始为空,也要初始化,否则会报错)。3.如果数组初始为空,后续可以通过extend方法扩展空间并赋值。示例代码(VARRAY):DECLARETYPEnum_array ISVARRAY(5) OFNUMBER;--初始化数组,可以带初始值,也可以不带arr1num_array:= num_array();--空数组arr2 num_array :=num_array(10,20,30); --初始化三个元素BEGIN--使用arr1,需要先扩展空间arr1.extend(1);--扩展一个元素的空间arr1(1) :=100;--赋值--也可以使用extend一次扩展多个,但注意不能超过最大大小arr1.extend(2);--再扩展两个元素arr1(2) :=200;arr1(3) :=300;--输出FORi IN1..arr1.countLOOPDBMS_OUTPUT.PUT_LINE('arr1('||i||'): '||arr1(i));END LOOP;--对于arr2,已经有三个元素FORi IN1..arr2.countLOOPDBMS_OUTPUT.PUT_LINE('arr2('||i||'): '||arr2(i));END LOOP;END;/示例代码(嵌套表):DECLARETYPE num_table ISTABLE OFNUMBER;arr1 num_table :=num_table();--空数组arr2num_table:= num_table(10,20,30);--初始化三个元素BEGIN--嵌套表同样使用extend扩展arr1.extend(1);arr1(1) :=100;--也可以直接追加元素(使用extend然后赋值,或者使用赋值语句扩展?注意:嵌套表的下标必须连续,但不需要预先extend?实际上,在初始化后,我们仍然需要extend来增加空间,然后才能赋值)--另一种方法是使用赋值语句直接给新下标赋值,但这会导致下标不连续,所以通常还是用extend。--或者使用集合方法:例如,我们可以使用赋值并扩展:arr1.extend;--扩展一个元素(不带参数表示一个)arr1(arr1.last):=200;--输出FOR iIN1..arr1.count LOOPDBMS_OUTPUT.PUT_LINE('arr1('||i||'):'||arr1(i));ENDLOOP;END;/注意:嵌套表在初始化后,也可以使用构造函数重新赋值(但这样会覆盖整个集合),例如:arr1:= num_table(100,200);根据用户的问题,我们重点回答初始化步骤。另外,引用[2]中还提到使用%TYPE来定义数组元素类型,这样可以使数组元素类型与数据库表的字段类型一致。因此,回答将包括:1.定义数组类型(VARRAY或嵌套表)。2.声明并初始化数组变量(使用构造函数)。3.如果需要,使用extend方法扩展空间并赋值。同时,我们生成相关问题。</think>### Oracle PL/SQL 数组初始化方法 在 Oracle PL/SQL 中初始化数组需要遵循以下步骤(以 `VARRAY` 类型为例): #### 1. **定义数组类型** 使用 `TYPE...IS VARRAY(size)` 声明数组类型,指定元素类型最大容量: ```sql DECLARE TYPE num_array IS VARRAY(5) OF NUMBER; -- 最大5个数字元素的数组 TYPE name_array IS VARRAY(10) OF employees.last_name%TYPE; -- 引用表字段类型 ``` #### 2. **初始化空数组** 使用构造函数初始化空数组(**必须显式初始化**): ```sql DECLARE TYPE str_array IS VARRAY(3) OF VARCHAR2(20); arr1 str_array := str_array(); -- 空数组初始化 🎈 BEGIN arr1.EXTEND(); -- 扩展空间 arr1(1) := 'Oracle'; END; ``` #### 3. **初始化带值数组** 直接在构造函数中传入初始值: ```sql DECLARE TYPE color_array IS VARRAY(4) OF VARCHAR2(10); colors color_array := color_array('RED','GREEN','BLUE'); -- 初始化3个元素 ``` #### 4. **结合游标动态初始化** 通过游标查询结果初始化数组(引用[2]示例): ```sql DECLARE CURSOR c_emp IS SELECT first_name FROM employees; TYPE names_t IS VARRAY(50) OF employees.first_name%TYPE; names names_t := names_t(); -- 必须初始化 idx PLS_INTEGER := 0; BEGIN FOR rec IN c_emp LOOP idx := idx + 1; names.EXTEND; -- 扩展空间 names(idx) := rec.first_name; END LOOP; END; ``` #### ⚠️ 关键注意事项 1. **强制初始化** 数组变量声明后**必须显式初始化**,否则会触发 `ORA-06531: Reference to uninitialized collection` 错误。 2. **空间扩展** 空数组添加元素前需调用 `EXTEND()` 方法(如 `arr.EXTEND(2)` 扩展2个位置)。 3. **索引从1开始** PL/SQL 数组索引始终从 **1** 开始(非0)。 4. **类型选择** - `VARRAY`:固定上限的连续存储(适合小型固定集合) - 嵌套表:动态增长的无上限集合(`TYPE nt_t IS TABLE OF VARCHAR2(20);`) --- ### 相关问题 1. PL/SQL 中 `VARRAY` 嵌套表(Nested Table)的主要区别是什么? 2. 如何批量扩展数组空间以提高性能? 3. 当数组元素超出初始声明的最大容量时会引发什么错误?如何避免? 4. 能否在 PL/SQL 中创建多维数组?如何实现? [^1]: PL/SQL 基础语法规范 [^2]: 游标与数组结合初始化示例 [^3]: VARRAY 数据结构特性说明
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值