java初始化(一)

JAVA学习网 2018-04-01 12:32:01

  在C++中引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法,JAVA中也采用了构造器,并额外提供了垃圾回收器,对于不再使用的的内存资源,垃圾回收器能自动将其释放。

  1. 用构造器确保初始化

     JAVA中,通过提供构造器,类的设计则可以确保每个对象都会得到初始化,创建对象时,如果其类具有构造器,JAVA就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。

问题是如何命名这个方法,有两个问题,第一 :所取的任何名字都可能与类的某个成员名称想冲突,第二:调用构造器是编译器的责任,所以必须让编译器知道应该调用那个方法。在JAVA中采用了C++中的方法,即构造器采用与类相同的名称,考虑到初始化期间要自动调用构造器,这种做法就顺利成章了。

现在,在创建对象时

  New Rock();将会为对象分配存储空间,并调用相应的构造器,这就确保了在你能操作对象之前,它已经被恰当的初始化。

  不接受任何参数的构造器叫做默认构造器,JAVA文档中通常使用术语无参构造器,同时构造器也能带参数。

  如果Tree(int)Tree类中唯一的构造器,那么编译器将不会允许你以其他任何方式创建Tree对象。

  构造器是一种特殊类型的方法,并使代码更易于阅读,这与返回值为空(void)明显不同,对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西,构造器则不会反悔任何东西,你别无选择(new 表达式确实返回了对新建对象的引用,但构造器并没有任何返回值)。假如构造器具有返回值,并且允许人们自行选择返回类型,那么势必得让编译器知道该如何处理此返回值。

(构造器的作用是用于对象的初始化,即给对象传递参数,故没有返回值)

  1. 方法重载

  假如你要创建一个类,即可以用标准方式进行初始化,也可以从文件中读取信息来初始化,这就需要两个构造器,一个默认构造器,另一个取字符串作为形式参数------该初始化表示初始化对象所需的文件名称,为了让方法名相同,而形式参数不同的构造器同时存在,必须用到方法重载。

2.1 区分重载的方法

        要是有几个方法有相同的名称,JAVA如何才能知道你指的是哪一个,其实规则很简单:每个重载的方法具有一个独一无二的参数列表。

2.2 涉及基本类型的重载

  如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。

  如果传入的实际参数类型较大,就得通过参数类型转换来执行窄化转换,如果不这样做,编译器会报错。

  1. 默认构造器

     默认构造器有名无参构造器,它的作用是创造一个默认对象,如果你写的类中没有构造器,则编译器会自动帮你创建一个默认的构造器。但是你如果定义了一个构造器,编译器就不会帮你自动创建默认构造器。

  1. This关键字

        4.1 This关键字只能在方法内部使用,表示对”调用方法的那个对象”的引用,this的用法和其他对象引用并无不同,但是注意,如果在方法内部调用同一个类的另一个方法,就不必使用。

只有当需要明确指出对当前对象的引用时,才需要使用this关键字。例如:当需要返回对当前对象的引用时,就常常在return语句中这样写

  Public  class Leaf {

  Int i=0

  Leaf increment(){

    I++;

  Return  this;

  }
  }

  创建Leaf对象时,调用increment()方法时,返回的是Leaf对象的引用。

  4.2 不仅如此,this关键字对于将当前独享传递给其他方法也很有用。

  例如:class A  ple{

  Apple getPeeled(){

  Return  Peeler.peel(this);

  }

  }

  在此处,this相当于引入Apple对象引用

  4.3 在构造器中调用构造器

  可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码,可用this关键字做到这一点。

  通常写this的时候,都是指“这个对象”或者“当前对象”,而且它本身表示对当前对象的引用,在构造器中,如果为this添加了参数列表,那么就有了不同的意义,这将产生对符合此参数的数列表的某个构造器的明确调用。

  public class Flower {

    int PetalCount=0;

    String s="initial value";

 

  public Flower(int petals) {

    PetalCount = petals;

  System.out.println("Constructor w / int  arg only.PetalCount="+PetalCount);

  }

 

  public Flower(String ss) {

    s = ss;

  System.out.println("Constructor w / String  arg only.s="+ss);

  }

 

  public Flower(int petals, String ss) {

    this(petals);

    PetalCount = petals;

    this.s = ss;

  }

 

  public Flower() {

    this(47,"hello");

  System.out.println("default constructor (no args)");

  }

 

  void pringPetalCount(){

  System.out.println("PetalCount=="+PetalCount+"s=="+s);

  }

  public static void main(String[] args) {

    Flower f = new Flower();

    f.pringPetalCount();

  }

  }

输出结果:

  Constructor w / int  arg only.PetalCount=47

  default constructor (no args)

  PetalCount==47s==hello

  构造器表名,尽管可以用this调用一个构造器,但却不能调用两个,此外,必须将构造器置于最起始处,否则编译会发生错误。

  除构造器之外,编译器禁止在其他任何方法中调用构造器,如果在其他方法中调用构造器,会报错。

阅读(750) 评论(0)