学习笔记--Java构造方法

Java构造方法

关于构造方法

  • 构造方法又被称作:构造函数/构造器/Constructor

  • 语法结构:

    [修饰符列表] 构造方法名(形式参数列表){
    构造方法体;
    }

    对比普通方法语法结构

    [修饰符列表] 返回值类型 构造方法名(形式参数列表){
    构造方法体;
    }
    • 对于构造方法来说,返回值类型 不需要指定,也没有 void

    • 写了 void 就是普通方法

  • 对于构造方法的方法名必须与类名保持一致

  • 构造方法的作用:

    • 存在意义,通过构造方法的调用,可以创建对象
    • 创建对象的同时,初始化实例变量的内存空间
  • 构造方法如何调用?

    普通方法调用:

    • static 是:类名.方法名(实参列表)
    • static 是:引用.方法名(实参列表)

    构造方法调用:

    • new 构造方法名(实参列表)
  • 构造方法有返回值

    但不需要写 return 返回值;,构造方法结束后Java程序自动返回

    由于返回值类型是构造方法所在类的类型,所以返回值类型不用写

    如果类中没有人为写构造方法,其中还存在一个默认无参数构造方法

    new 构造方法名(){
    // 其中有代码,初始化实例变量的内存空间
    // 不然实例变量哪里来的默认值呢
    }

    【回忆】实例变量默认值:

    • byte,short,int,long 默认值 0
    • float,double 默认值 0.0
    • boolean 默认值 false
    • 引用数据类型 默认值 null
  • 构造方法支持支持重载机制

public class ConstructorTest {
public static void main(String[] args) {
User u1 = new User();
User u2 = new User("jock");
User u3 = new User(10);
}
}
public class User{
// 用户编号
private int id;
// 用户名称
private String name;
// 下列三个构造方法,
// this 可以暂时看作类引用后的对象或实例的一个代称
public User(){
}
public User(String n){
this.name = n;
System.out.println("String");
}
public User(int num){
this.id = num;
System.out.println("int");
}
}

参数传递

  • 【回顾】对象和引用梳理:

    • 对象【实例】:目前在使用 new 运算符在堆内存中开辟的内存空间称为对象

    • 引用:是一个变量,不一定是局部变量也可能是成员变量。

      引用保存了内存地址,指向了堆内存中的对象

参数传递中变量的变化

  • 不变
public class Test01 {
public static void main(String[] args) {
int a = 10; // 10 a 是main方法的局部变量
add(i); // 11 其中main方法 a 的值传入add方法 i
// 使用 add(i); 中的 i++ 不会影响到 main方法 a
System.out.println(a); // 10 没有变化
}
public static void add(int i){
// i 是add方法局部变量
i++;
System.out.println("add --> " + i);
}
}
  • 改变
public class Test02 {
public static void main(String[] args) {
User u = new User(10); // u.age 10
add(u); // 11
// u中的是内存地址,指向对象
// u 传入后 ,user 也会保存一个与 u 中相同的内存地址
System.out.println("main --> " + u.age); // 11
// 虽然是两个地址,但指向同一个对象
}
public static void add(User user){
user.age++;
System.out.println("add --> " + user.age);
}
}
class User{
// 实例变量
int age;
// 构造方法
public User(int i){
age = i;
}
}

比喻:

  • 两个人,都有10元现金虽然钱一样多,但各是个的。有而是20元,各用各的

  • 两个人,都知道一串密码【银行卡共用10元】,可以通过密码去银行取存钱。有而是10元,共有通过密码

    • 密码 ------ 引用中保存的内存地址
    • 银行卡 ---- 对象【实例】
    • 去银行 ---- 方法
    • 钱 -------- 实例变量

常规数据

int i = 10;
int j = i;
// i 传递给 j,实际只是将 i 变量中保存的 10 传递给 j,j 实际上是一块全新的内存空间

涉及引用数据

User u1 = 0x1234; // 0x1234内存地址,new运算符+调用构造方法
User u2 = u1;
// u1 传递给 u2,实际上是将0x1234这个值赋值给 u2,与上面是一样的,u1 和 u2各是两个不同的局部变量
// 不过在此之上 u1 和 u2 保存内存地址0x1234指向堆内存中的同一个对象【实例】

Java面向对象



posted @   sha0dow  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示