9.方法传参与构造方法

本文探讨了Java中对象实例化的内存存储,特别是方法传参的原理,强调了基本类型与引用类型的区别。介绍了构造方法的使用,包括其执行时机和作用。此外,讲解了this关键字的含义,并详细阐述了方法重载的条件和注意事项。最后,对比了成员变量与局部变量在作用域和初始值方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、关于对象实例化时在内存中的存储

在这里插入图片描述

关于字符串

 String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");

        System.out.println(s1);
        System.out.println(s2);
        // ==在基础数据类型中,比较的是值;在引用数据类型中,比较的是地址
        //原因是栈存储的不同
        System.out.println(s1==s2);//true
        System.out.println(s2==s3);//false
        System.out.println(s3==s4);//false

2、关于方法传参

    public static void main(String[] args) {
        int i=1;
        String s="1";
        Dog dog= new Dog();
        dog.name="1";
        System.out.println(i);
        System.out.println(s);
        System.out.println(dog.name);
        m1(i);
        m2(s);
        m3(dog);
        System.out.println(i);
        System.out.println(s);
        System.out.println(dog.name);

        
        public static void m1(int i){
            i=i+1;
            System.out.println("i=============="+i);
        }

        public static void m2(String s){
            s=s+"1";
        }

        public static void m3(Dog d){
            //d.name=d.name+"1";
            d=new Dog();
            d.name="2";
        }

对于所有的传递都是通过副本传递

对于基本数据类型,由于基本数据类型在堆内存中本来就是值,所以你传递后,仅仅修改副本的值,是不会影响到原先调用的部分

对于引用数据类型,由于存储的是地址,所以你在传递后,修改是会影响到调用方的

字符串比较特殊,他不会因为你修改了就直接对你的字符串常量池作修改,字符串的修改是将你的引用改成新的引用。

3、构造方法

格式:

方法名与类名相同,大小写也要一致

没有返回值类型,连void都没有

没有具体的返回值(不能由return带回结果数据)

执行时机:

创建对象的时候调用,每创建一次对象,就会执行一次构造方法

不能手动调用构造方法(即不可以.Dog)

作用:

用于给对象的属性进行初始化

class student{
    int age;
    
    public student(){
        age=18;
    }
}
//上面这是不合理的,会使得所有的student对象的age都是18
//应该使用下面这个方式
class student{
    int age;
    
    public student(int age){
        this.age=age;//也可以写为age=age,
        //但是前一个为类中的成员变量age,后一个为int age的局部变量,
        //此时为了区分,可以给成员变量加上this.
    }
}
//调用时如下
student st1 = new student(23)
        //无参数的构造方法
        public DOg(){
            System.out.println("这是无参数的构造方法");
            System.out.println("构造方法,每当我们new一个Dog的时候就会执行");
        }
        //有参数的构造方法
        public Dog(String s1,int i1){
            System.out.println("这是有参数的构造方法,它有两个参数,第一个是string"+s1);
            System.out.println("这是有参数的构造方法,它有两个参数,第二个是int"+i1);
           name=s1;
           age=i1;
        }
        //以上这种既含有参构造器,又含有无参构造器的方法,称之为构造器的重载-reload

4、关于this关键字

        //构造方法,如果你一个都不写
        //那么javac编译时会自动生成一个无参共有的构造方法
        //如果你写了某一个构造方法,那么你这个自动生成的无参共有的构造方法将不在生成
        public Cat(String name) {
            //this();将会调用当前类的构造方法
            //如果你括号中存在参数,则会调用对应的含参构造器
            //注意,this();调用的构造器之后不可以再直接或间接调用回当前的构造器
            //否则会发生死循环
            this();
            //this关键字代表的”这个当前的对象“
            //我们可以使用this(),this.等第
            //this()就相当于当前对象调用无参构造方法
            //this.就相当于使用当前对象调用某个属性/方法
            this.name = name;
            this.play();
            //打印当前的对象
            System.out.println(this);
        }

5、关于方法的重载

方法重载的特点:

在同一类中

方法名相同

参数个数或者参数类型不同

与返回值、修饰符无关

        //以下三个方法均为System.out这个PrintStream类的方法
        //由于他们三个参数不同,依次是String、int、Dog(object)
        //也就是说,他们满足方法重载的定义,所以我们称之为println();方法的重载
        System.out.println("abc");
        System.out.println(123);
        System.out.println(new Dog());
    }

方法重载,我们需要让JVM在执行代码的时候可以准确定位出,我们需要调用的方法由于方法名是一样的,对于不同的返回值而言,存在返回值可以不去接受这种情况

        public class A {
            public void method1() {
                System.out.println("method1");
            }

            public String method1() {
                System.out.println("123");
                return "";
            }
        }
        pulic static void main (String[]args){
            A a = new A();
            a.method1();
            a.method1();
        }

如同上述案例,我们都无法区分13和14行到底执行的是3还是6行代码,所以Java不允许写重名、同参的方法,除非你这几个同名方法的参数不同,此时称之为方法的重载。

6、成员变量

局部变量的作用域仅限于定义它的方法

成员变量的作用域在整个类内部都是可见的

初始值不同

Java会给成员变量一个初始值

Java不会给局部变量赋予初始值

在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级(就近原则)
的是3还是6行代码,所以Java不允许写重名、同参的方法,除非你这几个同名方法的参数不同,此时称之为方法的重载。

6、成员变量

局部变量的作用域仅限于定义它的方法

成员变量的作用域在整个类内部都是可见的

初始值不同

Java会给成员变量一个初始值

Java不会给局部变量赋予初始值

在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级(就近原则)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值