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. 倍增法lca

    ][N],siz[N];//rt数组需要在dfs之前置-1. void dfs(int pos,int deep){ dep[pos]=deep; siz[pos]=; for(edge *it=ad ...

  2. 第二章 D - Number Sequence(1.5.10)

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1301527312 大致题意: 有一串数字串,其规律为 1 12 123 1234 1234 ...

  3. Log4日志配置及使用

    1.log4j.xml <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE log4j:co ...

  4. java中好玩的案例

    1:实现猜数字游戏, 如果没有猜对可以继续输入你猜的数字,如果猜对了停止程序. 最多只能猜三次,如果还剩下最后一次机会的时候要提醒用户. 代码: Random random = new Random( ...

  5. 使用appium模拟用户发送短信

    一段简单粗糙的代码.主要是实现的功能是模拟用户发送短信的功能. python版本3.5.2 appium版本1.4.16.1 from appium import webdriver desired_ ...

  6. 基于Web的企业网和互联网的信息和应用( 1194.22 )

    基于Web的企业网和互联网的信息和应用( 1194.22 ) 原文更新日期: 2001年6月21日原文地址: http://www.access-board.gov/sec508/guide/1194 ...

  7. VB datagrid指定行着色

    有图有真相: 关键点:使用datagrid的FetchRowStyle委托. (Form界面的datagrid名称:dgv) 使用FetchRowStyle委托,要先打开开关: dgv.FetchRo ...

  8. Jquery 对象与 DOM对象的相互转换

    在做 web 开发时,经常会用到 jquery 和 dom 对象, 有时候需要在这两个对象间进行切换. Jquery 对象 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuer ...

  9. Mongodb解决不能连接到服务器的错误

    注:这次解决的这个问题的前提是之前打开MongoDB之后,再次使用的时候无法连接了(使用mongod和mongo都不对) 闲话:遇到这种问题真是让人恼火,所以说句sun of beach,好了~爽 正 ...

  10. javascript 实现HashTable(哈希表)

    一.javascript哈希表简介 javascript里面是没有哈希表的,一直在java,C#中有时候用到了这一种数据结构,javascript里面若没有,感觉非常不顺手.细细看来,其实javasc ...