第六章 重复运用classes
在面向过程的语言中重复运用代码只是简单的复制代码,以达到重复运用的目的,而在面向对象的Java程序中,代码的重用主要体现在2点
1、在新的class中使用既有的class,这中方法称之为"组合"。但是这种重用方式只是很单纯的重复运用以有的代码 功能,而非重复运用其形式。
2、让新的class成为既有class的一类,并且根据需要加入新的功能,而无须更动原有class,这种方法称之为"继续"。
组合语法
其实组合我们在以前的例子中已经大量的用到了,我们只要将对象句柄放置在class中就是组合!
class compostion
{
private String s;
compostion()
{
System.out.println("compostion()");
s=new String("hello");
}
public String toString()
{
return s;
}
}
public class test
{
compostion c; //对象句柄
int i;
public void show()
{
System.out.println("int = "+i);
System.out.println("compostion = "+c);
}
public static void main(String args[])
{
test t = new test();
t.show();
}
}
其中每个非基本数据类型的对象都有一个toString()方法,该函数用于将compostion转换为一个string,和其他string相加class中基本数据类型会被初始化为默认值,而对象句柄会被初始化为null。假如你要使用该句柄,切记要初始化,否则会抱空指针错误!
继续
继续是java语言中极其重要的一部分,使用要害字extends来实现,这样变自动的让子类获得了父类中所有的成员数据和函数。而java中所有的类甚至包括你自己已经定义的或者将要定义的类都是继续自object类的,在编译器内部进行的隐式继续
class base
{
int i=10;
public void show()
{
System.out.println("base method");
}
public static void main(String args[]) // java答应在同一个文件中的class拥有各自的main()
{
new base().show();
}
}
class derived extends base //继续
{
public void show() //覆盖了base的函数
{
System.out.println("derived method");
super.show(); //调用base的函数
}
public void newMethod() //子类中新加入的函数
{
System.out.println(i); //打印base中的数据
}
public static void main(String args[])
{
derived d = new derived();
d.show();
d.newMethod();
}
}
base的初始化
当子类被初始化的时候系统会先将被继续的父类初始化,java编译器会在调用子类构造函数之前调用父类的构造函数
class base
{
base()
{
System.out.println("base method");
}
}
class derived extends base
{
derived()
{
//super(); 系统会自动加入对父类的调用
System.out.println("derived method");
}
public static void main(String args[])
{
derived d = new derived();
}
}
假如你的父类是带有引数的class,那么编译器是不会自动调用构造函数的,你必须使用super来调用,否则系统会抱错