zoukankan      html  css  js  c++  java
  • 面向对象之构造函数

    构造函数是什么?它有什么作用?

    构造函数其实本质上就是一个函数,只不过这个函数比较特殊,它具有下面这些特点:

    • 函数名与类名相同。

    • 不用定义返回值类型。

    • 没有具体的返回值。

    那么这样的函数有什么作用呢,我们可以根据上面的特点写下面的代码来进行测试:

    
    class Person {
        // 定义一个Person类的构造函数并且它是空参数的。
        Person() {
            System.out.println("person run");
        }
    }
    
    class Demo {
        public static void main(String[] args) {
            Person p = new Person();
        }
    }
    
    

    通过运行结果我们就可以推断出:构造函数就是创建对象时调用的函数。它的作用就是用来给对象进行初始化的。而且我们可以注意下面的代码也是可以正常编译的:

    
    class Person {
       
    }
    
    class Demo {
        public static void main(String[] args) {
            Person p = new Person();
        }
    }
    
    

    于是我们可以知道:如果一个类中没有定义过构造函数,那么该类中会有一个默认的空参构造函数。那如果一个类中自定义了构造函数呢?试想下面的代码:

    
    class Person {
        // 自定义构造函数
        Person() {
            System.out.println("person run");
        }
    
        // 默认构造函数
        Person() {
        
        }
    }
    
    

    很明显上面的两个方法是不能共存的,因为会造成冲突。所以如果一个类中自定义了构造函数,那么类中的默认构造函数就没有了

    构造函数和一般函数的区别?

    上面说过:构造函数其实就是一个特殊的函数,那么它与一般函数具体的区别在哪里呢?

    • 对象创建时,就会调用与之对应的构造函数对象进行初始化;而一般函数是对象创建后,需要函数功能时才调用。

    • 构造函数在创建对象时调用且只调用一次;而一般函数在对象创建之后按需调用且可以调用多次。

    构造函数的重载?

    我们平时查阅JDK文档时会看到这样一个现象:一个类可能会有多个构造函数。

    这样的现象在Java中还有很多。这多个构造函数在类中是以重载的形式来体现的。那么什么是重载呢?如果多个方法(eg:String的构造方法)有相同的名字、不同的参数,这样便产生了重载

    关于重载,我们需要注意几点:

    • 它是多态的一种表现形式(关于多态,可以参考面向对象之多态),并且编译器在编译阶段如果找不到匹配的参数就会产生编译时错误。

    • Java中不止可以重载构造方法,也可以重载其他任何方法。

    关于构造函数的细节?

    • 我们什么时候可以自定义构造函数呢?通过上面的讲述,我们知道当创建对象时就会调用构造函数,于是我们可以说:对象一存在就有的内容就可以放到自定义构造函数中,比如:
    
    class Person {
        private String name;
        private int age;
    
        // 如果有的孩子一出生就有名字。
        Person(String n) {
            name = n;
        }
    }
    
    
    • 自定义构造函数可以为类的成员变量赋值,成员变量的set方法也可以为其赋值,但是很明显两者的含义是不同的。
    
    class Person {
        private String name;
        private int age;
    
        // 如果有的孩子一出生就有名字。
        Person(String n) {
            name = n;
        }
    
        public void setName(String n)
        {
            name = n;
        }
    }
    
    
    • 一般函数是不能调用构造函数的,原因很简单:构造函数是用来对对象进行初始化的。

    • 上面说到构造函数没有具体的返回值,那么它是否可以用void修饰呢?答案是否定的。如果构造函数使用void修饰之后,那么它就变成一般函数了。

    • 构造函数中是有return语句的,它的作用就是为了结束函数。

  • 相关阅读:
    [iOS]UIDynamicAnimator动画
    [iOS]被忽略的main函数
    [iOS]app的生命周期
    vue 封装http请求时错误信息提示使用element-ui message,只提示一次
    angular8 Vue 导出excel文件
    python3 tornado api + angular8 + nginx 跨域问题
    ubutu tornado python3.7.5 nginx supervisor 部署web api
    angular cli 反向代理实现跨域
    angular8自定义管道、指令以及获取dom值
    angular cli 使用echarts
  • 原文地址:https://www.cnblogs.com/syhyfh/p/12486201.html
Copyright © 2011-2022 走看看