java面向对象之继承
继承是java语言的面向对象的三大特征(封装,继承,多态)之一,其表现为子类继承父类的属性或方法并且可以重新在子类中重新定义父类的属性或方法。
关键字:extends
格式:
public class Child extends Father {
}
接下来看一个简单案例:
//父类
public class Father {
String house;
String car;
public Father() {
}
public Father(String house, String car) {
this.house = house;
this.car = car;
}
public String getHouse() {
return house;
}
public void setHouse(String house) {
this.house = house;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
public void work(){
System.out.println("编程");
}
}
//子类
public class Son extends Father{
@Override
public void work() {
System.out.println("技术专家");
}
public void show(){
System.out.println(house + "," + car);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Father father = new Father();
father.work();
Son son = new Son();
son.setCar("保时捷");
son.setHouse("大别墅");
son.show();
son.work();
}
}
//输出结果:
编程
大别墅,保时捷
技术专家
通过以上代码可以总结出,子类继承父类可从成员变量,成员方法和构造方法进行总结:
- 子类可以继承父类的非私有的成员变量
- 可以使用父类非私有的成员方法(在测试类里可以看到使用父类的get,set方法)
- 子类可以对父类的成员方法进行重写
- 构造方法不能被继承,子类所有的构造方法默认都会首先访问父类的无参构造方法。在子类所有的构造方法中的首行会默认存在一个super()方法用以访问父类的无参构造,如需访问父类的有参构造方法则需显示的使用super(param1, param2…),则会直接访问父类的有参构造方法。
继承的使用场景:
is…a的场景,也就是谁是谁的一种,比如猫是动物的一种。
使用继承的优势:
- 提高了代码的复用性
- 提高了代码的维护性
- 实现多态的基础
缺点:降低了类的独立性,当父类改变时,子类必须改变。
继承的注意事项:
- 方法重写也叫方法覆盖,是子类重写父类的方法,用@Override注解。重写父类的方法,在定义方法时方法的格式必须与父类保持完全一致,包括方法名,返回只及参数列表都完全一致,子类可以重写方法体的内容,但声明时必须与父类保持完全一致,否则编译会报错。重写方法时注意私有方法不能被重写,且子类的重写方法的访问权限不能低于父类的方法访问权限。
- 子类访问成员变量的规则。先在子类的成员方法中找,然后在子类的成员变量里找,最后在父类的成员变量里找,找不到则编译报错。
- 类与类之间的继承是单继承,如需要,则需要多层继承,如子类继承父类,父类再继承grandFather类,这样子类就拥有了父类和grandFather的属性和方法。