8.1类的继承
被集成的类成为父类或者超类(superclass),由集成而得到的类称为子类(subclass).一个父类可以拥有多个子类,但由于java中不支持多重继承,所以一个类只能有一个直接的父类.
父类实际上是所有子类的公共成员的集合,而每一个子类则是父类的特殊化,是对公共成员变量和方法在 功能,内涵方面的扩张和延伸.
java语言中有一个成为java.lang.Object的特殊类,所有的类都是直接或间接地继承该类而得到的.
1).子类的创建
Java中类的继承是通过extends关键字来实现的.子类可以继承所有非private的成员作为自己的成员.
格式如下:
class SubClass extends SuperClass
{ ...... }
eg:
class Person
{
private String name; //构造方法 与 类的成员
private int age;
public Person()
{
System.out.println( "调用了个人构造方法 Person( )" );
}
public void SetNameAge( String name, int age )
{
this.name = name;
this.age = age;
}
public void show( )
{
System.out.println("name:" + name + " age:" + age );
}
}
class Students extends Person
{
private String department;
public Student( )
{
System.out.println( " 调用了学生的构造方法 Student( )" );
}
public void SetDepartment( String dep )
{
department = dep;
System.out.println("我是" + department + "的学生" );
}
}
public class app8_1
{
public static void main( String[] args )
{
Student stu = new Student( ); //创建Student对象
stu.SetNameAge( "zhangsan", 21 ); //调用父类的 SetNameAge( ) 方法
stu.show( ); //调用父类的 show( ) 方法
stu.SetDepartment( "计算机系" ); //调用子类的SetDepartment( )方法
}
}
程序执行的结果为:
调用了个人构造方法 Person( )
调用了学生的构造方法 Student( )
name: zhangsan age: 21
我是计算机系的学生
2).调用父类中特定的构造方法
eg:
class Student extends Person
{
private String department;
public Student( )
{
System.out.println("调用了学生的无参构造方法 Student( )" );
}
public Student( String name, int age, String dep )
{
super( name, age ); //调用父类的有参构造方法
department = dep;
System.out.println("我是"+department + "的学生" );
}
}
3).在子类中访问父类的成员
使用super不但可以访问父类的构造方法,还可以访问父类的成员变量和成员方法,但super不能访问在子类中添加的成员.
访问父类成员的格式如下:
super.<变量名>
super.<方法名>
若父类中非private成员,则protected成员不仅可以在父类中直接访问,同时也可以在子类中访问.
4).覆盖(Overriding)
覆盖的概念与方法的重载相似,他们均是Java语言"多态"(Polymorphism)的技巧之一.
覆盖是指在子类中,定义名称,参数个数与类型均与父类相同的方法,用以重写父类里同名方法的功能.
注意:子类中不能覆盖父类中声明为 final或 static 的方法.
方法一旦被覆盖,那么父类调用该方法也会是调用子类中的方法.但父类不能调用子类中的方法.
覆盖:与父类的方法名称,参数个数与类型必须完全相同.
5).不可被继承的成员与最终类
在默认情况下所有的成员变量都可以被覆盖,如果父类的成语不希望被子类的成员所覆盖可以将它们声明为final.即最终变量,常量.可以访问,但不能修改.可以增加代码的安全性.
若成员变量被声明为final,那么也不能继承该变量.
若一个类被final修饰符修饰,则说明这个类是最终类,该类不可以有子类,这种类被称为最终类.
6).Object类
如果某个类没用使用关键字extends,则该类默认为 java.lang.Object 类的子类.
Object 类常用方法:
public Boolean equals( Object obj ) //判断两个对象变量所指向的是否为同一个对象
public String toString( ) //将调用toString( ) 方法的对性爱那个转换成字符串
public final Class getClass( ) //返回调用getClass( ) 方法的对象所属的类
protected Object clone( ) //返回调用该方法的对象的一个副本