1.基本概念
继承是面向对象的三大特征之一,继承可以解决编程中代码冗余的问题,是实现代码重用的重要手段之一。
继承是软件可重用的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法,来充实自身内容,这种现象或者行为就称为继承。此时,新类称为子类,现有的类称为父类。
继承最基本的作用就是使代码可重用,增加软件的可扩充性。
2.如何使用继承
1.编写父类
将不同类中的重复的属性和方法统一写在一个类中,这个类就是父类。
访问修饰符 class 父类名{
共有的属性和方法
}
2.编写子类
使用继承关键字extends,在子类中只需要编写这个类特有的属性和方法即可。
访问修饰符 class 子类名 extends 父类名{
子类特有的属性和方法
}
注: Java中只支持单根继承,即每个子类只能有一个直接父类。
代码举例说明:
//编写父类Animal类
public class Animal {
private String name;
private int health;
private int love;
public Animal() {
}
public Animal(String name, int health, int love) {
this.name = name;
this.health = health;
this.love = love;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print(){
System.out.println("宠物信息-->姓名:"+this.getName()+" "+"健康值:"+this.getHealth()+" "+"亲密度:"+this.getLove());
}
}
//编写子类Dog,通过关键字extends继承父类Animal类
public class Dog extends Animal {
// 声明品种属性,这个属性是Dog类特有的
private String strain;
public Dog() {
super();// 表示调用父类Animal类的无参构造方法
}
public Dog(String name, int health, int love, String strain) {
super(name, health, love);//表示调用父类Animal类中的有参构造方法
this.strain = strain;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
//eat()方法,Dog类特有的方法
public void eat(){
System.out.println("狗喜欢吃骨头");
}
}
//编写子类Penguin类,继承父类Animal类
public class Penguin extends Animal {
// Penguin类特有属性
private String sex;
// 无参构造方法
public Penguin() {
super();
}
// 有参构造方法
public Penguin(String name, int health, int love, String sex) {
super(name, health, love);
this.sex = sex;
}
//sex读写方法
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
//Penguin类特有方法
public void swimming(){
System.out.println("企鹅会游泳");
}
}
//测试
public class Test {
public static void main(String[] args) {
Dog dog1=new Dog();
//name health love属性都是父类Animal类中的,子类Dog类继承了这些属性
dog1.setName("旺财");
dog1.setHealth(80);
dog1.setLove(99);
//print()方法是父类Animal类中的
dog1.print();
//eat()方法是子类Dog类中的
dog1.eat();
Penguin p1=new Penguin("qq", 90, 98, "公");
p1.print();
p1.swimming();
}
}
继承原则:
在java中,子类可以从父类中继承以下内容:
1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包中;
2.可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包中;
3.无法继承父类的构造方法。
3.super关键字
子类访问父类成员,使用super关键字,super代表父类对象
访问父类构造方法:
super();//访问父类无参构造方法
super(参数列表);//访问父类有参构造方法
访问父类属性:
super.属性名;
访问父类方法:
super.父类方法名();
注:
super只能出现在子类的方法和构造方法中;
super调用构造方法时,智能是第一句;
super不能访问父类的private成员。
4.方法重写
当父类中的方法不能满足子类使用的时候,我们可以在子类中重新定义一个与父类方法同名的方法,这个过程称之为方法重写。
说明:
子类根据需求对从父类继承的方法进行重新编写;
重写时,可以用super.方法的方式来保留父类的方法;
构造方法不能被重写。
方法重写规则
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
6.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
7.父类的私有方法不能被子类覆盖
8.不能抛出比父类方法更多的异常
方法重写VS方法重载