❶ java用字符串动态创建对象
类似这样动态创建对象的,都是用到JAVA的反射机制来实现的,有时间去研究一下吧。给个代码。try {
Class c =Class.forName("java.lang.String");
String s = (String)c.newInstance();
System.out.println(s.getClass().getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
❷ java里,请问这种方式创建了几个字符串对象
2个
❸ java中string类创建对象
Java中String是一个特殊的包装类数据有两种创建形式:
String s = "abc";
String s = new String("abc");
第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值'a'、'b'、'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{'a'、'b'、'c'},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。
第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
第二种可以分解成两步1、String object = "abc"; 2、String s = new String(object); 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。
第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。
在讲字符串比较前,必须要了解==和equals的区别:
因为java所有类都继承于Object基类,而Object中equals用==来实现,所以equals和==是一样的,都是比较对象地址,java api里的类大部分都重写了equals方法,包括基本数据类型的封装类、String类等。对于String类==用于比较两个String对象的地址,equals则用于比较两个String对象的内容(值)。
❹ 关于JAVA字符串对象创建的问题
String a = “abc”;
String b = new String(“abc”);
a指向常量区的“abc”
b指向变量区“abc”
若还是 String a = “abc”; String b = “abc”;
a和b均指向常量区的“abc”,指向相同。
❺ String 创建几个对象问题(详解
1
String a = new String("b");
创建两个对象
"b"在String pool池中,当创建对象时,堆中会拷贝String池中”b“作为一个对象b1,
然后建立一个新对象该对象的引用a指向b1;
所以创建两个对象。
2
String c="b";
"b"在String池中,c指向该对象;
3
String a="i"+"u"+"s0";
这相当于String a="ius0".当JVM执行到这一句时,就在String pool里找,如果String pool里没有这个字符串,就会产生一个对象(见java面试宝典174页)
如果String pool里有这些字符串就产生2个对象 原因:每做一个连接便会产生一个对象.
4
String a="b";
a=a+"b";//有两个对象,第一a是个对象 2 a+"b"为一个对象
这时 原来 a指向的对象就变为垃圾对象,但后面又被用到所以没被回收 和"b'进行连接成为bb
5
String a="b";
a=a+"c";//有两个对象,第一"c"是个对象 2 a+"c"为一个对象
此时a原来指向的对象成为垃圾对象,由jvm垃圾回收机制回收
6
String c;创建对象个数为 0;
初始化为null
❻ java中如何创建int char String类型的对象
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
boolean -->Boolean
char --->Character
byte -->Byte
short -->Short
int -->Integer
long -->Long
float -->Float
double -->Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。同时为了面向对象操作的一致性,这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。
因为封装类型是对象,所以可以进行相应的很多对象能力函数操作,这样就可以提供很多基本类型难以完成的工作的完成和实现。
你可以通过以下方式来声明该类型。
int a,a为int类型的变量
char a,a为char类型的
String对象
1. 首先String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
3. String str=”punkll”;
String str=new String (“punkll”);的区别:
在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
看例1:
String s0=”punkll”;
String s1=”punkll”;
String s2=”punk” + “ll”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
结果为:
true
true
首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”punkll”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”punk”和”ll”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”punkll”的一个引用。
所以我们得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
看例2:
String s0=”punkll”;
String s1=new String(”punkll”);
String s2=”punk” + new String(“ll”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
结果为:
false
false
false
例2中s0还是常量池中”punkll”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”punkll”的引用,s2因为有后半部分new String(“ll”)所以也无法在编译期确定,所以也是一个新创建对象”punkll”的应用;明白了这些也就知道为何得出此结果了。
❼ 如何用html字符串创建jquery对象
用html字符串创建jquery对象的方法是通过js预发构造出来的。
以下通过div的构造后,追加字符串为例来说明
1、创建一个js变量,存放构造div的表达式:
var string = '<div><input type="text" value="val" /></div>';
2、通过1创建的div,在其标签之间追加html内容:
$('<div/>').html(string).contents();
以上1和2主要执行过程如下:
$('<div/>')是一个并不存在的dom对象是通过执行js表达式动态构建出来的
$('<div/>').html(string) 追加string内容到div之间作为子节点
.contents()把上面创建的div作为jquery对象来检索内容,创建一个真正的div
❽ javascript 创建字符串对象
对于基础类型的变量是不能给它添加自定义属性的,包括字符串、数字、布尔值等等。但new String()却是一个对象,对象是可以添加属性的,所以str = 'Hello world'是基础类型,添加新属性name是不会成功的,打印结果也就是undefined。
❾ 怎么创建单字符输入对象
、 枚举法
由于同事的需求只涉及到基本类型的创建,由于基本对象的个数是有限的(也就那么几个),所以我们这里可以用枚举的方式动态的创建想要的对象,虽然有些繁琐,但是还是可以实现我们的需求的。关键代码如下:
/**
* 根据传入的类名和值,动态构造该类的实例
*
* @param _sClassName
* 要构造的类名 如:java.lang.String
* @param _sRealValue
* 要创建的对象的值,比如“wuguowei”
* @return 返回String对象,即值为“wuguowei”的字符串
* @throws Exception
*/
private Object getAttributeObject(String _sClassName, String _sRealValue)
throws Exception {
//1.加载类对象
Class attrObjClass = Class.forName(_sClassName);
//2.如果是Long类
if (attrObjClass.isInstance(new Long(0))) {
return new Long(_sRealValue);
}
//3.如果是Integer类
if (attrObjClass.isInstance(new Integer(0))) {
return new Integer(_sRealValue);
}
//4.其他类型……
//5.返回当前类的实例对象
return attrObjClass;
}
上面的代码虽然可以通过枚举的方式实现我们的需求,但是很繁琐,需要对每个对象进行枚举,这里还只支持传入一个String类型的参数,如果要传入多个参数,那么这个函数的逻辑将会很复杂。
二、 Constructor反射法
我们应该好好想想,这么NB的java语言应该没这么笨,应该有更简单的方法。经过同事的讨论后,发现一种比较好的方式。就是通过Constructor类反射出对应的类对象,接着再获取指定参数的构造函数,最后根据传入的值实例化对象即可得到我们想要的对象。通过这个方法,我们会发现我们的代码很简单,而且很容易懂。另外,这个方法可以动态构造任何java对象。闲话少说,直接看代码吧。具体代码如下:
/**
* 根据传入的类名和值,动态构造该类的实例
*
* @param _sClassName
* 要构造的类名 如:java.lang.String
* @param _sRealValue
* 要创建的对象的值,比如“wuguowei”
* @return 返回String对象,即值为“wuguowei”的字符串
* @throws Exception
*/
private Object getAttributeObject1(String _sClassName, String _sRealValue)
throws Exception {
// 1. 根据指定的类名,获取到对应的类
Class clazz = Class.forName(_sClassName);
// 2. 获取指定参数类型的构造函数,这里传入我们想调用的构造函数所需的参数类型
Constructor constructor = clazz.getConstructor(String.class);
// 3. 根据构造函数,创建指定类型的对象,传入的参数个数需要与上面传入的参数类型个数一致
Object object = constructor.newInstance(_sRealValue);
// 4.返回对象
return object;
}
三、 执行代码
调用上边的代码如下:
CreateClassByString aCreateClassByString = new CreateClassByString();
Object oObject = aCreateClassByString.getAttributeObject1(
"java.lang.String", "wuguowei");
System.out.println("结果::"+oObject);
执行结果如下:
结果::wuguowei