继承
父类是重复的部分,也就是几个类公共的属性和方法
子类是不重复的部分,也就是除了这个类别的类没有的属性和方
子类和父类的关系:
子类与父类是is-a关系,也就是子类是一个父类
其实意思就是和狗是一个宠物的意思一样的
子类和父类:
子类只能有一个父类
但是一个父类可以有很多个子类
如何使用继承
/*父类*/
public class Pet {
//属性
private String name;
private int health;
private int love;
//方法
//get和set方法
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.name);
System.out.println("健康值:"+this.health);
System.out.println("亲密度:"+this.love);
}
}
/*第一个子类*/
public class Dog extends Pet{
//属性
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
}
/*第二个子类*/
public class Cat extends Pet{
//属性
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
/*测试类*/
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("小冉");
dog.setHealth(100);
dog.setLove(90);
dog.print();
Cat cat = new Cat();
cat.setName("xiaoRan");
cat.setHealth(99);
cat.setLove(89);
cat.print();
}
}
在子类继承父类的时候要在类后边加上extends 父类的类名
例如:
public class Cat extends Pet{
/*
* extends:继承(得到父类的属性和方法)
* 代码的复用
* */
}
理解继承
使用super关键字,super代表父类对象
子类访问调用父类成员
//访问父类构造方法
super();
super(name);
/*要注意:访问父类构造方法要在子类构造方法中调用并且必须是是第一句*/
//访问父类属性
super.name;
//访问父类方法
super.print();
不能被继承的父类成员
- private成员
- 子类与父类不在同包,使用默认访问权限的成员
- 构造方法
访问修饰符全部
访问修饰符总结 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认(friendly) | √ | √ | ||
protected | √ | √ | √ | √ |
public | √ | √ | √ | √ |
多重继承关系的初始化顺序是怎样的?
- 父类的属性
- 父类的构造方法
- 子类属性
- 子类构造方法
何时使用继承
- 继承与真实世界类似
1.只要说“猫是哺乳动物”,猫的很多属性,行为就不言自明了
2.藏獒是一种狗 - 继承是代码重用的一种方式
将子类共有的属性和行为放到父类中
使用继承有什么好处呢?
减少代码量,帮助程序快速的设计出来更有效的,维护较强的,安全性较高的代码
重写和重载
构造方法不能被重写,因为构造方法都不能继承
方法重写的规则:
方向名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
方法的重写和方法的重载
位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 | |
---|---|---|---|---|---|
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 相同 | 无关 | 无关 |
super
- super只能出现在子类的方法和构造方法中
- super调用构造方法时,只能是第一句
- super不能访问父类的private成员
抽象类和抽象方法
实例化父类没有意义,Java中使用抽象类,限制实例化
abstract 也可用于方法——抽象方法
- 抽象方法没有方法体
public abstract void print();
- 抽象方法必须在抽象类里
- 抽象方法必须在子类中被实现,除非子类是抽象类
继承总结
复合is-a关系
使用extends关键字
代码复用
方法重写的规则
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
super关键字
super只能出现在子类的方法和构造方法中
super调用构造方法是,只能是第一句
super不能访问父类的private成员
抽象类和抽象方法
抽象类不能被实例化
抽象类可以有0~多个抽象方法
非抽象子类必须重写父类的所有抽象方法
final修饰符
修饰的类,不能再被继承
修饰的方法,不能被子类重写
修饰的变量将变成常量,只能在初始化时进行赋值