String类调用方法时为啥不用new对象

String类调用方法时为什么不用new对象
问题一:比如"abc".length直接就用了.

问题二:
在A类创建了一个C类的对象can  在B类创建了一个C类的对象can  他们是不是同一样? 他们都在堆内存的啊  另外B类想调用A创建的对象can怎么弄
------解决思路----------------------
问题一:
   "abc".length这样的模式是调用字符串"abc"的成员变量length,可惜String类中没有定义这个成员变量,你可以调用 "abc".length(),因为String类定义了一个方法length()。

问题二:
创建了一个类的对象,看怎么创建,一般情况下通过new会在堆空间开辟空间,A类中new一个,B类中new一个,这两个不是同一个对象实例。但是如果是单例模式或者枚举类,不通过new获得,对象会是同一个。

B类想调用A创建的对象can怎么弄
这个情况没说清楚不好回答,要看你的can是成员变量还是局部变量
要是成员变量  就要设置B能访问这个成员can,或者通过方法访问,要是局部变量,还是要有个成员变量,先把can的值赋给成员变量,在通过B访问这个成员变量,获取到can的实例对象的地址值。


------解决思路----------------------
二楼说的很清楚了,问题一我没去深究过;问题二来说,绝大多数情况下,不同的类里面创造同一个类的实例,他们都是不同的,起码地址不同。
B类调用A类的can对象来说,你可以把can对象设置成static的,这样可以通过这样调用了:A.can;
或者说你在A类设置一个方法,返回类型设置成C类型,这样你可以在B类通过实例化A类来调用这个得到can对象的方法;
------解决思路----------------------
"abc".length() 这种调用跟java一个叫自动装箱的机制有关;abc直接被包装成对象了,

A类里操作C can对象;
想操作对象,必然是通过方法,假如这个方法叫 method.你想叫method操作can,就一定需要method能看到can;
方式一;你把can当参数传递给了method,不管你哪里声明的can,只要能传;
method(C can){
can.setAge(10);或者can.age=10;根据C的定义
}
方式二; can在你的成员变量里或者在A的外围类的成员变量里;
class A{
 C can=new C();
public method(){
can.setAge(10);//或can.age=10;
}
}
class Outer{
C can=new C();
class A{
public method(){
can.setAge(10);//或can.age=10;
}
}
}
方式三;can在你的method内部()

method(){
C can=new C();
can.setAge(10);或者can.age=10;根据C的定义
}
------解决思路----------------------
引用:
Quote: 引用:

第一个问题:“abc”会被认为是一个String类的对象。它存储的位置在java常量区,可以暂时理解为这么写就是new了一个String,实际上它和new有区别的(关于存储位置以及生成时机的区别)。

第二个问题:两次new从不会返回同一个对象。尽管它们可能内容一样且都在内存里,但是它们的位置不同,占用相互独立的空间。
访问对象的成员需要两个条件:1、持有对象的引用(即有一个引用(”等于")那个对象的变量);2:、该成员的访问性允许你访问。


说错了


我就是想说A创建了一个C类型 对象 can 比如他有一个年龄是10   ,我想 在A类获得 这个C类型对象can, 并且修改can的年龄为15  并且想调用他的打印年龄方法  不知怎么弄.


在A类中保存C类的对象can的引用,如果你想直接修改can的年龄属性,那么年龄的访问修饰符应该是public的;不过一般我们将属性的访问修饰符设为private,可以为它添加set和get方法,修改和获得这个属性。
示例如下:

public class A{
private C can;
public A(int age) {
can = new C(age);
}
public C getC(){
return can;
}
public void change(){
can.setAge(15);
can.printAge();
}
public static void main(String[] args) {
new A(10).change();
}
}
class C{
private int age;
public C(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public void printAge() {
System.out.println("AGE : " + age);
}
}