继承
继承的基本知识
1、 java中使用extends关键字实现继承;
2、 通过继承,子类(subclass)自动拥有了基类(父类superclass)的所有成员(成员变量和方法);
3、 在继承过程中,子类继承了基类的所有成员,但是不能访问其私有成员;
4、 Java只支持单继承,不允许多继承。即一个子类只能有一个基类,一个基类可以派生出多个子类。
注:java中父类的私有方法可以被子类继承,但无法访问。子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。
继承中的构造方法
1、 子类的构造过程中必须调用基类的构造方法;
2、 子类可以在自己的构造方法中使用super关键字调用基类的构造方法;
A、 使用this关键字调用本类的另外的构造方法
B、 若调用super,需要写在子类的构造方法的第一行
3、 如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类的无参构造方法;
4、 如果子类构造方法中既没有显示调用基类的构造方法,而基类中也没有无参构造方法,则编译出错。
示例1:
public class Test {
public static void main(String[] args){
B b = new B();
b.print();
}
}
class A{
A(){
System.out.println("A无参构造器");
}
public void print(){
System.out.println("打印:A");
}
}
class B extends A{
B(){
// super(); //可以不用写该行,默认调用基类无参构造器
System.out.println("B无参构造器");
}
public voidprint(){
System.out.println("打印:B");
}
}
运行结果:
A无参构造器
B无参构造器
打印:B
示例2:
1、Employee类:
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, doublesalary,intyear,intmonth,intday){
this.name = name;
this.salary = salary;
this.hireDay = LocalDate.of(year, month,day);
}
public StringgetName() {
returnname;
}
public voidsetName(String name){
this.name = name;
}
public doublegetSalary() {
return salary;
}
public voidsetSalary(doublesalary){
this.salary = salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public voidsetHireDay(LocalDate hireDay) {
this.hireDay = hireDay;
}
public void rasiseSalary(double byPercent){
double raise = salary*byPercent/100;
salary += raise;
}
}
2、Manager类:
public class Manager extends Employee{
private double bonus;
public Manager(String name, double salary,int year,int month,int day){
super(name, salary,year,month,day);
bonus = 0;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus){
this.bonus = bonus;
}
public double getSalary(){
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
}
3、Test类:
public class JiChengTest {
public staticvoidmain(String[] args){
Manager m = new Manager("张三", 4000, 2014, 12, 9);
m.setBonus(1000);
Employee[] e = new Employee[3];
e[0] = m; //父类引用指向子类对象
e[1] = newEmployee("1号", 100, 2014, 12, 1);
e[2] = newEmployee("2号", 200, 2014, 12, 9);
for (Employee employee : e) {
System.out.println(employee.getName() + ":" + employee.getSalary());
}
}
}
测试结果:
张三:5000.0
1号:100.0
2号:200.0