1、继承及关键字super
继承是从已有的类中派生出来的新的类—>包含原有的内容,并进行了扩展,即 继承 = 吸收+扩展。
无规矩不成方圆,继承也必须遵从一些原则:
(1)只能是单继承,即只能有一个父类,向上追溯时是一条单线;
(2)必须包含父类的所有内容,即你有的我全部都要。
需要注意的一点是,private的内容也是继承了过来,但是依然是private的,即语法上依然不允许程序员对其进行访问。
既然要发展,那么就有添加和更改(删除不被允许,因为要满足上述第2条原则)。对于添加,只要满足语法定义,都是可以的;对于更改,就是重写的问题。其中都有可能会涉及到使用父类的方法的问题,这时就需要使用关键字super,super使用原则如下:
1)如果不写出来,每个子类构造方法的第一条语句默认是隐含地调用super();
2)如果写出来,则super();语句必须是构造函数中的第一条语句;(即i++; super(); // error) //满足第一条原则
3)一个构造函数中不能写多个super(参数列表)。 //类似于if...else if...else if...
2、重写
重写是在子类中重新定义父类中已有的方法。重写的方法必须和被重写的方法具有相同的名称、参数列表和返回值类型。当覆盖方法时,不能使用比父类更为严格的访问权限。(涉及到多态的内容)
在重写中,想到一个小问题:在子类中,调用一个方法,只用方法名调用时,采用的是子类的方法还是父类的方法?(猜想:采用的是子类的方法,不然重写就没有意义)
/* 重写中如果重写了父类中的两个构造函数,并在一个中调用了,会出现什么情况?
* */
class A {
int i=10;
public void show () {
System.out.println("调用的是父类中的无参构造函数");
}
public void show (int i) {
System.out.println("调用的是父类中的有参构造函数");
}
}
class B extends A {
public void show () {
super.show(); //【注意super的使用】
show(i);//【只使用方法名来调用】
System.out.println("调用的是子类中的无参构造函数");
}
public void show (int i) {
System.out.println("调用的是子类中的有参构造函数");
}
}
public class rewrite {
public static void main(String[] args) {
// TODO Auto-generated method stub
B b = new B ();
b.i = 10;
b.show();
b.show(b.i);
}
}
/*运行结果:
(1)子类B中无对有参的重写
调用的是父类中的无参构造函数
调用的是父类中的有参构造函数
调用的是子类中的无参构造函数
调用的是父类中的有参构造函数
调用的是子类中的有参构造函数
(2)子类B中有对有参的重写
调用的是父类中的无参构造函数
调用的是子类中的有参构造函数
调用的是子类中的无参构造函数
分析:构造函数的调用(访问)以最近的为准则【子类有则用子类,子类无则用父类】
* */
结果:
使用子类中的方法,当子类中没有时,转向父类。