• java基础8 构造函数和构造代码块


    一、构造函数

    1 构造函数的作用

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

    2 构造函数的格式

      修饰符 函数名(形式参数){  //函数名就是类名
            函数体
        
      }

    举例说明:

    class Perosn{
        private int id;
        private String name;
        private int age;
        
        public Perosn(){ //无参构造器
            cry();
        }
        public Perosn(int id, String name, int age) { //有参构造器
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        
        public void cry(){
            System.out.println("哇哇哇....");
        }
        
    }

    3 构造函数要注意的细节

     1.构造函数是没有返回值类型
     2.构造函数必须与类名一致
     3.构造函数并不是由我们手动调用的,而是在创建对应的对象时,jvm就好自动调用到相应的构造函数
     4.如果类没有显示的写一个构造函数时,那么java编译器会自动为该类添加一个无参的构造函数.
      javap 反编译工具使用的格式
             javap -c -l -p 类名
     5.如果类显示的写了一个构造函数时,那么java编译器则 不会在为该类添加一个无参的构造函数
     6.构造函数是可以在一个类中以函数重载的形式存在多个的

    4 构造函数和普通函数的区别

    1.返回值类型的区别:
         1.构造函数没有返回值类型的
         2.普通函数是有返回值类型,即使没有返回值,返回值类型也要写void
    2.函数名的区别
         1.构造函数的函数名必须与类名一致
         2.普通函数的函数名只需要符号标识符的命名规范即可
    3.调用方式的区别
        1. 普通函数是有我们创建对象来调用的,一个对象可以调用多次普通的函数(手动调用)
        2.构造函数是创建对象时,有jvm自动调用的
    4.作用上的区别:
         1.构造函数的作用:用于初始化一个对象
         2.普通函数是描述一类事物的公共行为的

    /*
       1.描述一个员工类.员工具备的属性:id/name/age
         具备的行为:工作
       2.要求:一旦创建一个员工对象的时候,那么该员工对象就要对应的属性值
    */
    
    class Employee{
        int id;
        String name;
        int age;
        //含参构造器
        public Employee(int ids,String names,int ages){
            id=ids;
            name=names;
            age=ages;
        }
        //无参构造器
        public Employee(){
        
        }
        public void work(){
            System.out.println(name+"好好工作,努力挣钱,赢取秋香");
        }
    }
    class Demo3 { public static void main(String[] args) { //对应实例化对象,调用对应的构造器. //无参对象 Employee e=new Employee(); //实例化一个含参的对象 Employee e=new Employee(1,"华安",24); e.work(); System.out.println("编号:"+e.id+" "+"姓名:"+e.name+" "+"年龄:"+e.age); } }

     二、构造代码块

     1 构造代码块作用

    给所有的对象进行统一的初始化。 (将所有构造方法中公共的信息进行抽取。);(给对象进行初始化。对象一建立就运行并且优先于构造函数。)

    1.构造代码块的作用: 给对象进行统一的初始化
    2.构造函数的作用: 给对应的对象初始化.
    class Perosn{
        private int id;
        private String name;
        private int age;
        //构造代码块
        {
            cry();// 每个Person对象创建出来都会执行这里的代码
        }
        
        public Perosn(){ //无参构造器
            cry();
        }
        public Perosn(int id, String name, int age) { //有参构造器(函数)
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        
        public void cry(){
            System.out.println("哇哇哇....");
        }
        
    }

    2 构造代码块的格式

    构造代码块的格式:
          {
            构造代码块...
          }

    静态代码块的格式:
          static{
              代码...
              }

    举例:

    class Student{
        String name;
        static String country="中国";
        
        /*//有参构造器
        public Student(String name){
            this.name=name;
        
        }
        */
        
        //代码块
        {
            System.out.println("这是构造代码块");
        }
        
        //静态代码块
        static{
            System.out.println("这是静态代码块");
        }
        
        //构造函数
        public Student(){
            System.out.println("这是无参构造器");
        
        }
    }
    
    class Demo5{
        
        public static void main(String[] args) {
                Student s=new Student();
                Student s1=new Student();
        }
    }

    结果图:

    注意: 静态代码块,代码块,构造器的运行顺序:静态代码块最先执行,并且只执行一次;其次到构造代码块,最后到构造函数(器)。代码块和构造函数对象的创建次数决定调用次数,代码块是先于构造器(函数)执行。

    构造代码块:对于初始化功能来讲,一旦一个类创建一个对象,将先执行直接初始化和构造代码块,最后才执行构造器

    代码块的类别:
            1.构造代码块
            2.静态代码块
            3.局部代码块:大括号位于方法之内.作用:缩短了局部变量的生命周期,节省了一点点内存

    class Demo4 {
        //无参构造器
        public Demo4(){
            System.out.println("好好学习,迎娶白富美");        
        }
       //普通方法(函数) 
        public void m(){
            System.out.println("迎娶校花");        
        }
        //构造代码块
        {
        System.out.println("好好学习,天天向上,迎娶校花");    
        }
        
        public static void main(String[] args) {
            Baby b=new Baby();
        }
    }
    //结果:
      构造代码块先执行, 再执行构造函数

    3 构造代码块与构造函数区别

    构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。

    4 构造代码块要注意的事项

        1.java编译器在编译一个java源文件的时候,会把成员变量提到一个类的最前端
        2.成员变量初始化工作其实都在构造函数中执行的
        3.一旦java编译器编译之后,那么构造代码块的代码就会被移动到构造函数中执行,是在构造函数之前执行的,构造函数中的代码最后执行的
        4.成员变量的初始化与构造代码块的代码是按照当前代码的顺序执行的

    /*
        需求:统计一个类被使用多少次创建对象,该类对外显示被创建的次数
    */
    
    class Emp{
        static int flag=0;//计数器
        String name;
        //构造代码块
        {
        flag++;//1
        }
        //含参的构造器
        public Emp(String names){
            name=names;
        }
        //无参构造器
        public Emp(){
        }
    
    }
    class  Demo5
    {
        public static void main(String[] args) 
        {
            Emp e=new Emp("土豆");
            Emp e1=new Emp("土豆");
            Emp e2=new Emp("土豆");
            System.out.println(e.flag);
        }
    }

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:http://www.cnblogs.com/dshore123/p/8717718.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    Spring注入内部的Beans
    Spring基于Setter函数的依赖注入(DI)
    Jenkins中的Job配置里缺少“触发远程构建(例如,使用脚本)”选项的问题解决
    Spring基于构造函数的依赖注入(DI)
    音频中采样位数,采样率,比特率的名词解释(转)
    无损音乐知识收集3(转)
    无损音乐知识收集2(转)
    无损音乐知识收集1(转)
    Spring的依赖注入概述
    Spring的IoC容器概述
  • 原文地址:https://www.cnblogs.com/dshore123/p/8717718.html
Copyright © 2020-2023  润新知