java怎么循环获取object的jq添加属性和值名和值?object内容如下

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解。
Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起。
Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现。
Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,具体的类定义结构如下图:
1.类构造器public Object();
大部分情况下,Java中通过形如 new A(args..)形式创建一个属于该类型的对象。其中A即是类名,A(args..)即此类定义中相对应的构造函数。通过此种形式创建的对象都是通过类中的构造函数完成。为体现此特性,Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一个无参数的构造函数,作为所有类的基类,Object类自然要反映出此特性,在源码中,未给出Object类构造函数定义,但实际上,此构造函数是存在的。
当然,并不是所有的类都是通过此种方式去构建,也自然的,并不是所有的类构造函数都是public。
2.private static native void registerNatives();
registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。用native修饰,即表示操作系统,需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身,其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
既然如此,可能有人会问,registerNatives()修饰符为private,且并没有执行,作用何以达到?其实,在Java源码中,此方法的声明后有紧接着一段静态代码块:
1 private static native void registerNatives();
2 static {
registerNatives();
3.protected native Object clone() throws CloneNotSupportedE
看,clone()方法又是一个被声明为native的方法,因此,我们知道了clone()方法并不是Java的原生方法,具体的实现是有C/C++完成的。clone英文翻译为"克隆",其目的是创建并返回此对象的一个副本。形象点理解,这有一辆科鲁兹,你看着不错,想要个一模一样的。你调用此方法即可像变魔术一样变出一辆一模一样的科鲁兹出来。配置一样,长相一样。但从此刻起,原来的那辆科鲁兹如果进行了新的装饰,与你克隆出来的这辆科鲁兹没有任何关系了。你克隆出来的对象变不变完全在于你对克隆出来的科鲁兹有没有进行过什么操作了。Java术语表述为:clone函数返回的是一个引用,指向的是新的clone出来的对象,此对象与原对象分别占用不同的堆空间。
明白了clone的含义后,接下来看看如果调用clone()函数对象进行此克隆操作。
首先看一下下面的这个例子:
1 package com.corn.
3 import com.corn.P
5 public class ObjectTest {
public static void main(String[] args) {
Object o1 = new Object();
// The method clone() from the type Object is not visible
Object clone = o1.clone();
例子很简单,在main()方法中,new一个Oject对象后,想直接调用此对象的clone方法克隆一个对象,但是出现错误提示:"The method clone() from the type Object is not visible"
why? 根据提示,第一反应是ObjectTest类中定义的Oject对象无法访问其clone()方法。回到Object类中clone()方法的定义,可以看到其被声明为protected,估计问题就在这上面了,protected修饰的属性或方法表示:在同一个包内或者不同包的子类可以访问。显然,Object类与ObjectTest类在不同的包中,但是ObjectTest继承自Object,是Object类的子类,于是,现在却出现子类中通过Object引用不能访问protected方法,原因在于对"不同包中的子类可以访问"没有正确理解。
"不同包中的子类可以访问",是指当两个类不在同一个包中的时候,继承自父类的子类内部且主调(调用者)为子类的引用时才能访问父类用protected修饰的成员(属性/方法)。 在子类内部,主调为父类的引用时并不能访问此protected修饰的成员。!(super关键字除外)
于是,上例改成如下形式,我们发现,可以正常编译:
1 package com.corn.
4 public class ObjectTest {
public static void main(String[] args) {
ObjectTest ot1 = new ObjectTest();
ObjectTest ot2 = (ObjectTest) ot1.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
是的,因为此时的主调已经是子类的引用了。
上述代码在运行过程中会抛出"java.lang.CloneNotSupportedException",表明clone()方法并未正确执行完毕,问题的原因在与Java中的语法规定:
clone()的正确调用是需要实现Cloneable接口,如果没有实现Cloneable接口,并且子类直接调用Object类的clone()方法,则会抛出CloneNotSupportedException异常。
Cloneable接口仅是一个表示接口,接口本身不包含任何方法,用来指示Object.clone()可以合法的被子类引用所调用。
于是,上述代码改成如下形式,即可正确指定clone()方法以实现克隆。
1 package com.corn.
3 public class ObjectTest implements Cloneable {
public static void main(String[] args) {
ObjectTest ot1 = new ObjectTest();
ObjectTest ot2 = (ObjectTest) ot1.clone();
System.out.println("ot2:" + ot2);
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
更多的关于Java克隆/复制相关的知识以后会给出专门的博文。
4.public final native Class&?& getClass();
getClass()也是一个native方法,返回的是此Object对象的类对象/运行时类对象Class&?&。效果与Object.class相同。
首先解释下"类对象"的概念:在Java中,类是是对具有一组相同特征或行为的实例的抽象并进行描述,对象则是此类所描述的特征或行为的具体实例。作为概念层次的类,其本身也具有某些共同的特性,如都具有类名称、由类加载器去加载,都具有包,具有父类,属性和方法等。于是,Java中有专门定义了一个类,Class,去描述其他类所具有的这些特性,因此,从此角度去看,类本身也都是属于Class类的对象。为与经常意义上的对象相区分,在此称之为"类对象"。
此处主要大量涉及到Java中的反射知识,关于反射相关知识后续也会给出相关博文。
5.public boolean equals(Object obj);
==与equals在Java中经常被使用,大家也都知道==与equals的区别:
==表示的是变量值完成相同(对于基础类型,地址中存储的是值,引用类型则存储指向实际对象的地址);
equals表示的是对象的内容完全相同,此处的内容多指对象的特征/属性。
实际上,上面说法是不严谨的,更多的只是常见于String类中。首先看一下Object类中关于equals()方法的定义:
1 public boolean equals(Object obj) {
return (this == obj);
由此可见,Object原生的equals()方法内部调用的正是==,与==具有相同的含义。既然如此,为什么还要定义此equals()方法?
equlas()方法的正确理解应该是:判断两个对象是否相等。那么判断对象相等的标尺又是什么?
如上,在object类中,此标尺即为==。当然,这个标尺不是固定的,其他类中可以按照实际的需要对此标尺含义进行重定义。如String类中则是依据字符串内容是否相等来重定义了此标尺含义。如此可以增加类的功能型和实际编码的灵活性。当然了,如果自定义的类没有重写equals()方法来重新定义此标尺,那么默认的将是其父类的equals(),直到object基类。
如下场景的实际业务需求,对于User bean,由实际的业务需求可知当属性uid相同时,表示的是同一个User,即两个User对象相等。则可以重写equals以重定义User对象相等的标尺。
1 package com.corn.
3 public class User {
private int
private int
public int getUid() {
public void setUid(int uid) {
this.uid =
protected String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) {
return false;
if (((User) obj).getUid() == this.getUid()) {
return true;
return false;
1 package com.corn.
3 public class ObjectTest implements Cloneable {
public static void main(String[] args) {
User u1 = new User();
u1.setUid(111);
u1.setName("张三");
User u2 = new User();
u2.setUid(111);
u2.setName("张三丰");
System.out.println(u1.equals(u2)); //返回true
ObjectTest中打印出true,因为User类定义中重写了equals()方法,这很好理解,很可能张三是一个人小名,张三丰才是其大名,判断这两个人是不是同一个人,这时只用判断uid是否相同即可。
如上重写equals方法表面上看上去是可以了,实则不然。因为它破坏了Java中的约定:重写equals()方法必须重写hasCode()方法。
6.public native int hashCode();
hashCode()方法返回一个整形数值,表示该对象的哈希码值。
hashCode()具有如下约定:
1).在Java应用程序程序执行期间,对于同一对象多次调用hashCode()方法时,其返回的哈希码是相同的,前提是将对象进行equals比较时所用的标尺信息未做修改。在Java应用程序的一次执行到另外一次执行,同一对象的hashCode()返回的哈希码无须保持一致;
2).如果两个对象相等(依据:调用equals()方法),那么这两个对象调用hashCode()返回的哈希码也必须相等;
3).反之,两个对象调用hasCode()返回的哈希码相等,这两个对象不一定相等。
即严格的数学逻辑表示为: 两个对象相等 &=& &equals()相等 &=& hashCode()相等。因此,重写equlas()方法必须重写hashCode()方法,以保证此逻辑严格成立,同时可以推理出:hasCode()不相等 =& equals()不相等 &=& 两个对象不相等。
可能有人在此产生疑问:既然比较两个对象是否相等的唯一条件(也是冲要条件)是equals,那么为什么还要弄出一个hashCode(),并且进行如此约定,弄得这么麻烦?
其实,这主要体现在hashCode()方法的作用上,其主要用于增强哈希表的性能。
以集合类中,以Set为例,当新加一个对象时,需要判断现有集合中是否已经存在与此对象相等的对象,如果没有hashCode()方法,需要将Set进行一次遍历,并逐一用equals()方法判断两个对象是否相等,此种算法时间复杂度为o(n)。通过借助于hasCode方法,先计算出即将新加入对象的哈希码,然后根据哈希算法计算出此对象的位置,直接判断此位置上是否已有对象即可。(注:Set的底层用的是Map的原理实现)
在此需要纠正一个理解上的误区:对象的hashCode()返回的不是对象所在的物理内存地址。甚至也不一定是对象的逻辑地址,hashCode()相同的两个对象,不一定相等,换言之,不相等的两个对象,hashCode()返回的哈希码可能相同。
因此,在上述代码中,重写了equals()方法后,需要重写hashCode()方法。
1 package com.corn.
3 public class User {
private int
private int
public int getUid() {
public void setUid(int uid) {
this.uid =
protected String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) {
return false;
if (((User) obj).getUid() == this.getUid()) {
return true;
return false;
public int hashCode() {
int result = 17;
result = 31 * result + this.getUid();
注:上述hashCode()的重写中出现了result*31,是因为result*31 = (result&&5) - result。之所以选择31,是因为左移运算和减运算计算效率远大于乘法运算。当然,也可以选择其他数字。
7.public String toString();
toString()方法返回该对象的字符串表示。先看一下Object中的具体方法体:
1 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
toString()方法相信大家都经常用到,即使没有显式调用,但当我们使用System.out.println(obj)时,其内部也是通过toString()来实现的。
getClass()返回对象的类对象,getClassName()以String形式返回类对象的名称(含包名)。Integer.toHexString(hashCode())则是以对象的哈希码为实参,以16进制无符号整数形式返回此哈希码的字符串表示形式。
如上例中的u1的哈希码是638,则对应的16进制为27e,调用toString()方法返回的结果为:com.corn.objectsummary.User@27e。
因此:toString()是由对象的类型和其哈希码唯一确定,同一类型但不相等的两个对象分别调用toString()方法返回的结果可能相同。
8/9/10/11/12. wait(...) / notify() / notifyAll()
一说到wait(...) / notify() | notifyAll()几个方法,首先想到的是线程。确实,这几个方法主要用于java多线程之间的协作。先具体看下这几个方法的主要含义:
wait():调用此方法所在的当前线程等待,直到在其他线程上调用此方法的主调(某一对象)的notify()/notifyAll()方法。
wait(long timeout)/wait(long timeout, int nanos):调用此方法所在的当前线程等待,直到在其他线程上调用此方法的主调(某一对象)的notisfy()/notisfyAll()方法,或超过指定的超时时间量。
notify()/notifyAll():唤醒在此对象监视器上等待的单个线程/所有线程。
wait(...) / notify() | notifyAll()一般情况下都是配套使用。下面来看一个简单的例子:
1 package com.
3 public class ThreadTest {
* @param args
public static void main(String[] args) {
// TODO Auto-generated method stub
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
synchronized (r) {
System.out.println("main thread 等待t线程执行完");
System.out.println("被notity唤醒,得以继续执行");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("main thread 本想等待,但被意外打断了");
System.out.println("线程t执行相加结果" + r.getTotal());
28 class MyRunnable implements Runnable {
private int
public void run() {
// TODO Auto-generated method stub
synchronized (this) {
System.out.println("Thread name is:" + Thread.currentThread().getName());
for (int i = 0; i & 10; i++) {
System.out.println("执行notif后同步代码块中依然可以继续执行直至完毕");
System.out.println("执行notif后且同步代码块外的代码执行时机取决于线程调度");
public int getTotal() {
运行结果为:
1 main thread 等待t线程执行完
2 Thread name is:Thread-0
3 执行notif后同步代码块中依然可以继续执行直至完毕
4 执行notif后且同步代码块外的代码执行时机取决于线程调度
//此行输出位置有具体的JVM线程调度决定,有可能最后执行
5 被notity唤醒,得以继续执行
6 线程t执行相加结果45
既然是作用于多线程中,为什么却是Object这个基类所具有的方法?原因在于理论上任何对象都可以视为线程同步中的监听器,且wait(...)/notify()|notifyAll()方法只能在同步代码块中才能使用。
&从上述例子的输出结果中可以得出如下结论:
1、wait(...)方法调用后当前线程将立即阻塞,且适当其所持有的同步代码块中的锁,直到被唤醒或超时或打断后且重新获取到锁后才能继续执行;
2、notify()/notifyAll()方法调用后,其所在线程不会立即释放所持有的锁,直到其所在同步代码块中的代码执行完毕,此时释放锁,因此,如果其同步代码块后还有代码,其执行则依赖于JVM的线程调度。
在Java源码中,可以看到wait()具体定义如下:
public final void wait() throws InterruptedException {
且wait(long timeout, int nanos)方法定义内部实质上也是通过调用wait(long timeout)完成。而wait(long timeout)是一个native方法。因此,wait(...)方法本质上都是native方式实现。
notify()/notifyAll()方法也都是native方法。
Java中线程具有较多的知识点,是一块比较大且重要的知识点。后期会有博文专门针对Java多线程作出详细总结。此处不再细述。
13. protected void finalize();
finalize方法主要与Java垃圾回收机制有关。首先我们看一下finalized方法在Object中的具体定义:
1 protected void finalize() throws Throwable { }
我们发现Object类中finalize方法被定义成一个空方法,为什么要如此定义呢?finalize方法的调用时机是怎么样的呢?
首先,Object中定义finalize方法表明Java中每一个对象都将具有finalize这种行为,其具体调用时机在:JVM准备对此对形象所占用的内存空间进行垃圾回收前,将被调用。由此可以看出,此方法并不是由我们主动去调用的(虽然可以主动去调用,此时与其他自定义方法无异)。
JVM垃圾回收机制是Java中重点的一块内容,在以后的博文中也将会详细总结。
阅读(...) 评论()本文讲的是javascript使用Object.keys遍历对象属性名,
在实际开发中,我们有时需要知道对象的所有属性,js原生给我们提供了一个很好的方法:Object.keys,该方法返回一个数组
var obj = {
'a':'123',
'b':'345',
在实际开发中,我们有时需要知道对象的所有属性,js原生给我们提供了一个很好的方法:Object.keys,该方法返回一个数组
var obj = {
'a':'123',
'b':'345',
console.log(Object.keys(obj));
//['a','b']
值得注意的是,如果keys方法里传入的是字符串,也会返回数组,只是数组里的值是字符串中每个字符的索引:
var str = 'ab1234';
console.log(Object.keys(obj));
//[0,1,2,3,4,5]
例子,遍历数组和遍历对象的区别
//----------------for用来遍历数组对象--
var i,myArr = [1,2,3];
for (var i = 0; i & myArr. i++) {
console.log(i+":"+myArr[i]);
//---------for-in 用来遍历非数组对象
var man ={hands:2,legs:2,heads:1};
//为所有的对象添加clone方法,即给内置原型(object,Array,function)增加原型属性,该方法很强大,也很危险
if(typeof Object.prototype.clone ==="undefined"){
Object.prototype.clone = function(){};
for(var i in man){
if (man.hasOwnProperty(i)) { //filter,只输出man的私有属性
console.log(i,":",man[i]);
//输出结果为print hands:2,legs:2,heads:1
for(var i in man) {//不使用过滤
console.log(i,":",man[i]);
//输出结果为
//hands : 2 index.html:20
//legs : 2 index.html:20
//heads : 1 index.html:20
//clone : function (){}
for(var i in man) {
if(Object.prototype.hasOwnProperty.call(man,i)) { //过滤
console.log(i,":",man[i]);
//输出结果为print hands:2,legs:2,heads:1
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
jsonobject遍历keys、javascript遍历object、javascript 遍历对象、java 遍历object对象、遍历jsonobject对象,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
的信息,还有jsonobject遍历keys、javascript遍历object、javascript 遍历对象、java 遍历object对象、遍历jsonobject对象等
,所有相关内容均不代表云栖社区的意见!4904人阅读
java(20)
http://chengxuyuan./.html
如何遍历一个实例的所有属性,得到属性的名称和值
& Type & t & = & this.GetType(); &
& MethodInfo & mii & = & t.GetProperty(&a&).GetGetMethod(); &
& Console.WriteLine(mii.Invoke(this,null));
利用反射。 &
& static & void & Main(string[] & args) &
& MoneyHome.Class.DataOperate & d & = & new & MoneyHome.Class.DataOperate();//实例 &
& Type & t & = & d.GetType(); &
& MessageBox.Show(t.Namespace,&DataOperate类的命名空间&); &
& MessageBox.Show(t.IsClass.ToString(),&DataOperae是不是一个类&); &
& MemberInfo[] & m & = & t.GetMembers(); &
& StringBuilder & st & = & new & StringBuilder(800); &
& foreach(MemberInfo & m1 & in & m) &
& st.Append(&Members: & & &); &
& st.Append(m1.ToString()); &
& st.Append(&\n&); &
& Type & t & = & this.GetType(); &
& PropertyInfo[] & arrpf= & t.GetProperties(); &
& foreach(PropertyInfo & p & in & arrpf) &
& // MethodInfo & mii & = & t.GetProperty(p.Name).GetGetMethod(); &
& // Console.WriteLine(mii.Invoke(this,null)); &
& Console.WriteLine(p.GetValue(this,null).ToString()); &
public class MyTools {
??? public static void setAllComponentsName(Object f) {
// 获取f对象对应类中的所有属性域
&Field[] fields = f.getClass().getDeclaredFields();
&for(int i = 0 , len = fields. i & i++) {
&// 对于每个属性,获取属性名
&String varName = fields[i].getName();
&// 获取原来的访问控制权限
&boolean accessFlag = fields[i].isAccessible();
&// 修改访问控制权限
&fields[i].setAccessible(true);
&// 获取在对象f中属性fields[i]对应的对象中的变量
&Object o = fields[i].get(f);
&System.out.println(&传入的对象中包含一个如下的变量:& + varName +? & = & + o);
&// 恢复访问控制权限
&fields[i].setAccessible(accessFlag);
&} catch (IllegalArgumentException ex) {
&ex.printStackTrace();
在类中定义了一个属性abc,如何获取这个变量的abc的名字串呢?也就是说怎么知道abc这个变量的名字是abc,这个问题比较的好玩。这个是偶在一开发中遇到的一个比较有趣的问题,找了半天的资料加下偶辛勤的思考,终于找到的解决方法。用反射~~~ java提供了很强大的反射机制,可以说比动态语言还动态。但是这个东东平时的应用不是很多的说。现提供一个可以动态获取对象中的变量的变量名称的方法: public class MyTools { public static void setAllComponentsName(Object
f) { // 获取f对象对应类中的所有属性域 Field[] fields = f.getClass().getDeclaredFields(); for(int i = 0 , len = fields. i & i++) { // 对于每个属性,获取属性名 String varName = fields[i].getName(); try { // 获取原来的访问控制权限 boolean accessFlag = fields[i].isAccessible(); // 修改访问控制权限
fields[i].setAccessible(true); // 获取在对象f中属性fields[i]对应的对象中的变量 Object o = fields[i].get(f); System.out.println(&传入的对象中包含一个如下的变量:& + varName + & = & + o); // 恢复访问控制权限 fields[i].setAccessible(accessFlag); } catch (IllegalArgumentException ex) { ex.printStackTrace();
} catch (IllegalAccessException ex) { ex.printStackTrace(); } } } public static void main(String[] args) { // 测试代码用来获取一个JLabel中声名的所有的属性名和其属性变量 setAllComponentsName(new JLabel(&测试&)); } } fields[i].setAccessible(true); 这句主要是因为私有的变量在对象外是无法访问的,通过这个设置就可以改变私有变量的访问权,还真的有点恐怖,当偶把这个解决方法告诉Boss的时候,Boss差点吐血,私有的都能访问了,还有什么安全可言?不过了,有安全就有特权,所以由于能很好的解决问题还是被采纳了,嘻嘻~~~
Object o = fields[i].get(f); 这句的作用就是取得传入对象f中类的属性fields[i]对应的真实的属性变量,说的有点别扭,比如有一个类A中有一个int abc的属性,并且我们有两个A类的对象a1,a2,那么当我们用fields[i].get(a1) 的时候得到的将是对象a1中的具体的abc属性,而我们用fields[i].get(a2) 的时候得到的将是对象a2中的具体的abc属性。最后是用一个main方法测试了一个JLabel对象,打印出了JLabel中声名的所有的变量名,并输出了其对应的变量的值。结果如下:传入的对象中包含一个如下的变量:uiClassID
= LabelUI 传入的对象中包含一个如下的变量:mnemonic = 0 传入的对象中包含一个如下的变量:mnemonicIndex = -1 传入的对象中包含一个如下的变量:text = 测试传入的对象中包含一个如下的变量:defaultIcon = null 传入的对象中包含一个如下的变量:disabledIcon = null 传入的对象中包含一个如下的变量:disabledIconSet = false 传入的对象中包含一个如下的变量:verticalAlignment = 0 传入的对象中包含一个如下的变量:horizontalAlignment
= 10 传入的对象中包含一个如下的变量:verticalTextPosition = 0 传入的对象中包含一个如下的变量:horizontalTextPosition = 11 传入的对象中包含一个如下的变量:iconTextGap = 4 传入的对象中包含一个如下的变量:labelFor = null 传入的对象中包含一个如下的变量:LABELED_BY_PROPERTY = labeledBy
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:277303次
积分:2633
积分:2633
排名:第13843名
原创:35篇
转载:52篇
评论:14条
(2)(3)(5)(1)(2)(9)(3)(3)(7)(4)(2)(4)(2)(15)(16)(9)}

我要回帖

更多关于 java 求多项式的和值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信