子类可以从父类(超类)继承所有的非私有的方法和变量,但子类不继承父类的构造函数。
每个类至少有一个构造函数,如果不写一个构造函数,Java编程语言将提供一个,该构造函数没有参数,面且函数体为空.
如果增加一个带参数的构造函数声明到一个类中,该类以前没有显式构造函数,那么将失去该缺省构造函数.基于这一点,对new Xxxx()的调用将会引起编译错误.这一点很重要.(必须在new的时候写入的参数new Xxxx(xxx,xx)。它的子类也必须显式的批定构造函数。
public Employee(String n){
name=n;
}
public Manager(String s,String n){
super(n);//无论this,super必须放在第一行。
department=s;
}
public class Employee {
String name;
int salary;
public String getDetails(){
return "ename=" +name+"/n"+
"eSalary="+ salary;
}
}
public class Manager extends Employee {
String department;
public String getDetails() {
return "name=" + name + "/n" +
"Manager of " + department;
}
}
象大多数面向对象语言一样,JAVA实际上允许引用一个带有变量的对象,这个变量是父类类型的一个.
Employee e =new Manager()
Employee 为父类,Manager是Employee的子类。
变量e,能访问的对象部分只是Emplloyee的一个部分,Manager的特殊是隐藏的。e是一个Employee, 而不是一个Manager。去访问Manager中不是继承父类的属性是非法的。
public class Test {
public static void main(String args[]){
Employee e=new Manager();
e.name="hero";
System.out.print(e.getDetails());
}
}
运行结果:
name=hero
Manager ofnull
虽然
Employee e=new Manager();创建的是一个Emplyee,但e.getDetails()调用的并不是Employee的方法,面是
Manager 的方法,因为子类的把父类的方法覆盖了。
子类覆盖父类的方法必须有一个与它所覆盖的方法相同的类型,不以比它覆盖的方法访问性差,不能比它覆盖的方法抛出更多的异常。否则将引起编译错误。
若覆盖的方法参数不一致,将实现多态。