文章目录
前言
适合复习看
继承
继承语法
修饰符 class 子类 extends 父类 {
// ...
}
继承总结
在子类方法中 或者 通过子类对象访问成员时:
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找
子类中访问父类的成员方法时:
super指定访问父级
注意
子类构造方法
注意:
super和this
【相同点】
【不同点】
再谈初始化(执行顺序)
protected 关键字
子类 就是 基类(父类)的派生类(子类)
注意:父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了
继承方式
Java中只支持以下几种继承方式:
注意:Java中不支持多继承。
final 关键字
final关键可以用来修饰变量、成员方法以及类。
final int a = 10;
a = 20; // 编译出错
final public class Animal {
...
}
public class Cat extends Animal {
...
}
// 编译出错
//Error:(3, 27) java: 无法从最终com.bit.Animal进行继承
我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承
继承与组合
class Student2 {
}
class Teacher {
}
class School {
public Student2[] student2s = new Student2[10];
public Teacher[] teachers = new Teacher[5];
//不用继承就能使用"父类"
}
多态
动态绑定与静态绑定
多态的本质就是利用动态绑定,不同对象执行的效果也不一样
多态实现条件
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下
- 子类必须要对父类中方法进行重写
- 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
父类:
class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void eat() {
System.out.println("eat");
}
}
两个子类:
class Cat extends Animal {
Cat(String name) {
super.setName(name);
}
@Override//对父类的eat进行重写
public void eat() {
System.out.println(super.getName() + "吃猫粮");
}
}
class Dog extends Animal {
Dog(String name) {
super.setName(name);
}
@Override//对父类的eat进行重写
public void eat() {
System.out.println(super.getName() + "吃狗粮");
}
}
测试:
class test {
public static void main(String[] args) {
Animal animal = new Cat("猫猫");//向上转型,把子类传给父类的类型
animal.eat();
animal = new Dog("狗子");
animal.eat();
//打印为:
//猫猫吃猫粮
//狗子吃狗粮
}
}
重写
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法
方法重写规则: