子父类中,类成员的特点
类中的成员
1 变量
如果子类中出现非私有的同名成员变量时
子类要访问本类中的变量,用this
子类要访问父类中的变量,用super
this表示的是本类对象的引用
super表示的是父类对象的引用
2 函数
当子类出现和父类一模一样的函数的时候
当子类对象调用该函数,会运行子类函数的内容
如同父类的函数被覆盖一样
上述就是函数的一个特性,重写(覆盖)
当子类继承父类,沿袭了父类的功能到子类中,
但是子类虽然具备该功能,但功能内容和父类不一致
这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容
注意:
1 子类覆盖父类,子类权限大于等于父类权限,才可以覆盖,否则编译失败
2 静态只能覆盖静态
3 构造函数
创建子类对象的时候先创建父类对象
对子类对象进行初始化的时候,父类的构造函数也会运行
那是因为子类的构造函数默认第一行有一条隐式语句 super()
super():会访问父类中构造函数(不指定状态下是访问空参数构造函数),而且子类中所有的构造函数默认第一行都是super()
为什么子类一定要访问父类中的构造函数
因为父类中的数据子类可以直接获取。所以子类对象建立时,需要查看父类对父类数据初始化的
所以子类在对象初始化时要先访问父类的构造函数
//extends class Father { int num = 4; Father() { System.out.println("Father run"); } Father(int x) { System.out.println("Father run "+x); } void speak1() { System.out.println("vb"); } } class Son extends Father { int num = 5; Son() { //super(); System.out.println("Son run"); } Son(int x) { //super(); //super(4); System.out.println("Son run "+x); } void showFather() { System.out.println(super.num);//super代表父类对象的引用 } void showSon() { System.out.println(this.num); } void speak()//覆盖 { System.out.println("java"); } } class ExtendsDemo { public static void main(String[] args) { //Son son = new Son(); Son son = new Son(4); //son.showSon(); //son.showFather(); son.speak(); } }