1.类&对象&构造方法

1.类&对象&构造方法

1. 类和对象的内存处理方式

1.1 方法区(method area)

  • 也称静态区,用于存放用户定义的各个类、静态变量等。

1.2 堆(heap)

  • 堆中存放对象和非静态变量。
  • 在使用new关键字产生对象后,对象会存放进堆中进行管理,对象名就是对象在堆中的地址。
  • 对象把被它调用的成员变量直接存储到堆中。
  • 对象把被它调用的成员方法地址存储到堆中,间接调用。
  • 堆中的内容会被垃圾回收器回收。

1.3 栈(stack)

  • 调用的方法都会进入到栈中(包括main方法),方法执行完成就出栈。若调用的是对象的方法,则会先进入堆中找到这个方法的地址,再根据地址进入方法区进行调用。

2. 对象作为方法的参数和返回值

  • 对象可作为方法的参数

    public void fun(Scanner scan){
        int i = scan.nextInt();
        System.out.println(i);
    }   
  • 对象可最为方法的返回值

    public Student getStu(){
        Student stu = new Student();
        stu.setName("XiaoMing");
        stu.setAge(11);

        return stu;
    }

3. 成员变量和局部变量

3.1 基本特征

  • 成员变量位于方法外,可供整个类使用;局部变量位于方法内,仅它所在的方法可使用。
  • 成员变量有默认值null,定义时可不赋值;局部变量没有默认值,定义时必须赋值。

3.2 内存管理

  • 由于成员变量在类中定义,而类实例化为对象后是进入堆中,故成员变量是在堆中进行管理。
  • 局部变量在方法中定义,方法是在栈中进行管理,故局部变量也在栈中进行管理。

3.3 生命周期

  • 局部变量在栈中,故最终随方法出栈以结束生命周期,周期较短。
  • 成员变量在堆中,故最终以垃圾回收的方式结束周期,周期较长。

3.4 this关键字的使用

  • 若某个类中,局部变量的名称和成员变量名称相同,则可使用this关键字对局部变量进行标识,以区分两个变量。
  • 若有多个类,则this表示的是造成重名的那个类。

4. private型变量的访问

  • 若类中有变量private int age,则在类以外无法直接访问这个变量。
  • 若要在类外访问private型变量age,需在类中定义setAge()和getAge()两个方法,按格式要求,变量名age的首字母必须为大写(idea中使用alt+insert可快速创建)。
  • setAge()和getAge()方法中可编写访问控制语句。

5. 构造方法

  • 构造方法用于创建对象,若默认的构造方法无法满足使用需求,可自定义构造方法,以替代默认方式,在创建对象时提供额外的功能(实现逻辑、为变量赋值等)。
  • 自定义的构造方法名需和类名相同。定义构造方法时,无需设置返回值类型。

    public class Student {
    public Student (){
        System.out.println("I"m a student");
    };
}
  • 构造方法可进行重载(可创建多个同名构造方法,方法名称相同,但参数列表不同,使用时根据参数列表进行区分)。

    public class Student {
    public Student (){
        System.out.println("I"m a student");
    };

    public Student(String name,int age){
        System.out.println("My name is"+name+", I"m "+age+"years old");
    }
}
  • 同一个类中的无参构造方法可用this调用本类中的有参构造方法:

    public class Student {
    public Student (){
       this("java",18) ;//无参构造方法中调用有参构造方法
        System.out.println("I"m a student");
    };

    public Student(String name,int age){
        System.out.println("My name is "+name+", I"m "+age+" years old");
    }
    /*输出结果:
    My name is java, I"m 18 years old
    I"m a student
    */
}

原文地址:https://www.cnblogs.com/efancn/archive/2022/12/01/16941367.html