免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1340 | 回复: 0
打印 上一主题 下一主题

Thinkinginjava初始化和清理(1) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-05 21:28 |只看该作者 |倒序浏览

初始化和清理
随着计算机革命的演进,不安全的程序设计方式已经是程序昂贵的罪魁祸
首。
初始化和清理问题便是这类不安全问题中的两个。  许多C语言程序的bugs就是因为程序员忘记了初始化一个变量。  当使用library component的用户不知道该如何初始化或者他们必须初始化library component时,初始化的问题表现的尤为明显。  清理工作之所以是一个特别的问题就是因为当你用完某个代码元素后,它就不再引起你的注意了,你就容易忘记使用过它。  结果是代码元素占用的资源未被清理,你就容易耗尽资源,最明显的就是内存。   
C++引入了constructor的概念,它是一类当对象创建时自动被调用的方法Java也采用了
constructor,而且Java拥有garbage collector,garbage collector在内存资源不再被使用时自动释放那些资源。  这一章阐述了初始化和清理问题以及Java如何配合他们的。

用构造器保证初始化:
初始化时由Java调用构造函数实现的,构造函数名与类名相同,构造函数可以带参数,但不能有返回值,这和void返回不一样。
class Rock2 {
  Rock2(int i) {
    System.out.print("Rock " + i + " ");
  }
}

public class SimpleConstructor2 {
  public static void main(String[] args) {
    for(int i = 0; i
      new Rock2(i);
  }
} /* Output:
Rock 0 Rock 1 Rock 2 Rock 3 Rock 4 Rock 5 Rock 6 Rock 7
*///:~
Method overloading  (方法重载)
下面的类对构造函数和普通方法都实现了重载
class Tree {
      int height;
      Tree() {
        System.out.println("Planting a seedling");
        height = 0;
      }
      Tree(int initialHeight) {
        height = initialHeight;
        System.out.println("Creating new Tree that is " +
          height + " feet tall");
      }
      void info() {
        System.out.println("Tree is " + height + " feet tall");
      }
      void info(String s) {
        System.out.println(s + ": Tree is " + height + " feet tall");
      }
    }
区分overloaded methods
  如果若干方法有同样的名称,Java如何知道你选择使用的是哪一个方法呢?  有一个简单的规则:  每一个overloaded methods必定具备一组区别于其它的参数。
  如果你仔细想想这个规则,它是有道理的。  除了通过参数的类型,程序员又如何能通过别的方式区分两个同名称的方法呢?
  即便参数的顺序不同,也足以用来区别两个overloaded methods,但是通常你不想在overloaded methods中采用这种参数方式,因为它给维护代码带来麻烦。

关于原始数据的重载:
primitive可以被自动的从占用较小存贮空间的数据类型转换到较大的,这一点在遇到
overloading的时候有一些令人迷惑。
处理规则如下:
所以如果在类定义中存在一个 overloaded method,它
的参数为 int 类型,这个方法就被调用了。在所有别的类似情形中,如果你要输入的数据类型比方法定义中的参数数据类型小,要输入的数据类型会被转换,一般情况下可能的话只会上升一级。Char 数据类型有些稍微不同,因为找不到和它匹配的相应 char,它被转换成 int。
如果你要输入的参数数据类型比overloaded method定义的参数数据类型大,方法都采用了较小的primitive数据类型。  假如你要输入的参数数据类型又较大,那么你必须使用cast执行转换。  如果你不这么做,编译器会报告出现错误的消息。也就是说JAVA编译器有自动扩展功能,而如果要窄化,必须要手动的cast

默认构造器:
即便是没有明确定义 constructor,它也创建了一个新的对象并且调用了 default
constructor。 没有 default constructor,你就没有方法可以调用来创建对象。 不过,如
果你定义了 constructor(无论是有还是没参数),编译器也不会为你合成一个 default
constructor

this指针
this. The this keyword—which can be used only inside a non-static method—produces the reference to the object that the method has been called for. You can treat the reference just like any other object reference. Keep in mind that if you’re calling a method of your class from within another method of your class, you don’t need to use this. You simply call the method. The current this reference is automatically used for the other method.
只能用在非静态方法中,静态方法与具体对象是无关的
this指针的作用:
1)用来返回引用
public class logic {
    int i = 0;
    logic increment() {
        i++;
        return this;
      }
      void print() {
        System.out.println("i = " + i);
      }
      public static void main(String[] args) {
         logic x = new logic();
        x.increment().increment().increment().print();
      }
}输出结果为i=3
2)this 关键字也可用于将当前对象传递给另一个类的某个方法:
//: initialization/PassingThis.java

class Person {
  public void eat(Apple apple) {
    Apple peeled = apple.getPeeled();
    System.out.println("Yummy");
  }
}

class Peeler {
  static Apple peel(Apple apple) {
    // ... remove peel
    return apple; // Peeled
  }
}

class Apple {
  Apple getPeeled() { return Peeler.peel(this); }
}

public class PassingThis {
  public static void main(String[] args) {
    new Person().eat(new Apple());
  }
} /* Output:
Yummy
*///:~
3)从 constructors 中调用 constructors
a)当你使用 this 调用某个 constructor的时候,你不可以使用两次 this。
另外,
b)在某个 constructor 内部调用另一个 constructor必须是你要做的第一件事情(放在开始处),你不这样做就会得到一个编译错误消息。
c)因为参数的名字 s 和 member data 的名字 s 相同,存在歧义的情况。 你可以使用 this.s 解决这个问题,意思是说你在引用 member data。 在 Java 代码里你会经常看到这种形式的应用,本书中也大量使用了。
d)除了 constructor 编译器不会让你在任何方法内部调用 constructor。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69999/showart_2046488.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP