帮我看一下这个Java数组微信小程序 数组长度,我不理解int[] foo = arr[0] 和 foo = arr[1]为什么指向不同

广州Java培训——如何创建一个数组让它接受所有可能的类型呢?_达内广州java培训
广州Java培训——如何创建一个数组让它接受所有可能的类型呢?
广州Java培训现在做一个代码分享,这篇文章的代码主要是针对上一篇文章的问题进行一个讲解,小编希望看不懂得小伙伴回到之前页面去查看。
public class SimpleCollection&T&
private T[] objA
private int index = 0;
public SimpleCollection()
//Error: Cannot create a generic array of T
//objArr = new T[10];
//Warning: Unchecked cast from Object[] to T[]
objArr = (T[]) new Object[10];
这个形式虽然可以做到,但是会产生一个警告。
查看ArrayList中的实现,可以发现它是使用了一个Object类型的数组:
private transient Object[] elementD
在取出的时候(get方法中)使用了类型转换:
(E) elementData[index];
泛型和子类
List&String& ls = new ArrayList&String&(); // 1
List&Object& lo = // 2
一个String类型的List是一个Object类的List吗?
不可以,Java编译器将会在第二行产生一个编译错误,因为它们的类型不匹配。
这样就避免了如果lo引入加入Object类型的对象,而ls引用试图将其转换为String类型而引发错误。所以编译器阻止了这种可能。
继承泛型类别
广州java培训直接用例子说明:
public class Parent&T1,T2&
private T1 foo1;
private T2 foo2;
public T1 getFoo1()
return foo1;
public void setFoo1(T1 foo1)
this.foo1 = foo1;
public T2 getFoo2()
return foo2;
public void setFoo2(T2 foo2)
this.foo2 = foo2;
子类继承父类:
public class Child&T1, T2, T3& extends Parent&T1, T2&
private T3 foo3;
public T3 getFoo3()
return foo3;
public void setFoo3(T3 foo3)
this.foo3 = foo3;
实现泛型接口
广州java培训泛型接口举例代码分享:
public interface ParentInterface&T1,T2&
public void setFoo1(T1 foo1);
public void setFoo2(T2 foo2);
public T1 getFoo1();
public T2 getFoo2();
子类实现泛型接口:
public class ChildClass&T1,T2& implements ParentInterface&T1, T2&
private T1 foo1;
private T2 foo2;
public void setFoo1(T1 foo1)
this.foo1 = foo1;
public void setFoo2(T2 foo2)
this.foo2 = foo2;
public T1 getFoo1()
return this.foo1;
public T2 getFoo2()
return this.foo2;
马上预约三天免费体验课
怕钱不够?就业挣钱后再付学费; &&&&
怕学不会?
真正0基础入学,120天精通;&&&&
担心就业?
7万家雇主企业,名企内部就业
2月24日,中国最大IT职业教育集团、美国上市公司--达内教育集团(NASDAQ:TEDU)在北京总部举办达内集团“因材施教、分级培优”新闻发布会。
随着全球信息化,各大名企对java程序员的需求越来越大。为了找到一份稳定高薪的工作,许多失业者都迈向了java培训机构,如何选择一家好的java培训机构成为了他们的话题。
来广州打工5年了,男朋友0基础想转行java开发,想给男朋友报名个职业培训机构,java课程哪家好?java培训哪家口碑最好?看服务,达内专注职业教育15年,高薪聘请名师授课 ,采用“先学习,就业后付款”模式,帮助50万名学员成功就业。22大热门课程,60个城市,180家培训中心,致力于培养面向电信和金融IT领域的Java、C++、web前端、软件测试、嵌入式、PHP、网络推广等方面的中高端软件人才。一地学习,全国就业,要培训,就选上市公司
Copyright (C)
Tedu.cn All Rights Reserved 京ICP备号-56 版权所有
选择城市和中心
达内北京亦庄大学生实训基地
达内北京网络营销中心
达内北京会计中心在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
var arr = [];
arr.foo = 'c';
console.log(arr.length);//2
为什么不是3呢
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
length返回的是array的数组索引长度,数组索引只能是数字,如果是字符串的相当于对象属性了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
arr.foo = 'c';执行后arr仍然是["a", "b"]
数据不支持arr.foo赋值
可以使用arr[2] = 'c'
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var arr = [];
arr.length = 9;
console.log(arr.length);//9
console.log(arr[3]);//undefined
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。下次自动登录
现在的位置:
& 综合 & 正文
Java JDK 5.0学习笔记(二维数组)
5.1.2 二维数组对象
一维数组使用数组名与一个索引来指定存取数组中的元素,您也可以定义二维数组。二维数组使用数组名与两个索引来指定存取数组中的元素。其定义方式与一维数组类似:
int[][] arr = {{1, 2, 3},
{4, 5, 6}};
从上面这个程序片段,就可以清楚地看出二维数组的索引方式。其定义了2行(Row)3列(Column)的数组,使用{ }与适当的断行可以协助您指定数组初值。范例5.5简单地示范了二维数组的存取。
TwoDimArray.java
public class
TwoDimArray {
public static void
main(String[] args) {
int[][] arr =
{{1, 2, 3},
{4, 5, 6}};
for(int i = 0;
i & arr. i++) {
for(int j =
0; j & arr[0]. j++)
System.out.print(arr[i][j] + " ");
System.out.println();
执行结果:
数组值arr[i][j]表示指定的是第i行第j列的值。在使用二维数组对象时,注意length所代表的长度,数组名后直接加上length(如arr.length),所指的是有几行(Row);指定索引后加上length(如arr[0].length),指的是该行所拥有的元素,也就是列(Column)数目。
lang=EN-US&
良葛格的话匣子:
初学者对于二维数组的了解到这里就可以了。接下来的内容是高级的二维数组说明,初学者可以先试着了解,如果觉得有点难,可以先跳过待以后对象观念更清楚后,再来看接下来的内容。
要了解范例5.5中length成员各代表哪一个长度,必须从对象配置的角度来了解。以对象的方式来配置一个二维数组对象,要使用以下的语法:
int[][] arr = new int[2][3];
上面这个程序片段中,配置了2行3列的二维数组对象,由于数据类型是int,所以数组元素的预设元素为0。
来细究一下二维数组的配置细节,其实arr[0]、arr[1]是两个一维数组对象,其长度各为3,而arr类型是int[] [],内容值为arr[0]与arr[1]。其关系如图5-1所示。
图二维数组的配置关系
从图5-1中可以看到,arr引用int[] []类型的对象,内容包括arr[0]与arr[1],而arr[0]与arr[1]再分别引用一个一维数组对象,这也就是范例5.5使用的arr.length与arr[0].length所表示的长度意义。有了数组配置的观念,可以改写范例5.5为范例5.6,让程序中的一维数组变量foo来依次取出arr[0]与arr[1]中的每个元素值,执行结果是相同的。
TwoDimArray2.java
public class TwoDimArray2 {
public static void main(String[] args) {
int[][] arr = {{1, 2, 3},
{4, 5, 6}};
int[] foo = arr[0];
for(int i = 0; i & foo. i++) {
System.out.print(foo[i] + " ");
System.out.println();
foo = arr[1];
for(int i = 0; i & foo. i++) {
System.out.print(foo[i] + " ");
System.out.println();
如果在使用new配置二维数组后想要一并指定初值,则可以编写如下:
int[][] arr = new int[][] {{1, 2, 3},
{4, 5, 6}};
同样的道理,也可以定义三维以上的数组,如果要定义同时初始元素值,可以使用以下的简便语法:
int[][][] arr = {
{{1, 2, 3}, {4, 5, 6}},
{{7, 8, 9}, {10, 11, 12}}
上面这个程序片段所定义的三维数组是2×2×3,您将之想象为两面2×3二维数组交叠在一起就是了。每一面的元素如图5-2所示。
图三维数组的配置关系
如果要动态定义三维数组,就使用以下的语法:
int[][][] arr = new int[2][2][3];
三维以上的更多维数组的定义,在Java中也是可行的,但并不建议使用。使用多维数组会让元素索引的指定更加困难,此时适当地将数据加以分割,或是使用其他的数据结构来解决,会比直接定义多维数组实在。
通过以上的说明,接下来讨论“不规则数组”。数组的维度不一定要是四四方方的,您也可以制作一个二维数组,而每个维度的长度并不相同。范例5.7是一个简单的示范。
TwoDimArray3.java
public class
TwoDimArray3 {
public static void main(String[] args) {
int arr[][];
arr = new int[2][];
arr[0] = new int[3];
arr[1] = new int[5];
for(int i = 0; i & arr. i++) {
for(int j = 0; j & arr[i]. j++)
arr[i][j] = j + 1;
for(int i = 0; i & arr. i++) {
for(int j = 0; j & arr[i]. j++)
System.out.print(arr[i][j] + " ");
System.out.println();
这个例子只是先前说明的概念延伸,在这个例子中,数组第一行的长度是3,而第二行的长度是5。执行结果如下:
程序编写风格:
在定义二维数组时,也可以使用int
arr[][]这样的定义方式。这种定义方式源于C/C++中对数组定义的语法,不过在Java中建议使用int[][] arr这样的定义方式。同样地,也可以使用int
arr[][][]这样的方式定义三维数组。
【上篇】【下篇】5分钟学会Java反射
关于反射,我们需要弄懂以下几个问题:
反射是什么? 反射有什么用? 怎么用反射?
下面我们来一一进行讲解:
一、反射是什么?
Reflection的意思是&反射、映象、倒影&,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性及方法;对于任何一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象的方法的功能称为Java的反射机制。
1. 自省(Introspection) vs. 反射(Reflection)
反射经常和自省弄混,为了区别,我们先看看两者的详细定义:
自省(Introspection):
Introspection is the ability of a program to examine the type or properties of
an object at runtime.
反射(Reflection):
Reflection is the ability of a program to examine and modify the structure
and behavior of an object at runtime.
从上述定义,我们可以看出,自省是反射的子集。部分语言支持自省,但是不支持反射,比如C++。
2. 自省示例 vs. 反射示例
自省示例: instanceof操作符用于判断一个对象是否属于一个特定的类。
if(obj instanceof Dog) {
Dog d = (Dog)
反射实例: Class.forName()方法返回了一个具体类/接口的对象,当然参数需要指定为特定的类名。
// with reflection
c = Class.forName(&classpath.and.classname&);
Object dog = c.newInstance();
Method m = c.getDeclaredMethod(&bark&, new Class[0]);
m.invoke(dog);
二、 为什么需要反射?
Java反射在框架开发中尤为重要。有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运行时才存在的类(该类符合某种特定的规范,例如JDBC),这是反射用得比较多的场景。
编译时我们对于类的内部信息不可知,必须得到运行时才能获取类的具体信息。比如ORM框架,在运行时才能够获取类中的各个属性,然后通过反射的形式获取其属性名和值,存入。
反射机制提供的功能:
在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法。通过反射甚至可以调用到private的方法; 在运行时修改构造函数,变量和方法的访问权限。
假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译
在对类的调用和实例化的时候,通过在配置文件中配置相应的类名,在程序中读取类名,然后通过反射技术在程序中加载和实例化,如常见的数据库驱动程序类,为了达到不依赖特定数据库驱动类,将用到的数据库驱动类名放到配置文件中(常用的有XML文件、Properties文件和文本文件),然后在程序中加载驱动,来实现对数据库的解耦,也就是说只要修改配置文件,就可以方便地更改数据库类型。
例如, Spring使用如下的bean配置:
当Spring在处理时,会使用Class.forName(String),同时参数为&com.xxx.Foo&用于实例化这个Class。同时,使用反射设置去用于设置特定的值。
这种机制同样也用于Servlet的web应用:
someServlet
com.programcreek.WhyReflectionServlet
三、 反射API
Java反射相关类
Java反射所需要的类并不多,主要有java.lang.Class类java.lang.reflect包中的Field、Constructor、Method、Array类,简单说明如下所示:
Class类:Class类的实例表示正在运行的 Java 应用程序中的类和接口。 Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。 Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。 Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。这个类不难理解,它是用来封装反射类方法的一个类。 Array类:提供了动态创建数组和访问数组的静态方法。该类中的所有方法都是静态方法。
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象。
Class没有公共构造方法。Class对象是在加载类时由Java以及通过调用类加载器中的defineClass方法自动构造的,因此不能显式地声明一个Class对象
Class是Reflection的起源。要想操纵;类的属性和方法,都必须从获取Class Object开始。
Class的方法
getName():获得类的完整名字。 getFields():获得类的public类型的属性。 getDeclaredFields():获得类的所有属性。 getMethods():获得类的public类型的方法。 getDeclaredMethods():获得类的所有方法。 getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,&parameterTypes参数指定方法的参数类型。 getConstrutors():获得类的public类型的构造方法。 getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。 newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
Constructor
获得类的构造方法
Constructor getConstructor(Class[] params) & 获得使用特殊的参数类型的公共构造函数 Constructor[] getConstructors() & 获得类的所有公共构造函数 Constructor getDeclaredConstructor(Class[] params) & 获得使用特定参数类型的构造函数(与接入级别无关) Constructor[] getDeclaredConstructors() & 获得类的所有构造函数(与接入级别无关)
获取类定义变量
Field getField(String name) & 获得命名的公共字段 Field[] getFields() & 获得类的所有公共字段 Field getDeclaredField(String name) & 获得类声明的命名的字段 Field[] getDeclaredFields() & 获得类声明的所有字段
获取类定义方法
Method getMethod(String name, Class[] params) & 使用特定的参数类型,获得命名的公共方法 Method[] getMethods() & 获得类的所有公共方法 Method getDeclaredMethod(String name, Class[] params) & 使用特写的参数类型,获得类声明的命名的方法 Method[] getDeclaredMethods() & 获得类声明的所有方法
四、反射怎么用?
上一章我们讲解了Java反射API,那么这一章我们将用一些代码实例来展示如何使用这些反射API。
Example 1: 从对象中获取类名
package com.longluo.java.interview.
public class ReflectionHelloWorld {
public static void main(String[] args) {
Foo f = new Foo();
System.out.println(f.getClass().getName());
class Foo {
public void print() {
System.out.println(&abc&);
com.longluo.java.interview.reflection.Foo
Example 2: 调用未知对象的方法
想象我们不知道一个对象的类型,但是通过反射,我们可以使用这个对象并且找到这个对象是否有个方法名叫print并且调用它,如下所示:
package com.longluo.java.interview.
import java.lang.reflect.M
public class ReflectionHelloWorld {
* public static void main(String[] args) { Foo f = new Foo();
* System.out.println(f.getClass().getName()); }
public static void main(String[] args) {
Foo f = new Foo();
method = f.getClass().getMethod(&print&, new Class[0]);
method.invoke(f);
} catch (Exception e) {
e.printStackTrace();
class Foo {
public void print() {
System.out.println(&abc&);
Example 3: 从Class实例创建对象
package com.longluo.java.interview.
import java.lang.reflect.M
public class ReflectionHelloWorld {
public static void main(String[] args) {
// create instance of &Class&
c = Class.forName(&com.longluo.java.interview.reflection.Foo&);
} catch (Exception e) {
e.printStackTrace();
// create instance of &Foo&
f = (Foo) c.newInstance();
} catch (Exception e) {
e.printStackTrace();
f.print();
class Foo {
public void print() {
System.out.println(&abc&);
Example 4: 获取构造器并创建实例
package com.longluo.java.interview.
import java.lang.reflect.C
public class ReflectionHelloWorld4 {
public static void main(String[] args) {
// create instance of &Class&
c = Class.forName(&com.longluo.java.interview.reflection.Foo4&);
} catch (Exception e) {
e.printStackTrace();
// create instance of &Foo&
// get all constructors
Constructor cons[] = c.getConstructors();
f1 = (Foo4) cons[0].newInstance();
f2 = (Foo4) cons[1].newInstance(&abc&);
} catch (Exception e) {
e.printStackTrace();
f1.print();
f2.print();
class Foo4 {
public Foo4() {
public Foo4(String s) {
public void print() {
System.out.println(s);
另外,你可以使用Class实例并获取实现的接口,父类,声明的方法等。
Example 5: 通过反射修改数组大小
package com.longluo.java.interview.
import java.lang.reflect.A
public class ReflectionHelloWorld5 {
public static void main(String[] args) {
int[] intArray = { 1, 2, 3, 4, 5 };
int[] newIntArray = (int[]) changeArraySize(intArray, 10);
print(newIntArray);
String[] atr = { &a&, &b&, &c&, &d&, &e& };
String[] str1 = (String[]) changeArraySize(atr, 10);
print(str1);
// change array size
public static Object changeArraySize(Object obj, int len) {
Class arr = obj.getClass().getComponentType();
Object newArray = Array.newInstance(arr, len);
// do array copy
int co = Array.getLength(obj);
System.arraycopy(obj, 0, newArray, 0, co);
return newA
public static void print(Object obj) {
Class c = obj.getClass();
if (!c.isArray()) {
System.out.println(&\nArray length:& + Array.getLength(obj));
for (int i = 0; i & Array.getLength(obj); i++) {
System.out.print(Array.get(obj, i) + & &);
Array length:10
1 2 3 4 5 0 0 0 0 0
Array length:10
a b c d e null null null null null
本文只是对Java反射很小的内容进行了讲解,大家有兴趣了解更多信息可以从网络查找资料。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
Java程序设计教程与实训(第2版)习题参考答案(1-9章)
下载积分:3000
内容提示:Java程序设计教程与实训(第2版)习题参考答案(1-9章)
文档格式:DOC|
浏览次数:67|
上传日期: 13:57:36|
文档星级:
全文阅读已结束,如果下载本文需要使用
 3000 积分
下载此文档
该用户还上传了这些文档
Java程序设计教程与实训(第2版)习题参考答案(1-9章)
关注微信公众号

我要回帖

更多关于 微信小程序json转数组 的文章

 

随机推荐