构造方法详解、成员内部类、静态代码块等

java构造方法详解

概念:

java中有方法这个概念,其hi就是我们所说的函数,方法是实现某一个功能的函数。

构造方法就是一个特殊的方法

作用:

初始化对象。就是在实例化对象的时候直接赋予对象各种属性。就比如说我们实例化一个学生类的对象,那这个对象应该直接就有学生类的属性。

可以理解为与生俱来就有的。和赋值的概念要分开理解。

特点:

构造方法有三个特点

  • 函数名与类名同名。一定要同名才能是构造。
  • 不用定义返回值类型。 也就是构造方法没有返回值类型。
  • 不写return 既然没有返回值类型,就没有return的必要了。

代码示例:

还是以学生类作为示例,先新建一个学生类:

package Review;
/*
* 本程序主要定义了一个学生类,包括成员变量和成员方法
* */
public class Student {
    //定义成员变量
    public String COLLEGE_NAME;//学校名称
    public String StudentNumber;//学生学号
    public String StudentName;//学生姓名
    public int StudentAge;//学生年龄

    //定义成员方法
    public void StudentStudy() {
        //行为
        System.out.println(COLLEGE_NAME+"的学生"+StudentName+"在上课");
    }

    public void StudentSleep() {
        //行为
        System.out.println("学号为:"+StudentNumber+"的学生"+StudentName+" 他今年"+StudentAge+"岁了,竟然在课上睡觉");
    }
}

可以看到上面的程序中,有成员变量,但是成员变量没有值,相当于我们只知道学生由学校、学号、姓名等属性,但是我们说具体的一个学生时,他应该有具体的学校名称、学号等,上面的代码夏然是不合理的,所以我们需要构造方法来给它赋初值,那么需要一个构造方法。

有参构造:

构造方法的形参应该包括需要给对象的具体属性,所以我们以上面的学生类为例,给它增加构造方法。

public Student(String COLLEGE_NAME,String StudentNumber,String StudentName,int StudentAge) {
        COLLEGE_NAME = "宁理";
        StudentNumber = "25855559";
        StudentName = "白龙辉";
        StudentAge = 22;
    }

上面就是构造方法,他有形参,所以可以称为有参构造

但是上面的代码存在一个问题,形参定义的变量和Student类里面的成员变量重名了,上面的代码可以正确执行,原因是成员变量并欸有给初始值。但是如果给成员变量初始值:

public String COLLEGE_NAME;//学校名称
    public String StudentNumber = "88888888";//学生学号
    public String StudentName;//学生姓名
    public int StudentAge;//学生年龄

那么就会出现问题。StudentNumber的值到底应该是多少呢?

想想应该知道,根据就近原则,输出应该是”25855559“,那么由于重名了,就会出现问题,所以有了this关键字。

this关键字

this关键字的作用是引用成员变量/当然不止这一个作用/

使用方法:this.成员变量。

所以上面的代码可以这样更改:

 public Student(String COLLEGE_NAME,String StudentNumber,String StudentName,int StudentAge) {
        this.COLLEGE_NAME = COLLEGE_NAME;
        this.StudentNumber = StudentNumber;
        this.StudentName = StudentName;
        this.StudentAge =StudentAge;
    }

这样的话,通过构造方法传入的值就可以赋给成员变量。

构造方法的使用

上面写完了构造方法,他的调用也很简单,就是实例化一个对象,并给出实参。

//实例化对象
        Student Bai_Long_Hui = new Student("宁理","44778899","白龙辉",22);

这样就可以了。

但是这样又存在了一个问题:假设这个学生类是用来描述宁理的学生的,并且在某一个系统中,我们只需要用到学生的学号和姓名,如果采用上面的构造方法,会造成数据冗余,那么改如何修改呢?

不需要对原来的代码进行修改,这也是java的优势之一。

这里用到了重载。

构造方法的重载

重载的概念:

那么什么是重载呢?

一个类中的多个方法,这些方法可以拥有相同的方法名,但是参数不同。

也就是说,我们可以在写一个Student构造,他的形参只有两位就可以了。

//构造重载
    public Student(String StudentNumber,String StudentName) {
        this.StudentNumber = StudentNumber;
        this.StudentName = StudentName;
    }

那可以不写形参吗?

当然是可以的,如果一个类没有写构造方法,jvm在编译的时候会自动给出一个空参构造,就是这个样子的:

//空参构造
    public Student() {
        
    }

我们可以分别实例化三个对象,对这三个构造进行解释:

package Review;
/*
 * 本程序是Student类的测试类
 * */
public class TestStudent {
    public static void main(String[] args) {
        //实例化对象
        Student Bai_Long_Hui_1 = new Student("宁理","44778899","白龙辉",22);
        //双参构造
        Student Bai_Long_Hui_2 = new Student("555888888","黑龙辉");
        //空参构造
        Student Bai_Long_Hui_3 = new Student();
    }
}

对上面的代码,我们还可以继续做优化。

根据Student类的定义,他有两个成员方法,现在需要修改需求:增加一个新的方法,实现输出一句信息:”宁理的日常:“

那么更具上面的代码思路,我们给Student增加新的成员方法printHint()

//新增需求
    public void printHint() {
        System.out.println("宁理的日常:");
    }

然后对代码进行调用

package Review;

public class NewStudentTest {
    public static void main(String[] args) {
        //实例化对象
        NewStudent Bai_Long_Hui_1 = new NewStudent("宁理","44778899","白龙辉",22);
        //双参构造
        NewStudent Bai_Long_Hui_2 = new NewStudent("555888888","黑龙辉");
        //空参构造
        NewStudent Bai_Long_Hui_3 = new NewStudent();
        //三个对象的行为
        Bai_Long_Hui_1.printHint();
        Bai_Long_Hui_1.StudentStudy();
        Bai_Long_Hui_1.StudentSleep();

        Bai_Long_Hui_2.StudentStudy();
        Bai_Long_Hui_2.StudentSleep();

        Bai_Long_Hui_3.StudentStudy();
        Bai_Long_Hui_3.StudentSleep();

    }
}

调用方法中,我们让对象1调用了printHint方法。这显然是不合理的,printHint不属于对象的行为,所以这里引入了静态代码块的概念。

静态代码块

概念

执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量

在执行过程中,静态代码块----->非静态代码块-------->构造函数

使用方法
//新增需求
    static  {
        System.out.println("宁理的日常:");
    }

测试类:

//三个对象的行为
        Bai_Long_Hui_1.StudentStudy();
        Bai_Long_Hui_1.StudentSleep();

        Bai_Long_Hui_2.StudentStudy();
        Bai_Long_Hui_2.StudentSleep();

        Bai_Long_Hui_3.StudentStudy();
        Bai_Long_Hui_3.StudentSleep();

输出结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFBC3l7j-1589797292444)(F:/Typora插入的图片/1589796687022.png)]

不需要由类调用,静态代码块直接执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值