面向对象三大特征之二:继承
Q:为什么使用继承?
为了提取两个类中公共的代码,可以使用继承抽取重复性的代码到一个公共类中,这个公共的类称为父类(super class)。继承于父类的类称为子类(sub class)
一,java继承的特性
[1] 单根性。在java中,一个类只能有一个直接父类。
[2] 传递性。C继承于B,B继承于A,C具有A的特性和行为
类B继承于类A,那么类B就拥有了类A中非私有的属性和方法(也可理解成B继承了A中所有的属性和方法,只不过私有的属性和方法B无法访问而已)
继承用:B extends A
//类A: public class Person{ String name; int age; public void showInfo(){ System.out.println("姓名:"+name); System.out.println(",年龄:"+age); } }
//类B: public class Student extends Person{ }
public class Test01{ public static void main(String[] args){ Student s = new Student(); s.name = "张三"; s.age = 20; s.showInfo(); } }
二,关键字:super
表示父类对象,没有引用作用
[1] super访问父类构造方法
public Dog(String name,int health,int love,String strain){ super(name,health,love);//必须写在构造方法的第一句 this.setStrain(strain); }
[2] super调用父类的非私有属性
super可以访问父类的非私有属性,不能访问私有属性(也就是用private修饰过的属性)
如果要访问父类属性,那么用 super.属性 ;如果要访问子类属性则用 this.属性
(不管要访问的属性是不是同一个)
[3] super调用父类非私有方法
也和调用属性一样 使用 super.方法
三,子类继承父类的资源
四,访问修饰符
java中存在4类访问修饰符,分别是private、默认、protected、public。
修饰符 |
本类✘ |
同包子类 |
同包其他类 |
不同包子类 |
不同包其他类 |
private |
✔ |
✘ |
✘ |
✘ |
✘ |
默认 |
✔ |
✔ |
✔ |
✘ |
✘ |
protected |
✔ |
✔ |
✔ |
✔ |
✘ |
public |
✔ |
✔ |
✔ |
✔ |
✔ |
**
private:私有的,只能在本类可以访问。
friendly:默认的,同包可访问,也称包访问权限。
protected:受保护的, ①子类可访问 ②同包可访问
public:公共的,都可以访问
五,继承关系的初始化顺序
继承关系的初始化内存图
(该图用于自己理解的,一般人看不懂)
六,方法的重写
当子类从父类继承过来的方法不能满足自身需要时,子类可以根据自身情况进行方法重写(overwrite/override)
方法重写建立在继承的基础上,没有继承,就没有重写!
子类根据自身情况,可以选择部分重写和完全重写
部分重写:
public void showInfo(){ super.showInfo(); System.out.println("我是一只"+this.getStrain()); }
完全重写:
public void showInfo(){ System.out.println("--"+super.getName()+"--"); System.out.println("健康值:"+super.getHealth()); System.out.println("亲密度:"+super.getLove()); System.out.println("品种:"+this.getStrain()); }
重写的规则:
[1]方法名称相同
[2]参数列表相同
[3]子类的访问权限一定 >= 父类访问权限
[4]返回值和父类相同或者是其子类
public Pet create(){ Pet pet = new Pet(); return pet; }
public Dog create(){ Dog dog = new Dog(); return dog; }