Constructor
 
     构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
     构造器用来确保每个对象都会得到初始化。当对象被创建时,如果该类具有构造器,java就会在用户有能力操作对象之前自动调用相应的构造器,所以保证了初始化地进行。在java中创建和初始化被捆绑在了一起,两者不能分离。注意构造器没有返回值.
     定义一个Java类时。如果没有显式定义一个不带参数的构造函数但定义了一个带参数的构造函数,则不能再以不带参数的构造函数创建一个该类的实例:[即如果已经定义了一个构造函数(无论有无参数),编译器就不会帮你自动创建缺省构造函数].
这里提到this关键字,它只能在方法内部使用,表示对“调用方法的那个对象”的引用。可以使用this关键字在构造器中调用构造器。例:
 
Public class Flower{
      Static Test monitor=new Test();
      Int petalCount=0;
      String s=new String(“null”);
      Flower(int petals){petalCount=petals;}
      Flower(String ss){s=ss;}
      Flower(String s,int petals){
            This(petals);
            //This(s); 这里是不允许的,因为尽管可以用this调用一个构造器,但是不能调用2个
            This.s=s;
      }
}

     所有类都是继承于Object的,在所有类实例化为对象的时候,必然会先调用Object的默认构造函数。static方法就是没有this的方法,static方法内部不能调用非静态方法。如果一个类的构造函数是静态的,那么它将无法调用Object的构造函数。因此构造函数不能声明为static类型。如果你想让一个类的对象只有指定的静态方法可以返回,你可以这样。 
  class   Test { 
          private   Test(){ }//私有构造方法,这样外部将无法创建此类的对象。联想单例模式   
          public static Test getInstance(){ 
                  return new Test();   //静态公共方法,返回Test的对象。 
          }  }

(1) 类可以没有构造方法,但如果有多个构造方法,就应该要有默认的构造方法,否则在继承此类时,需要在子类中显式调用父类的某一个非默认的构造方法了。
(2) 在一个构造方法中,只能调用一次其他的构造方法,并且调用构造方法的语句必须是第一条语句。
(3)一个类继承了另一个类的内部类,因为超类是内部类,而内部类的构造方法不能自动被调用,这样就需要在子类的构造方法中明确的调用超类的构造方法。
class C extends A.B {
      C() { 
            new A().super(); // 这一句就实现了对内部类构造方法的调用。
      }
}
构造方法也可这样写:
C(A a) {
     a.super();
} // 使用这个构造方法创建对象,要写成C c = new C(a); a是A的对象。
-----------------------------------------------------------------易错题:
class A {
      public int Avar;
      public A() {
            System.out.println("AAA");
            doSomething();
     }
      public void doSomething() {
            Avar = 1111;
            System.out.println("A.doSomething()");
     }
}

public class B extends A {
      public int Bvar = 2222;
      public B() {
            System.out.println("BBB");

            doSomething();
            System.out.println("Avar=" + Avar);
     }
      public void doSomething() {
            System.out.println("Bvar=" + Bvar);
     }
      public static void main(String[] args) {
            new B();
     }
}
     顺序是这样得,首先生成B就得先生成A,所以调用A的构造器,输出AAA,然后调用方法dosomething,注意:A的该方法被B覆盖,而你生成的是B的对象,所以它调用B的方法,由于BVAR目前没有给定值,所以自动初始化为0;
     然后生成B对象,先初始化变量BVAR,然后调用构造器输出BBB,然后调用方法,这时BVAR已初始化,所以输出BVAR=2222,而对象A中变量AVAR由于没有调用对象A的方法dosomething,所以其值为0,则输出0
全部输出就如下:
      AAA
      Bvar=0
      BBB
      Bvar=2222
      Avar=0
     注意:初始化顺序,当继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,然后调用构造器!当所有超类对象生成后,生成本对象,顺序一样! 当方法被覆盖时,调用目前对象的方法!

12)Java Constructor的更多相关文章

  1. 20172319 2018.10.12《Java程序设计教程》第6周课堂实践(补写博客)

    20172319 2018.10.12 <Java程序设计教程>第6周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  2. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  3. Java知多少(12)运算符

    Java中的运算符和C/C++相差无几. 数学运算符 数学运算,结果为一个数值.见下表: 运算符 说明 举例 + 加法 1 + 2 - 减法 4 - 3.4 * 乘法 7 * 1.5 / 除法 3.5 ...

  4. 12@365 java上传文件(word、图片等)至服务器

    这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...

  5. JavaSE学习总结(十五)—— Java反射与注解

    一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...

  6. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  7. 成为Java GC专家(5)—Java性能调优原则

    并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

  8. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  9. (转)JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

随机推荐

  1. java的新窗体

    1.JFrame窗体 jf.setSize(200, 150);        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);  ...

  2. MapReduce从HBase读写数据简单示例

    就用单词计数这个例子,需要统计的单词存在HBase中的word表,MapReduce执行的时候从word表读取数据,统计结束后将结果写入到HBase的stat表中. 1.在eclipse中建立一个ha ...

  3. MyEclipse 6.5 破解文件代码

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...

  4. Codeforces Round #219 (Div. 1) C. Watching Fireworks is Fun

    C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...

  5. selenium借助AutoIt识别上传文件Java篇

    官方网站:https://www.autoitscript.com/site/ 从网站上下载AutoIt并安装,安装完成在菜单中会看到图4.13的目录: 图4.13  AutoIt菜单 1.首先打开A ...

  6. jmeter随笔(29)-关于自己的jar包和beanshell的使用

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  7. C++调用WebService服务问题总结

    近期接手一部分C++研发工作,同时与.NET开发小组进行软件功能协作,于是需要调用.NET WebService服务,已完成数据的网络通讯业务功能:结束之余,将手头碰到的问题总结罗列如下: C++如何 ...

  8. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  9. IIS装好了无法访问localhost

    解决办法:                 [1]:                 检查你的DTC服务(全名:Distributed Transaction Coordinator)是否可以正常启动 ...

  10. 学习总结 java Iterator迭代器练习

    package com.hanqi.jh; import java.util.*; public class Text3 { public static void main(String[] args ...