Java基础二 对象与类

1 类与对象

1 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用。new操作符的返回值也是一个引用。如果将一个方法应用于一个值为null的对象上,就会产生运行错误。局部变量不会自动地初试化为null,而必须通过调用new或将它们设置为null进行初始化。可以将Java中的对象变量看作C++的对象指针。

2 在C++中,带有const后缀的方法是访问器方法;默认为更改器方法。但是在Java语言中,访问器方法与更改器方法在语法上没有明显区别。

3 关键字public意味着任何类的任何方法都可以调用这些方法。关键字private确保只有类自身方法能够访问这些实例域,而其他类的方法不能够读写这些域。

4 构造器与类同名,每一类可以有一个以上的构造器,构造器可以有0,1或多个参数,构造器没有返回值,构造器总是伴随着new一起使用。

5 在C++中,通常在类的外面定义方法,如果在类的内部定义方法,这个方法将自动地称为内联inline方法。在Java中,所有的方法都必须在类的内部定义,但并不表示它们是内联方法。是否将某个方法设置为内联方法是Java虚拟机的任务。即时编译器会调用那些简洁,经常被调用,没有被重载以及可优化的方法。

6 注意不要编写返回引用可变对象的访问器方法,因为如果返回了对象的引用就可以通过在外面的引用改变这个私有变量的状态,从而破坏了封装性。如果需要返回一个可变数据域的拷贝,就应该使用clone。

7 类的方法可以访问类的任何一个对象的私有域,C++也有同样的原则,方法可以访问所属类的私有特性,而不仅限于访问隐式参数的私有特性。

8 有时可能希望将一个计算代码划分为若干个独立的辅助方法。通常这些辅助方法不应该成为公有接口的一部分,这是由于它们往往与当前的机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序,最好将这样的方法设计为private。

9 可以将实例域定义为final。构建对象时必须初始化这样的域。也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。例如,可以将Employee类中的name域声明为final,因为在构建对象后,这个值不会再修改,即没有setName方法。但是把对象引用定义为final,只是表示这个引用不会再指示其他对象,而不是这个对象不能修改。

2 静态域和静态方法

1 如果将域定义为static即静态域,它属于类,不属于任何一个独立的对象,为所有对象共享。

2 静态常量即定义为static final,可以把它定义为public,因为final表明它不会被修改。譬如public static final double PI=3.1415926

3 静态方法是一种不能向对象实施操作的方法,例如,Math类的pow方法就是一个静态方法。在下面两种情况使用静态方法:a,一个方法不需要访问对象状态,其所需参数都是通过显式参数提供的(例如Math.pow)。b一个方法只需访问类的静态域。

4 按值调用(call by name)表示方法接收的是调用者提供的值。而按引用调用(call by reference) 表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。Java总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝。

5 方法参数共有两种类型:基本数据类型(数字,布尔值),对象引用。一个方法不可能修改一个基本数据类型的参数,但可以修改对象引用引用的对象。对象引用作为参数时,可以修改对象,因为引用拷贝后,依然引用的是对象,但是不能交换,因为交换的是引用的副本。

3 对象构造

1 如果多个方法有相同的名字,不同的参数,便产生了重载。Java允许重载任何方法,而不只是构造器方法。因此要完整地描述一个方法,需要指出方法名及参数类型。这叫做方法的签名。返回类型不是方法签名的一部分,也就是说,不能有两个名字相同,参数类型也相同却返回不同类型值的方法。

2 如果在构造器中没有显式地给域赋初值,那么就会自动地被赋为默认值:数值为0,布尔值为false,对象引用为null。

3 如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器,这个构造器将所有实例域设置为默认值。于是,实例域中的数值型数据设置为0,布尔型数据设置为false,所有对象变量都将设置为null。如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。

4 在Java中可以在执行构造器之前,先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时,这种方式很有用。在C++中不能直接初始化类的实例域。

5 关键字this引用方法的隐式参数,而且这个关键字还有另一个含义,如果构造器的第一个语句形容this(...),这个构造器将调用同一类的另一个构造器。譬如:

public Employee(double s){
    //call Employee(String,double)
    this("Employee #"+nextId,s);
    nextId++;
}

采用这种方式使用this关键字非常有用,这样对公共的构造器代码部分只编写一次即可。在Java中,this引用等价于C++的this指针。但是在C++中,一个构造器不能调用另一个构造器,在C++中,必须将抽取的公共初始化代码编写成一个独立方法。

6 由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。

4 包

1 使用包的主要原因是确保类名的唯一性。标准的Java类库分布在多个包中,包括java.lang,java.util和java.net等。标准的Java包具有一个层次结构,如同硬盘的目录嵌套一样,可以使用嵌套层次组织包。从编译器的角度看,嵌套的包之间没有任何关系。例如java.util包与java.util.jar包毫无关系。每一个都拥有独立的类集合。

2 当导入的两个包中的类名一样时,需要在每个类名前加上完整的包名。

3 在C++中,与包机制类似的是命名空间。在Java中,package与import语句类似于C++中的namespace和using指令。

4 标记为public的部分可以被任意的类使用;标记为private的部分只能被定义它们的类使用。如果没有指定public或private,这个部分(类,方法或变量)可以被同一个包中的所有方法访问。

5 类的设计技巧

1 要保证数据私有;一定要对数据初始化;不要在类中使用过多的基本类型;不是所有的域都需要独立的域访问器和域更改器;将职责过多的类进行分解;类名和方法名要能够体现它们的职责;优先使用不可变的类。

猜你喜欢

转载自blog.csdn.net/leon_lavie/article/details/82824924
今日推荐