12>Constructor

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
     注意:初始化顺序,当继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,然后调用构造器!当所有超类对象生成后,生成本对象,顺序一样! 当方法被覆盖时,调用目前对象的方法!

时间: 2024-11-08 13:10:16

12>Constructor的相关文章

java.lang.reflect.Constructor

java.lang.reflect.Constructor 一.Constructor类是什么 Constructor是一个类,位于java.lang.reflect包下. 在Java反射中 Constructor类描述的是 类的构造方法信息,通俗来讲 有一个类如下: 1 package com.testReflect; 2 public class ConstructorDemo { 3 private int num; 4 private String str; 5 6 public Con

(转)React几种基本配置方案

学习React应该基于创建项目特定类型的设置细节之上(比如Webpack.Redux.ES6.JSX.Babel等),而不是一下子就去忙于理解所有的设置项. 在这篇文章中列出了有关于React方面的七种设置.大部分的设置我都将会向大家展示,但总的来说,这并不困难.接下来的内容从简单到复杂,介绍React的设置. 方法1:只使用React,不使用JSX 如果在React项目中决定不使用JSX,又想渲染HTML DOM.那么在准备写React代码之前,在你的HTML页面需要引入一个react.js和

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

Delphi 的TStringBuilder防止服务器内存碎片化

Delphi 2009+ 的 System.SysUtils提供了一个类似.Net的StringBuilder,用于存储字符数组. 很多人不明白为什么要用TStringBuilder, Delphi中有string,有几乎所有TStringBuilder的功能函数, System.SysUtils中还有TStringHelper方便扩展String,更方便String的使用. 从Delphi提供的源码看,TStringBuilder与string最大的区别是,TStringBuilder是可以预

类和接口

类和接口 本篇将介绍TypeScript里的类和接口. 与其他强类型语言类似,TypeScript遵循ECMAScript 2015标准,支持class类型,同时也增加支持interface类型. 一.类(class) 下面是一个类的基本定义方式: 1 class User { 2 name: string; 3 constructor(_name: string) { 4 this.name = _name; 5 } 6 7 sayHello(): string { 8 return `Hel

javascript中4种类型识别的方法

目录 [1]typeof [2]toString [3]constructor [4]instanceof typeof typeof操作符用于返回正在使用值的类型 [输出]首字母小写的字符串形式 [功能] [1]可以识别标准类型(将Null识别为object) [2]不能识别具体的对象类型(Function除外) [实例] console.log(typeof "jerry");//"string" console.log(typeof 12);//"n

javascript实现数据结构:线索二叉树

遍历二叉树是按一定的规则将树中的结点排列成一个线性序列,即是对非线性结构的线性化操作.如何找到遍历过程中动态得到的每个结点的直接前驱和直接后继(第一个和最后一个除外)?如何保存这些信息? 设一棵二叉树有n个结点,则有n-1条边(指针连线) , 而n个结点共有2n个指针域(Lchild和Rchild) ,显然有n+1个空闲指针域未用.则可以利用这些空闲的指针域来存放结点的直接前驱和直接后继信息. 对结点的指针域做如下规定: 1.若结点有左子树,则其leftChild域指示其左孩子,否则令leftC

在原生不支持的旧环境中添加兼容的 Object.keys

1 if (!Object.keys) { 2 Object.keys = (function () { 3 var hasOwnProperty = Object.prototype.hasOwnProperty, //原型上的方法,只取自身有的属性: 4 hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), //ie6一下,!之后的内容为false; 5 dontEnums = [ 6 'toString

PowerManagerService流程分析

一.PowerManagerService简介 PowerManagerService主要服务Android系统电源管理工作,这样讲比较笼统,就具体细节上大致可以认为PowerManagerService集中处理用户活动(如点击屏幕,按电源键等).电量变化.用户设置(如在Setting中设置省电模式,飞行模式).插拔充电器(无线冲,有线冲)等.当发生以上事件时,PowerManagerService都要进行各种状态的更新,以下把PMS作为PowerManagerService的简称 二.Powe