1、什么是覆盖
在java中,覆盖是针对继承才有的概念,某一个子类须要某些方法或属性,但又不想使用父类中的同名的方法或属性,就须要使用覆盖。
直白的来说,就是在子类中编写与父类同名、同參数、同返回值的方法,或同名、同类型的属性。子类对象调用该方法/属性时。运行的是子类的方法。而不会运行父类的方法(除非在方法第一行写super();会先运行父类方法。再继续运行子类代码。
)
了解类的构造函数看这里:类、对象究竟有什么秘密
了解很多其它继承看这里:java类的继承有什么意义
2、构造函数怎样覆盖
了解类的构造函数看这里:类、对象究竟有什么秘密
当子类继承一个父类时,构造子类时须要调用父类的构造函数,存在三种情况
- 父类无构造函数或者一个无參数构造函数时。子类若无构造函数或者有无參数构造函数。子类构造函数中不须要显式调用父类的构造函数,系统会自己主动在调用子类构造函数前调用父类的构造函数。
- 父类仅仅有有參数构造函数时。
子类在构造方法中必须要显示调用父类的构造函数,否则编译出错。
- 父类既有无參数构造函数,也有有參构造函数。
子类能够不在构造方法中调用父类的构造函数,这时使用的是父类的无參数构造函数。
3、方法怎样覆盖
- 子类覆盖父类的方法,必须有相同的參数和返回类型。
- 子类覆盖父类的方法,在jdk1.5后。參数、返回类型能够是父类方法返回类的子类。
- 子类覆盖父类的方法,能够改动方法的修饰符。但仅仅能把方法的作用域放大。而不能把public改动为private。
了解很多其它java修饰符看这里:public、privite、protected有什么差别
- 子类方法能够訪问父类的protected属性。但不能够訪问默认的属性。
- 子类的静态方法。与父类同名静态方法互不影响。因为静态方法使用类名调用,使用子类类名调用子类的方法。使用父类类名调用父类的方法。
- 多态时,当子类覆盖了父类的方法,使用子类覆盖的方法。
了解什么是多态:[java的多态性都有什么表现][6]
[6]:
4、属性怎样覆盖
- 当子类覆盖父类的实例变量时。父类方法使用的是父类的实例变量,子类方法使用的是子类的实例变量。
- 子类或父类使用实例变量时,都相当于在前面加了一个this指针(this.)。
了解很多其它java变量看这里:局部变量、类变量、实例变量有什么差别
5、实例
class SuperClass {
private int number;
public SuperClass() {
this.number = 0;
}
public SuperClass(int number) {
this.number = number;
}
public int getNumber() {
number++;
return number;
}
}
class SubClass1 extends SuperClass {
public SubClass1(int number) {
super(number);
}
}
class SubClass2 extends SuperClass {
private int number;
public SubClass2(int number) {
super(number);
}
}
public class SubClass extends SuperClass {
private int number;
public SubClass(int number) {
super(number);
}
public int getNumber() {
number++;
return number;
}
public static void main(String[] args) {
SuperClass s = new SubClass(20);
SuperClass s1 = new SubClass1(20);
SuperClass s2 = new SubClass2(20);
System.out.println(s.getNumber());
System.out.println(s1.getNumber());
System.out.println(s2.getNumber());
//结论一:多态时,当子类覆盖了父类的方法。使用子类覆盖的方法
//结论二:当子类覆盖父类的实例变量时,父类方法使用的是父类的 实例变量。子类方法使用的是子类的实例变量
}
}
输出结果:
1
21
21
时间: 2024-10-05 07:04:00