Java新手小白入门篇 Java面向对象(二)

本文详细介绍了构造方法的概念、作用、定义及调用方式,并通过示例代码展示了构造方法如何给成员变量赋初始值。此外,还讲解了this关键字的作用及使用场景,包括区分成员变量与局部变量同名的情况。

一、构造方法
1. 知识点概括
构造方法:又称构造函数、构造器、构建器
与类同名,没有返回值类型的方法叫构造方法
作用:帮助完成对象的创建并对属性(成员变量)进行初始化
使用:当(new)创建对象(实例化)时,会自动调用对应的构造方法
构造方法也是方法的一种,有些特殊,但是一样可以重载
构造方法的定义特殊
构造方法的调用特殊
Java编译器默认会提供一个无参构造,但是如果自定义了构造方法,默认的无参构造会被覆盖,如果需要用到无参构造需要手动添加
2. 构造方法的结构(如何定义构造方法)

在这里插入图片描述
与类同名,没有返回值类型的方法,可以含参可以不含参

 
public class Student {
    // 构造方法
    Student() {}
}
3. 调用构造方法请添加图片描述
public class Student {
    // 构造方法
    Student() {
        System.out.println("Student的无参构造");
    }
}

 

public class ConstructTest {
    public static void main(String[] args) {
        Student  s1 = new Student();
    }
}
4. 默认提供一个无参构造
Java编译器默认会提供一个无参构造,但是如果自定义了构造方法,默认的无参构造会被覆盖,如果需要用到无参构造需要手动添加

Java编译器默认会提供一个无参构造

public class Student {

}

public class ConstructTest {
    public static void main(String[] args) {
        Student  s1 = new Student();
    }
}
如果自定义了构造方法,默认的无参构造会被覆盖请添加图片描述

 

有此可见,本来存在的无参构造,经过我们添加了一个有参构造后,消失了,导致我们new对象的时候,调用不到了,这样就能间接的证明我们的观点: 如果自定义了构造方法,默认的无参构造会被覆盖

错误代码:

public class Student {
    Student(String stuId) {
        System.out.println("有参构造方法");
    }
}

public class ConstructTest {
    public static void main(String[] args) {
        Student  s1 = new Student(); // 报错 - 编译错误
    }
}
5. 构造方法的主要作用
构造方法的主要作用就是为了给成员变量赋初始值

请添加图片描述
public class Student {   

// 成员变量 - 属性/特征
    String stuId; // 学号
    String name; // 名字
    int age; // 年龄
    String address; // 地址
    // 构造方法(有参构造)
    Student(String stuId,String name,int age,String address) {
        this.stuId = stuId;
        this.name = name;
        this.age = age;
        this.address = address;
    }
    void sayHi(){
        System.out.println("大家好,我的学号是" + stuId + ",我叫"+name+",今年"+age+"岁了,家住"+address);
    }
}

 

public class ConstructTest {
    public static void main(String[] args) {
        Student  s1 = new Student("JSD2207080101","zs",18,"沈阳");
        s1.sayHi();
    }
}
二、this 关键字
思考:上面的代码中我们使用了 this 这样一个关键字 ,那这个关键字起到了什么作用呢?请添加图片描述

 

这里首先涉及到了Java中变量的使用:
成员变量和局部变量相同名称时,默认采用就近原则(谁离得近使用的就是谁)
但是由于我们构造方法是想给成员变量赋初始值,为了区分,我们可以使用 this 关键字

this 指代的是当前对象,哪个对象调用方法指的就是哪个对象

this.成员变量
访问成员变量
当成员变量和局部变量同名时,如果想访问成员变量,不能省略this
this.方法名()
调用方法(一般不用)
this()
调用构造方法(一般不用)
在构造方法里,必须放置在构造方法的第一行
三、内存结构初识
内存结构:JVM


new出来的对象(成员变量,数组的元素)

局部变量(方法的参数)
基本类型存储的是值
引用类型存储的是内存中的地址(指的是对应对象的内存地址)在这里插入图片描述

内存图

请添加图片描述
四、null 和 NullPointerException
1. null
null 表示空,没有指向任何对象

请添加图片描述

 


2. NullPointerException
当引用的值为 null 时,该引用不能进行任何 点 操作,若操作会发生NullPointerException

请添加图片描述
五、引用类型数组(上)
基本类型数组
给元素赋值时,直接赋值即可
元素存储的是基本类型对应的值
引用类型数组
给元素赋值时,需要 new 对象
元素存储的是引用类型的内存地址

 请添加图片描述


public class Student {
    // 成员变量 - 属性/特征
    String stuId; // 学号
    String name; // 名字
    int age; // 年龄
    String address; // 地址
    // 构造方法(有参构造)
    Student(String stuId,String name,int age,String address) {
        this.stuId = stuId;
        this.name = name;
        this.age = age;
        this.address = address;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        int a = 5;
        Student s = new Student("JSD2207080101","zs",18,"沈阳");
        int[] arr = {1,3,5};
        Student[] students = new Student[3];
        students[0] = new Student("JSD2207080102","ls",20,"大连");
        students[1] = new Student("JSD2207080103","ww",18,"铁岭");
        students[2] = new Student("JSD2207080104","zl",27,"抚顺");
    }
}
六、拓展
1. 成员变量与局部变量的区别

在这里插入图片描述
2. 创建对象的流程
Student s = new Student(); // 短短这行代码发生了很多事情

把 Student .class 文件加载进内存
在栈内存中,开辟空间,存放引用变量 s
在堆内存中,开辟空间,存放 Student 对象
对成员变量进行默认的初始化
对成员变量进行显示初始化
执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
堆内存完成
把堆内存的地址值赋值给变量 s ,s 就是一个引用变量,引用了 Student 对象的地址值
七、练习题
1. 习题
1.1 NullPointerException 练习
编写一段代码,运行后可以出现 NullPointerException 这样一个异常
1.2 构造方法 练习
编写一段代码,证明构造方法可以重载
编写一段代码,证明 new对象 时自动调用构造方法
编写一段代码,证明创建一个有参的构造函数,默认的无参的构造函数就被替代掉了
 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值