Java中的继承
关键字:extends、this、super
子类拥有父类的全部特性
方法重写,java中是单继承,只能继承一个父类,不过可以用接口来实现多继承
继承与成员变量之间的关系
-
当子类中的成员变量与父类中的成员变量一样的时候
查找顺序为就近原则,查找失败则报错
方法的局部范围——》子类中成员位置——》父类中的成员位置
继承的访问顺序:
- 父类中静态成员变量和静态代码块
- 子类中静态成员变量和静态代码块
- 父类中普通成员变量和代码块,父类的构造函数
- 子类中普通成员变量和代码块,子类的构造函数
//继承访问顺序举例
class X{
Y b = new Y();//1
X(){
System.out.println("X");//2
}
}
class Y{
Y(){
System.out.println("Y");
}
}
class Z extends X{
Y y = new Y();
Z(){
System.out.println("Z");
}
}
public class Test2 {
public static void main(String[] args) {
new Z();
}
}
//输出为:
final关键字
特点:
-
修饰类,类不能被继承
-
修饰成员变量,变量变常量,且只能赋值一次,在构造方法调用之前赋值都可以
-
final修饰成员方法之后,方法不能被重写,父类中的final方法可以被子类继承,但是不能被子类重写
举个栗子:
class Fu{
final int num2;
{
//法一 num2 = 200;
}
public void Fu(){
//法二 num2 =200
}
}
class Fu2{
public final void show(){
System.out.println("这是父类中的show方法");
}
}
//final修饰后就不能再进行重写了
class Zi extends Fu2{
// @Override
// public void show() {
// System.out.println("这是子类的show方法");
// }
}
public class FinalDemo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
final修饰局部变量:
- 修饰基本数据类型的变量,变量值智能赋值一次,不能发生改变
- final修饰引用数据类型的变量,引用的地址值不可以发生改变,但是该对象的堆内存中的值是可以改变的
//final修饰引用数据类型的变量,引用的地址值不可以发生改变,但是该对象的堆内存中的值是可以改变的
class Student {
int age = 10;
}
public class FinalDemo2 {
public static void main(String[] args) {
int x = 100;
x = 300;
System.out.println(x);
final int y = 200;
System.out.println(y);
// y = 100; 已经被final修饰,不能再继续赋值更改变量
Student student = new Student();
System.out.println(student.age);
final Student s2 = new Student();
System.out.println(s2.age);
s2.age = 1000;
System.out.println(s2.age);
// s2 = new Student(); //无法为最终变量s2分配值
}
}
方法的重写的注意事项
- 父类中私有的方法不能被重写
- 子类重写父类的方法时候,要么子类重写父类的方法访问权限比父类更高或平级
- 父类中静态方法不能被重写,即不能被Override修饰,因为静态的是属于类本身的东西
面试题:
-
方法重写和方法重载的区别
overload:重载 重载只发生在同一个类中,出现的方法名一致,参数列表不一致的现象 override:重写 重写发生在继承关系中的子类中,出现和父类中方法声明一样的方法,实现的功能不一样
-
this关键字和super关键字代表什么?以及他们各自的使用场景和作用
this:代表当前类对象的引用
super:代表父类存储空间的标识
成员变量:
super.父类的成员变量
this.本类中的成员变量
构造方法:
super(...)
this(...)
成员方法:
super.父类中的成员方法()
this.本类的成员方法()