java中string类创建对象
大家好,java中string类被声明是final类的,为什么可以使用new来创建对象呢,如Stringstr=newString(data);是不是说所有的,我知道其它...
大家好,java中string类被声明是final类的,为什么可以使用new来创建对象呢,如String str = new String(data);是不是说所有的,我知道其它构造函数可以创建对象,final类的也可以吗,为什么呢?
展开
7个回答
2015-10-16 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
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对象的内容(值)。
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对象的内容(值)。
展开全部
final类只是说不能被继承,也就是所谓的“太监类”,不会有子类。你可是实例化,但是不能被其他类继承。
追问
也就是说除了抽象类,其它类都具有构造函数,都可以使用new来创建对象吗
追答
差不多,但也不能这么说吧,比如我们用单例模式的时候会把构造方法写成private的,这个时候你就不能再在其他类里new它了,在单例类内部也是可以new的。看你怎么理解了,都是可以new的,但是要看构造方法的作用域。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
final类是可以创建对象的,不能创建对象的是抽象方法(abstract)和接口(interface),final只是声明该类已经很完善了,不可以再被继承重写了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
final修饰的类不能被继承,也就是不能声明子类。
final修饰的方法不能被子类覆盖。
估计你没搞清楚final关键字的意思。
final修饰的方法不能被子类覆盖。
估计你没搞清楚final关键字的意思。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
final的变量的值不能被改变
final的方法不能被重写
final的类不能被继承
final的方法不能被重写
final的类不能被继承
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询