类、超类与子类
定义子类
子类(sub)使用extends方法来继承某个超类(super)
public class Manager extends Emplyee
{
added methods and fields
}
覆盖方法
超类中某些方法未必使用于子类,所以在子类中用新的方法来覆盖(override)超类中的这个方法
public class Manager extends Emplyee
{
public double getSalary()
{
return salary + bonus;//won't work
}
}
由于salary是Employee类的私有字段,子类无法访问,所以需要使用 公共接口:Employee类的getSalary()方法
记忆方法:(朕的江山,朕给你才是你的,你不能自己拿)
使用关键字super来解决这个问题(调用超类的方法)
public class Manager extends Emplyee
{
public double getSalary()
{
return super.getSalary() + bonus;
}
}
子类构造器
对子类进行初始化构造时,由于无法访问超类的私有字段,所以必须通过一个构造器来初始化这些字段
使用super调用超类Employee中带有name, salary, year, month, day参数的构造器(必须放在第一句)
super(name, salary, year, month, day);
TIP:关键字this有两个含义:1.指示隐式参数的引用 2.调用其他构造器
:--:
关键字super有两个含义:1.调用超类的方法 2.调用超类的构造器
多态
使用“is-a”规则来判断是否应该将数据设计为继承关系,也即“替换原则”
Employee e;
e = new Employee(...);
e = new Manager(...);
在JAVA语言中,对象变量是多态的,一个变量既可以引用自身类的对象,也可以引用任意一个子类的对象
(子类的信息足以描述超类,但超类的信息不足以描述子类)
Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[0]仍然是Employee对象,不可以调用Mananger的方法
覆盖一个方法时,子类方法不能低于超类方法的可见性(public->public)
阻止继承
不允许扩展的类被称为final类
public final class Executive extends Manager
{
...
}
子类不能覆盖这个方法
public class Employee
{
public final String getName()
{
return name;
}
}
字段设置为final:构造对象之后不允许改变它们的值
强制类型转换
Manager boss = (Manager)staff[0]
唯一原因:要在暂时忽视对象的实际类型之后使用对象的全部功能
if(staff[1] instanceof Manager)
{
boss = (Manager)staff[1];
}
在进行强制类型转换前,先查看是否能成功地转换,使用instanceof操作符实现
抽象类
使用 abstract关键字
public abstract class person
{
public abstract String getDescription();
}
抽象方法充当着占位方法的角色,在子类中具体实现
抽象类不能实例化
抽象类可以创建具体子类的对象
Person p = new Student("Vince Vu", "Economics");
受保护的访问
1.仅对本类可见:private
2.对外部完全可见:public
3.对本包和所有子类可见:protected
4.对本包可见:无需修饰符
Object:所有类的超类
Object类型的变量
Object obj = new Employee("Harry Hacker", 35000);
Employee e = (Employee)obj;
泛型数组列表(容器)
声明数组列表
声明和构造一个保存Employee对象的数组列表
ArrayList<Employee> staff = new ArrayList<Employee>();
var staff = new ArrayList<Employee>();
使用add方法可以将元素添加到数组列表中
staff.add(new Employee("Harry Hacker",...));
size方法将返回数组列表中包含的实际元素个数
staff.size()
访问数组列表元素
设置第i个元素
staff.set(i, harry);
得到数组列表的元素
Employee e = staff.get(i)
删除指定位置元素,并将后面元素前移,返回删除的元素
staff.remove(i)