类的构造函数

 
  • 类的构造函数特点:

1. 构造函数也称为构造方法,构造函数名和类名相同。
     2. 构造函数不能有返回值,也不能用void声明。

   3. 构造函数可以有参数,也可以无参数,在一个类中,可以定义多个构造函数。
    4. 构造函数主要是对类进行初始化,在new的时候调用。
    5. 任何一个类对象被生成时一定会调用该类的构造函数。
    6. 无论一个类中定义了多少个构造函数,在生成类对象时一定只会调用其中的某一个构造函数。
    7. 所有的类都有构造函数,在定义一个类时,如果你不定义构造函数,则系统默认生成一个空的构造函数,如果你自己定义了构造函数,则系统默认的构造函数就失效。
    8. 创建类对象语句:A aa = new A(); 其实new后面的A()就是构造函数。
 

  • 构造函数的返回值问题:
    1. 在一个类中,可以定义多个函数名和类名相同但有返回值的函数,返回值可以为void或int或String或double等任意类型,这些有返回值的函数只要能满足重载特点,就可以同时存在一个类中,不过这些有返回值的函数(包括返回值为void的函数)都不是构造函数,在生成类对象时都不会被调用。
   2. 如果定义了有返回值并且函数名和类名相同的函数,程序并不会报错,而且这种函数也可以和普通函数一样被调用,但是容易产生歧义,最好不要定义这种函数。
  1.  /**
    @author zst
    @version 1.0 */
    public class A{
    /*
    下面三个函数的函数名都和类名相同,但都不是构造函数
    三个函数都满足重载的特点,所以可以同时存在同一个类中
    */ //不是构造函数,
    public void A(){
    System.out.println("调用了返回值为void,函数名为A的函数");
    } //不是构造函数
    public int A(int i){
    System.out.println("调用了返回值为int,函数名为A的函数");
    return i;
    } //不是构造函数
    public String A(String s){
    System.out.println("调用了返回值为String,函数名为A的函数");
    return s;
    } }
     /**
    @author zst
    @version 1.0 */
    public class ConstructorTest{
    public static void main(String[] args){ A aa = new A(); //这里调用的构造方法是系统默认的为空的构造方法 aa.A();
    aa.A(0);
    aa.A("hello"); } }
    /*
    输出:
    调用了返回值为void,函数名为A的函数
    调用了返回值为int,函数名为A的函数
    调用了返回值为String,函数名为A的函数
    */

  • 构造函数调用
    当类中定义了多个构造函数,创建类对象时,只能指定调用某一个构造函数。
  1.  /**
    @author zst
    @version 1.0 */
    public class A{
    public A(){
    System.out.println("调用了无参构造函数创建对象"); } public A(int i)
    {
    System.out.println("调用了一个参数的构造函数创建对象"); } public A(int i,int j)
    {
    System.out.println("调用了两个参数的构造函数创建对象");
    } }
    /**
    @author zst
    @version 1.0 */
    public class ConstructorTest02{
    public static void main(String[] args){ A aa1 = new A(); A aa2 = new A(0); A aa3 = new A(1,2); } }
    /*
    输出:
    调用了无参构造函数创建对象
    调用了一个参数的构造函数创建对象
    调用了两个参数的构造函数创建对象
    */

  • 在创建对象时,数据成员的初始化赋值问题
    1. 如果数据成员在定义时不初始化,当一个对象被创建时,数据成员会被系统默认赋给一个默认值。各种类型的数据成员初始化默认值如下:
