继承
继承:对每个类的共性进行抽取,在Java中如果要表示继承的关系,需要借助关键字“extends”。
知识点:
1.可以通过 super 访问子类继承过来父类的成员,super 只能指代当前类的父类,不能指代父类的父类。
2.当子类继承父类之后,子类需要显示的调用父类的构造方法,要先帮助父类的成员进行初始化。
3.this 访问的是当前对象(方法和属性),super 访问的是父类继承下来的方法和属性。
4.this和super都只能在非静态方法下使用。
5.Java不支持多继承。
6.密封方法:就是final修饰方法,如果一个类不想被其他类继承,此时可以使用final来修饰当前这个类,这个类被叫做密封类。
多态
多态:同一个事件,最后结果不同。
优点:能够降低代码的”圈复杂度“,避免使用大量的if-else。
向上转型(三种方法)
1.直接赋值
2.方法的传参
3.返回值
缺点:只能调用父类自己的方法向上转型:父类引用子类对象
注意事项:通过父类应用,调用子类特有的方法是无法直接调用的
向下转型
父类给到子类(不是所有的向下转型都可以成功)
需要进行强制类型转换(强转有风险)
protected 关键字
在类和对象章节中,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问
重写和重载的区别
注:重载英语是Overload图片上的Override是重写
方法重写规则:
1.静态方法不能被重写
2.如果子类要重写父类的方法,一般必须与父类 方法原型一致,返回值类型,方法名(参数列表)要完全一致
3.被重写的方法返回值类型可以不同,但是必须有父子关系
4.子类的权限要大于等于父类的权限
在面向对象编程中,如果父类提供了一个构造方法,这并不意味着子类必须也需要提供一个构造方法,但仍有例外,比如:
1.子类需要初始化额外的成员变量:如果子类引入了新的成员变量,那么通常需要自己的构造方法来初始化这些变量。
2.子类需要覆盖父类的构造逻辑:如果子类需要在构造过程中执行与父类不同的操作,它可能需要定义自己的构造方法。
3.调用父类的特定构造方法:子类可以通过在自己的构造方法中调用super()来调用父类的构造方法,从而继承或扩展父类的初始化逻辑。
如何实现
在Java中,如果子类没有显式地定义构造方法,编译器会自动为它添加一个无参的默认构造方法,该构造方法会隐式调用父类的无参构造方法。但如果父类没有无参构造方法或者子类需要执行额外的初始化操作,就需要显式地定义构造方法,并且在构造方法的第一行通过super()调用来初始化父类。
// 父类
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
}
// 子类
class Dog extends Animal {
private int age;
// 子类的构造方法
public Dog(String name, int age) {
super(name); // 调用父类的构造方法
this.age = age;
}
}
注:在这个例子中,Dog类需要初始化两个成员变量:从 Animal 继承的 name 和新增的 age 。因此,Dog 类定义了自己的构造方法,并通过 super(name) 调用了父类 Animal 的构造方法来初始化name。