关于#java#的问题,如何解决?

引用参数传递
public class Demo02{
    public static void main(string[] args) {
        Person p = new Person( 18"张三");
        system.out.println("调用参数之前:" + p);
        call(p);//p这里为实参
        system.out.println("调用参数之后:" + p);

    }
    public static void call(Person person){
    person.setAge(20);//person.age=this.age=age=20
    person.setName("李四");
    }

}
class Person{
    private int age;
    private String name;
    
    public Person(int age,string name) {
    this.age = age;        //  p.age=this.age=age;
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    @override
    public String toString() {
    return "Person [age=" + age + ", name=" + name + "]";

}
    //调用参数之前:Person [age=18,name=张三]
    //调用参数之后:Person [age=20,name=李四]

img

img

img

  1. person.setAge(20);
    person.setName("李四");person地址为什么不变?
  2. person=new Person(20,"李四");person地址就变了?只有new才能改变地址吗?
public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String[] fullname = new String[] { "Homer", "Simpson" };
        p.setName(fullname); // 传入fullname数组
        System.out.println(p.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
    }
}

class Person {
    private String[] name;

    public String getName() {
        return this.name[0] + " " + this.name[1];
    }

    public void setName(String[] name) {
        this.name = name;
    }
}

img

  1. fullname[0] = "Bart"; fullname[0]的地址变化了,p.name为什么不指向fullname[0]原来的地址?说一下原理?

new运算符实例化一个类对象,通过给这个对象分配内存并返回一个指向该内存的引用。new运算符也调用了对象的构造函数。
注意:“实例化一个类的对象”的意思就是“创建对象”。创建对象时,你正在创造一个类的“实例”,因而“实例化”一个类的对象。
new运算符需要一个单一的,后缀参数,需要调用构造函数。构造函数的名称提供了需要实例化类的名称。
new运算符返回它所创建的对象的引用。此引用通常被分配给一个合适的类型的变量,如:Point originone =new Point(23,94);
由new运算符返回的引用可以不需要被赋值给变量。它也可以直接使用在一个表达式中。例如: int height = new Rectangle().height;

1、首先我们的类的对象的类型有强类型、弱类型等,但凡new出来的对象都是强类型,目的是在垃圾回收的时候起作用,一旦new了,由于java的安全性,他就不会变化。
2、再次new就是另外一个对象了,当然地址也会变化。不仅仅只有new,还有赋值,比如Person p = new Person(0,""); person = p;也会变化
3、执行这句话(fullname[0] = "Bart")的意思是原来的"Homer"字符串对应的地址比如0x88指向fullname[0],但是fullname[0] = "Bart"了,那么"Bart"对应的地址比如0x99就指向了fullname[0],原来的"Homer"地址就在下一次GC时被回收