数据成员类型 默认初始化
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0D
char '\u0000' (表示为空)
boolean false
引用类型 null
 
    2. 如果数据成员在定义的同时赋初始值,则这个初始值是有效的,但如果在构造函数中又改变了定义时赋的初值,则该数据成员最终的值就是构造函数中修改之后的那个值,这是因为当调用构造函数创建对象时,会先给数据成员进行初始化,如果数据成员在定义时赋了值,则此时数据成员的初值为定义时赋给它的值,然后接着执行构造函数里的赋值语句,重新修改数据成员的初始化值。
  1.  /**
    @author zst
    @version 1.0 */
    public class A{
    //没有初始化的数据成员
    private int i;
    private String s;
    private double d; //初始化的数据成员
    private float f = 11.1f;
    private boolean b = false; //无参构造函数
    public A(){ } public void f(){ System.out.println("没有初始化的数据成员,系统赋予默认值");
    System.out.println(i);
    System.out.println(s);
    System.out.println(d); } public void g(){
    System.out.println("初始化的数据成员,初始化的值是有效的");
    System.out.println(f);
    System.out.println(b); } //有参构造函数,修改初始化时的值,数据成员最终的值是修改后的值
    public A(float f,boolean b)
    {
    f = f;
    b = b; System.out.println("在构造函数中修改数据成员的初始化值,数据成员最终的值为修改后的值");
    System.out.println(f);
    System.out.println(b);
    } }
    /**
    @author zst
    @version 1.0 */
    public class ConstructorTest03{
    public static void main(String[] args){ A aa1 = new A();
    aa1.f();
    aa1.g(); A aa2 = new A(99.9f,true); } }
    /*
    输出:
    没有初始化的数据成员,系统赋予默认值
    0
    null
    0.0
    初始化的数据成员,初始化的值是有效的
    11.1
    false
    在构造函数中修改数据成员的初始化值,数据成员最终的值为修改后的值
    99.9
    true
    */
    3. 需要注意的一点:对于一个类的数据成员,如果定义时不初始化,则创建对象时,系统就会自动赋给默认的初始值,但对于局部变量,如在定义时不初始化而直接使用,则编译时就会报错,因为Java中要求所有的局部变量在使用之前都必须要初始化。
 /**
@author zst
@version 1.0 */
public class A{
//没有初始化的数据成员
private int i;
private String s;
private double d; //无参构造函数
public A(){ } public void f(){ System.out.println("没有初始化的数据成员,系统赋予默认值,可以直接使用");
System.out.println(i);
System.out.println(s);
System.out.println(d); } public void g()
{
int i = 100; //局部变量:在使用之前必须要初始化,否则编译出错
System.out.println("局部变量使用之前必须要初始化 " + i);
} }
/**
@author zst
@version 1.0 */
public class ConstructorTest04{
public static void main(String[] args){ A aa1 = new A();
aa1.f();
aa1.g(); } }
/*
输出:
没有初始化的数据成员,系统赋予默认值,可以直接使用
0
null
0.0
局部变量使用之前必须要初始化 100 */

 

Java:类的构造函数的更多相关文章

  1. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  3. [改善Java代码]建议40:匿名类的构造函数很特殊

    建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...

  4. [改善Java代码]使用匿名类的构造函数

    建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...

  5. java类的结构(属性、方法、构造函数)

    一.类的定义形式类定义的一般形式如下 [类定义修饰符] class  <类名> {   //类体 [成员变量声明] [构造函数] [成员方法] } 前面说过,在描述java语法时,方括号中 ...

  6. java类定义、变量类型、构造函数

    1.java类class的定义 所有java程序都以类class为组织单元,java类由属性和方法组成,下面看例子: public  class  Phone{ //属性 String company ...

  7. java基础42 File类的构造函数及其方法

    本文知识点(目录): 1.IO流(Input Output)    2.IO流技术的运用场景    3.File类的构造函数(方法)    4.File类的一些常用方法    5.实例(解析File类 ...

  8. java类的初始化和构造函数

    本人小白一枚,看java类的初始化的时候好晕的说,我觉着书上尽管说的对.但总认为有些信息没说出来,没说清楚,看了好多文章博客的,如今有些感悟,来小写下总结,也算是为以后再次复习种个好果子. 先摘一下书 ...

  9. java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

    如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个 ...

随机推荐

  1. Head First Servlets & JSP 学习笔记 第十一章 —— Web应用部署

    jar:java archive(java归档) war:web archive(web归档) war文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式(它实际上就是一个jar文件).建立 ...

  2. python基础 (编码进阶,文件操作和深浅copy)

    1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码. 即先将其他编码的字符串解码(decode)成unicode,再从uni ...

  3. python基础之Day11

    一.函数是对象 函数是第一类对象的含义是函数可以被当作数据处理 二.函数的嵌套定义 def f1(): def f2(): print('from f2') f2()f1() 三.名称空间与作用域 1 ...

  4. python 常用知识点

    1,字典get用法 如果key没有值,返回一个None >>> dic = {'k1':'v1','k2':'v2','k3':'v3'} >>> dic.get( ...

  5. JSP内置对象seesion

    什么是session session表示客户端与服务器的一次会话 Web中的session指的是用户在浏览某网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间 从上述定 ...

  6. Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)

    目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...

  7. PMP:1.引论

    全球项目管理业界定义的最重要的价值 观是责任.尊重.公正和诚实(成功准则).   项目是为创造独特的产品.服务或成果而进行的临时性工作:   开展项目是为了通过可交付成果达成目标.目标指的是工作所指向 ...

  8. UITableView自动计算cell高度并缓存

    原文链接:http://www.jianshu.com/p/64f0e1557562 cell高度计算的历史 在iOS8之前,如果UITableViewCell的高度是动态的,如果想要显示正确的话,我 ...

  9. docker中gitlab-runner配置

    1.启动gitlab-runner docker run -d --name gitlab-runner --restart always \ -v /opt/data/gitlab-runner/c ...

  10. Runtime之实例总结

    通过前面几篇对Runtime的讲解,本篇汇总一下Runtime实际中常用的一些场景. 1.获取类的基本信息 获取类名: const char *className = class_getName(cl ...