Java面向对象学习
在一个文件中可以定义数个类,但只能有一个类被设置为public,文件名称主文件名必须与这个public的类同名。
在定义类时,有一个基本原则是:信最小化公开。就是尽量通过方法来操作对象,而不直接存取对象内部的域成员。
静态方法中没有this参考名称。
Java在使用到类时才会加载类至程序中。如果在加载类时,希望先执行一些类的初始化动作,可以使用static定义一个静态区块,并在当中编写载入时的初始化动作。
返回值类型不可用做方法重载的区别根据。
编译器在处理重载方法、装箱问题和不定长度参数时,会一句下面的顺序寻找符合的方法:
1. 寻找在还没有装箱动作前可以符合参数个数与类型的方法
2. 尝试装箱动作后可以符合参数个数与类型的方法
3. 尝试设有不定长度参数并可以符合的方法
4. 编译器找不到合适的方法,报告编译器错误
不定长度参数:
publc class mathtool
{
public static int sum(int ... nums)
{
int sum=0;
for(int num :nums)
{
sum += sum;
}
return sum;
}
}
实际上nums是一个数组。(即int[] nums)
在方法上使用不定长度参数时,记得必须声明参数必须设置在参数行的最后一个。
例如:
public void someMethod(int arg1 , int arg2 , int... vargs);
public void someMethod(int... vargs,int arg1,int arg2); //不合法
无法使用两个以上不定长度参数。
垃圾收集:
在Java中并没有析构函数,但有finalize()方法,它被声明为protected,finalize()会在对象被回收时执行,但不可以将它当做析构函数使用,因为不知道对象资源何时被回收。
如果确定不再使用某个对象,可以在参考至对象的名称上指定null,表示这个名称不再参考至任何对象。不被任何名称参考的对象会被回收资源。
可以使用System.gc()建议程序进行垃圾收集,如果建议被采纳,则对象资源会被回收,回收前会执行finalize()方法。
继承
在Java中,所有的类都直接或间接地继承了java.lang.Object类。
在扩展某个类之后,可以一并初始化父类的构造函数,已完成响应的初始化动作,这可以使用super()方法来达到,它表示调用基底类的构造函数。super()必须再构造函数一开始就调用,在子类的构造函数中,如果不用super()指定使用父类中的哪个构造函数来初始,则默认会调用父类中无参数的构造函数。
重写方法
可以使用super()方法在派生类中调用基类的构造函数,使用super.methodName()调用父类的方法。
重写方法时需要注意的是,可以增大父类中的方法权限,但不可以缩写父类中的方法权限。也就是若原来成员时public,不可以在父类中重写它为private或protected。
Object类
在Java中,每个类都直接或间接继承自Object类。
Object类定义了几个方法,包括protected权限的clone()、finalize()以及public权限的equals()、toString()、hashCode()、notify()、notifyAll()、wait()、getClass()等。除了getClass()、notify()、notifyAll()、wait()等方法之外其他都可以在继承后加以重写,因为这些方法都被声明为final,无法重写。
方法 |
说明 |
toString() |
对对象的文字描述 |
getClass() |
返回对象于执行期间的Class实例 |
getName() |
取得类名称 |
hashCode() |
返回改物件的哈希码(Hash Code) |
equals() |
比较对象的内存地址是否相同 |
Clone() |
复制对象本身 |
要支持复制自身的对象,定义类时必须实现Cloneable接口。如果不实现这个接口的类,其实例的clone()方法被调用时,会出现CloneNotSupportedException异常。Java中的Clone()方法是继承自Object,为了方便直接调用,将其存取权限从protected改为public。
如:
public class Table implements Cloneable //要实现Cloneable
{
...
public Object clone() throws CloneNotSupportedException
{
Table table = (Table) super.clone(); //调用父类的clone()来复制
}
...
}
改变复制对象的内容,对原来内容不会有影响。
final关键词
final关键词可以使用在变量声明时,表示改变量一旦设置之后,就不可以再改变改变量的值。
如:
final double PI = 3.14159;
public final double getRadius() {....}
如果在定义方法成员时使用final,则表示该方法成员无法再被子类重写。
多态
多态实现指的是使用同一个实现接口,以实现不同的对象实例。多态实现在面向对象上是为了降低对实现接口的依赖程度,进而增加程序架构的弹性与可维护性。
要实现对象上的方法必须使用对应类型的实现接口,而如果使用不正确的类型来转换对象的实现接口,则会发生java.lang.ClassCastException异常。
抽象类:
在Java中定义类时,可以仅声明方法名称而不操作其中的逻辑,这样的方法称为抽象方法。如果一个类中包括了抽象方法,则该类称为抽象类。抽象类是拥有未实现方法的类,所以它不能被用来生成对象,它只能被继承扩展,并于继承后实现未完成的抽象方法。在Java中声明抽象方法与抽象类,要使用abstract关键词。
接口:
实现某接口的类并不属于某一个类,一个对象上可以实现多个接口。
接口的目的在于定义一组可实现的方法,实现接口的类必须实现该接口所定义的所有方法。只要对象有实现某个接口,就可以通过该接口来实现对象上对应的方法。
接口的声明时使用interface关键词,生命方式如下:
[public] interface 接口名称
{
权限设置 返回类型 方法(参数列);
。。。
}
在声明接口时方法上的权限设置如果省略的话,默认的是public。
在定义类时,可以使用implements关键词来指定要实现哪个接口,接口中所有定义的方法都要实现。