今天我们来说说 JAVA通过构造函数传递的参数来设置数组长度的问题。

问题在于我们没有明确知晓JVM的运行顺序。在new对象的时候,先调用构造函数,但是并没有将执行构造函数的代码,随机之后就初始化了数组长度为0了;

错误代码如下:

 class Test {
int length;
public Test(int a)
{
this.length=a;
}
int[] a=new int[length];
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt(); Test t1=new Test(10);
System.out.println(t1.length);
System.out.println(t1.a.length);
}

输出结果:

输入:10
输出 :10 //length的值
输出 :0 //数组的长度

为什么数组的长度还是0?

debug :

我们通过debug可以看到我们JVM是先调用了构造函数,但是并没有执行当中的语句,然后把类中的成员变量初始化了  。这时候的length并没有被构造函数的形参赋值。所以数组长度为0,

所有初始化完毕之后,才将数组的形参赋值给length。

修改:

我们可以先定义数组,然后new数组的代码写在构造函数中的内部了。这样的话,数组就不会被初始化了。 代码如下:

 class Test {
int[] a ; public Test(int lenght)
{
a = new int[lenght] }
7
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt(); Test t1=new Test(10);
System.out.println(t1.length);
System.out.println(t1.a.length);
}
}

初次写博客,有很多不足。希望能够对大家带来帮助。谢谢

JAVA为什么不能通过构造函数传参来设置数组长度。的更多相关文章

  1. Java方法:命令行传参,重载,可变参数,递归

    Java方法:System.out.println()//系统类.out对象.输出方法Java方法是语句的集合,他们在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中 ...

  2. js构造函数传参

    1.直接传参并用this关键字初始化属性 function Person(name,age,learn){ this.name = name; this.age = age; this.learn = ...

  3. Java自学-类和对象 传参

    Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 publi ...

  4. java:打印菱形图案(传参打印的自定义字符和行数)

    打印菱形图案: 代码实现: public class Hello { public static void main(String args[]) { LingXingPrint("#&qu ...

  5. java内部类继承--构造函数传参

    /: innerclasses/InheritInner.java // Inheriting an inner class. class WithInner { class Inner {} } / ...

  6. java 如何将方法作为传参--多态

    在前段时研究智能算法时,发现如果使用java进行实现的话,往往具体实现过程差不多,但是适应值函数却根据 研究对象的不同发生很大的改变,这样对代码的维护产生很大的阻碍,于是产生的一个疑问:可不可以将适 ...

  7. 修改Tomcat可支持get传参方式的url长度,get形式

    maxHttpHeaderSize="8192"加在 <Connector port="8081" maxHttpHeaderSize="314 ...

  8. 3.多线程传参,以及tuple数组

    #include <Windows.h> #include <thread> #include <iostream> #include <tuple> ...

  9. axios用headers传参,设置请求头token

    新建一个配置文件http.js // 导入axios import axios from 'axios'; // 全局配置默认路由 axios.defaults.baseURL = 'http://1 ...

随机推荐

  1. Replace into 与Insert into on duplicate key update的区别

    前提条件:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用这2条语句没有意义.该语句会与INSERT相同 1. Replace into (1)   添加相同的主键 操作前       ...

  2. python标准库:csv 模块

    原文地址:http://www.bugingcode.com/blog/python_csv.html csv 模块被用来读取CSV格式(用逗号分割数值)的数据文件,CSV格式的文件经常在微软的Exc ...

  3. Luogu_1080_国王游戏

    题目描述 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这n位大臣排成一排,国王站在队伍的最前面.排好队 ...

  4. 将js进行到底:node学习4

    使用Node做web开发 HTTP与TCP 上一回使用node.js的NET(TCP)模块开发了一个聊天室demo.单纯用到了原始的TCP协议,可以说TCP是HTTP,SMTP,FTP的鼻祖了,后面的 ...

  5. OPPO招聘-互联网测试

    邮       箱:ljy@oppo.com 工作地点:深圳

  6. java design pattern - adapter pattern

    场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B ...

  7. 《Effective Java》笔记45-56:通用程序设计

    将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...

  8. Flink命令行提交job (源码分析)

    这篇文章主要介绍从命令行到任务在Driver端运行的过程 通过flink run 命令提交jar包运行程序 以yarn 模式提交任务命令类似于: flink run -m yarn-cluster X ...

  9. objectarx 得到有宽度的多段的轮廓

    使用到的命令是:_.wmfout和_.import以及PEdit步骤:1.先通过_.wmfout和_.import得到轮廓线,得到的轮廓线是一个块.方法如下: //ssname:选择的有宽度的多段线 ...

  10. 5,Hadoop中的文件

    1,文件结构 · bin:脚本和命令目录. · etc:配置文件目录. · sbin:命令目录,主要包含HDFS和YARN中各类服务的启动和关闭,依赖于bin中的脚本. · share:各个模块编译后 ...