构造函数、构造代码块、this关键字

作者 : 开心源码 本文共3361个字,预计阅读时间需要9分钟 发布时间: 2022-05-12 共141人阅读

构造函数、构造代码块、this关键字

一、构造函数

1.构造函数的作用

给对应的对象进行初始化。

2.构造函数的定义格式

修饰符 函数名(形式参数){    函数体...}

3.构造函数要注意的细节

  • 构造函数是没有返回值类型的。
  • 构造函数的函数名必需要与类名一致。
  • 构造函数并不是由我们手动调用的,而是在创立对应的对象时,jvm就会主动调用到对应的构造函数。
  • 假如一个类没有显式的写上一个构造方法时,那么java编译器会为该类增加一个无参的构造函数的。
  • 假如一个类已经显式的写上一个构造方法时,那么java编译器就不会再为该类增加一个无参的构造方法。
  • 构造函数是可以在一个类中以函数重载的形式存在多个的。

4.反编译工具–javap.exe

jdk提供了一个java开发工具(javap.exe)给我们进行反编译的。

javap 反编译工具的使用格式:

javap -c -l -private 类名

注意:java编译器增加的无参构造方法的权限修饰符与类的权限修饰是一致的。

5.构造函数与普通函数的区别:

  1. 返回值类型的区别:
    ①构造函数是没有返回值类型的。
    ②普通函数是有返回值类型的,即便函数没有返回值,返回值类型也要写上void。
  2. 函数名的区别:
    ①构造函数的函数名必需要与类名一致,
    ②普通函数的函数名只需符合标识符的命名规则就可。
  3. 调用方式的区别:
    ①构造函数是在创立对象的时候由jvm调用的。
    ②普通函数是由我们使用对象调用的,一个对象可以对象屡次普通 的函数,
  4. 作用上的区别:
    ①构造函数的作用用于初始化一个对象。
    ②普通函数是用于形容一类事物的公共行为的。

二、构造代码块

形容一个员工类,员工具有 的属性:id,name,age
具有的公共行为: 工作。
要求:一旦创立一个员工对象的时候,那么该员工对象就要对应的属性值。

class Employee{    int id;  //编号    String name;  //名字    int age; //年龄    //构造函数    public Employee(int a, String b , int c){        id =a;        name = b;        age = c;    }    public void work(){        System.out.println(name+"好好工作,努力挣钱!!");    }}class Demo{    public static void main(String[] args)     {        //创立一个员工对象        Employee e = new  Employee(110,"狗娃",20);        System.out.println("编号:"+ e.id+" 名字:"+e.name +" 年龄:"+ e.age);    }}

一、构造代码块的作用

构造代码块的作用:给对象进行统一的初始化。
构造函数的作用: 给对应的对象进行初始化。

二、构造代码块的格式

{    构造代码块}

注意:构造代码块的大括号必需位于成员位置上。

三、代码块的类别

  • 构造代码块。
  • 局部代码块:大括号位于方法之内。 作用:缩短局部变量的生命周期,节省一点点内存。
  • 静态代码块:static

四、构造代码块要注意的事项

  1. java编译器编译一个java源文件的时候,会把成员变量的公告语句提前至一个类的最前台。
  2. 成员变量的初始化工作其实都是在构造函数中执行的。
  3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,构造函数的中代码是最后执行的。
  4. 成员变量的显示初始化与构造代码块的代码是按照当前代码的顺序执行的。
class Demo{    //构造函数    public Demo5(){   //构造函数        i = 3;      }            //构造代码块   //构造代码块的初始化    {        i = 2;    }        int i = 1;   //成员变量的显初始化    public static void main(String[] args)     {        Demo5 d = new Demo5();        System.out.println("i = "+d.i);      }}

三、this关键字

需求: 使用java类形容一个动物。

问题:存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是就近准则的机制访问的)。

1.this的含义

this关键字代表了所属函数的调用者对象。

2.this的作用

①假如存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据。
②在一个构造函数中可以调用另外一个构造函数初始化对象。

3.注意事项

this关键字调用其余的构造函数要注意的事项:
1. this关键字调用其余的构造函数时,this关键字必需要位于构造函数中 的第一个语句。
2. this关键字在构造函数中不能出现相互调用的情况,由于是一个死循环。

this关键字要注意事项:
1. 存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是“就近准则”的机制访问的。)
2. 假如在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面增加this关键字。

demo:

class Animal{    String name = "狗";//成员变量    String color;        public void eat(){        String name = "猫";//局部变量        System.out.println(this.name+"在吃");    }}class Demo{    public static void main(String[] args){        Animal a = new Animal();        a.eat();    }}

内存分析:

this关键字内存分析

注意:一个方法要运行的时候,jvm会在栈内存中开拓一片属于这个方法的空间,让这个方法在这片空间内执行。

class Student{    int id;  //身份证    String name;  //名字    //目前情况:存在同名的成员变量与局部变量,在方法内部默认是使用局部变量的。    public Student(int id,String name){  //一个函数的形式参数也是属于局部变量。        this(name); //调用了本类的一个参数的构造方法        //this(); //调用了本类无参的构造方法。        this.id = id; // this.id = id 局部变量的id给成员变量的id赋值        System.out.println("两个参数的构造方法被调用了...");    }        public Student(){        System.out.println("无参的构造方法被调用了...");    }    public Student(String name){        this.name = name;        System.out.println("一个参数的构造方法被调用了...");    }}class Demo{    public static void main(String[] args)     {        Student s = new Student(110,"小红");        System.out.println("编号:"+ s.id +" 名字:" + s.name);/*        Student s2 = new Student("小绿");        System.out.println("名字:" + s2.name);    */    }}

需求: 使用java定义一个人类,人具有 id、name 、 age三个属性, 还具有一个比较年龄的方法。
要求: 必需要写上构造函数,构造函数也必需要使用上this关键字。

class Person{            int id; //编号    String name; //姓名    int age;  //年龄    //构造函数    public Person(int id,String name ,int age){        this.id  = id;        this.name = name;        this.age = age;    }    //比较年龄的方法    public void compareAge(Person p2){        if(this.age>p2.age){            System.out.println(this.name+"大!");        }else if(this.age<p2.age){            System.out.println(p2.name+"大!");        }else{            System.out.println("同龄");        }    }}class Demo8{    public static void main(String[] args)     {        Person p1 = new Person(110,"小红",17);        Person p2 = new Person(119,"小绿",9);        p1.compareAge(12);    }}

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 构造函数、构造代码块、this关键字

发表回复