1 继承:子类继承父类的特性,只支持单继承,只有一个父类。这样是避免多个父类时的冲突。子类继承了父类的特性,同时扩展功能。
继承的出现:提高了代码的复用性,让类与类之间产生了关系。
子类父类函数的特点:
子类出现和父类一样的函数时,覆盖父类的函数。重写。
父类独有的函数,子类没出现,子类同样保留了父类函数的功能
继承的弊端:打破了封装性
子类实例化过程:
因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。当然,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
2 抽象类
抽象方法必须定义在抽象类中,抽象类不可以被实例化,只有所有的抽象方法被实现后才可以实例化。
抽象类的问题:
1,抽象类中有构造函数吗?
有,用于给子类进行初始化。
2,abstract关键字不可以和那些关键字共存?
private不行,抽象方法需要实现,私有,没办法实现覆盖原有方法。
static不行,静态的不用对象,直接类名调用,抽象方法没内容,没意义。
final不行,水火不容,抽象要被覆盖,但是final不能覆盖。
3,抽象类和一般类的异同点。
相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。
不同点:1,一般类有足够的信息描述事物。抽象类描述事物的信息有可能不足。
2,一般类中不能定义抽象方法,只能定义非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3,一般类可以被实例化,抽象类不可以被实例化。
abstract class Employee {
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay){
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
//描述程序员。
class Programmer extends Employee {
Programmer(String name,String id,double pay) {
super(name,id,pay);
}
public void work() {
System.out.println("code...");
}
}
//描述经理。
class Manager extends Employee {
private int bonus;
Manager(String name,String id,double pay,int bonus) {
super(name,id,pay);
this.bonus = bonus;
}
public void work() {
System.out.println("manage");
}
}
class Employee {
public static void main(String[] args){
Programmer programmer = new Programmer("黑马程序员——新长城","007",8000);
programmer.work();
Employee employee = new Employee("黑马程序员总经理","001",13000,2000);
employee.work();
}
}