zoukankan      html  css  js  c++  java
  • Java核心技术第四章——3.对象构造

    重载:  

      如果多个方法(包含构造方法)有相同的名字、不同的参数,便产生重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配挑选出相对应的方法。

    如果编译器找不到匹配的参数,就会产生编译时错误。(此过程称为重载解析)

        注意:方法的返回类型并不属于重载的条件,因为不能有两个名字相同、参数相同而返回类型不同的方法。否则会编译报错。我在大学的时候就是傻逼逼的一直把返回类型当做重载条件的一部分。 

    重载例子如下:

    public class OverLoadingClass {
        String id;
        
        /*构造器重载*/
        public OverLoadingClass(){
            
        }
        
        public OverLoadingClass(String id){
            this.id = id;
        }
        /*构造器重载*/
        
        /*方法重载*/
        public void Test(String name){
        }
        
        public void Test(Integer age){
            
        }
        /*方法重载*/
        
    }

    默认域初始化

      如果在构造器中没有显示的给实例域(全局变量)赋予初值,那么就会被自动赋予默认值:数值的为0、布尔值为false、对象引用为null。

    但是在局部变量中则不会自动初始化,若直接调用没有初始化的局部变量则会编译错误。

    /**
     * 默认域初始化
     */
    public class DefaultInitialization {
    
        int id; //默认值为0
    
        boolean flag; //默认值为false
    
        String name; //默认值为Null
        
        public void Test(){
            int age;
            System.out.println(age);//编译报错
        }
    }

    无参数构造器:

        如果在编写一个类时没有编写构造器,那么系统就会自动提供一个无参数的构造器。如果编写了一个带参数的构造器,系统则不会自动提供无参数的构造器。

    一般在编写了一个带参数的构造器,都应该编写多一个无参数的构造器。

    显示域初始化:

      显示域初始化,从文字上就可以知道,可以用眼睛看出他被初始化,并不是系统帮我们初始化(那是上面的默认域初始化了)。

     /**
    * 显示域初始化
    */ public class DisplayInitialization { int id = 666; String date = getDate(); public String getDate(){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return dateFormat.format(new Date()); } }

    参数名

      在创建带参数的构造器时,参数变量用同样的名字将实例域屏蔽起来。如果参数名为name,那么在方法当中name将引用这个参数。而不是实例域,但是可以使用this关键字指向隐式参数(实例域),例:this.name

    public class ParameterClass {
    
        String name;
    
        public ParameterClass(String name){
            this.name = name;
        }
    }

      在一般的程序开发当中应该都会这么写,当然,你也可以有下面的操作(不怕被同事鄙视你代码的话)

    public class ParameterClass {
    
        String name;
    
        public ParameterClass(String n){
            name = n;
        }
    }

      看起来是不是很别扭呢?所以代码还是要规范一点的好。

    调用另一个构造器

      关键字this引用方法的隐式参数外,还能在构造器中调用其他的构造器,当然是同一个类的,别想太多。这样的话对公共的构造器代码部分只编写一次即可。

    /**
     * 调用其他构造器
     */
    public class CallOtherConstructor {
    
        public CallOtherConstructor(){
            System.out.println("大胸弟,你来new我啦?");
        }
    
        public CallOtherConstructor(String name){
            this();//调用上面那个构造器
            System.out.println(name+":对呀对呀,我来啦");
        }
    }

     初始化块

      除了在构造器中、声明中赋值以外,java还有第三种机制,称为初始化块,在一个类的生命中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。

    public class InitializationBlock {
    
        private Integer id;
    
        {
            id = 1;
            System.out.println("进入初始化块");
        }
    
        public static void main(String[] args){
            InitializationBlock block1 = new InitializationBlock();
            InitializationBlock block2 = new InitializationBlock();
        }
    }

    输出结果:

    进入初始化块
    进入初始化块

    在初始化对象的时,执行的顺序为:声明 -> 初始化块 -> 构造器  而初始化块一般比较少用,通常都会把初始化代码放在构造器中。

    静态初始化块则不同。静态初始化块在类的第一次加载的时候,将会进行静态域的初始化。(注意:第一次加载类的时候才会执行,往后初始化此对象都不会再进入静态初始化块)

    public class InitializationBlock {
        
        static{
            System.out.println("进入静态初始化块");
        }
    
        public static void main(String[] args){
            InitializationBlock block1 = new InitializationBlock();
            InitializationBlock block2 = new InitializationBlock();
        }
    }

    输出结果:

    进入静态初始化块

    好了,这篇文章我大概写了两周,因为断断续续的在写。当然,写这么多除了自己记住之外,也是为了大家能够看懂。所以大伙能不能给我点个推荐呢?~~给点鼓励我吧~谢谢大家的观看~

  • 相关阅读:
    [题解] [HNOI2014] 世界树
    [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆
    [HDU4507]吉哥系列故事——恨7不成妻
    [国家集训队]聪聪可可
    [模板]点分治
    [2018.8.12]模拟赛B组
    JZOJ5804. 【2018.08.12提高A组模拟】简单的序列
    2018.8.10模拟赛
    2018.8.8模拟赛
    [2018.8.6]模拟赛
  • 原文地址:https://www.cnblogs.com/Johnson-lin/p/9114013.html
Copyright © 2011-2022 走看看