继承
关键字:extends
继承的作用:为了实现代码复用。对于所有子类,将公有的属性和方法定义在父类中,子类通过继承来获取这些属性和方法,从而实现代码的复用。
- 代码的实现
访问修饰符 类名 extends 父类{ }
class Base{ }
/*Base是父类,Son是子类*/
class Son extends Base{ }
- 继承的特点
- 单一继承
一个类只能继承一个父类,一个父类可以有多个子类。(儿子只能有一个爸爸,爸爸可以有多个儿子) - Object是所有类的根,假如类名后面没有写extends,默认是继承了Object。
所有类都继承了Object类,所有的类,其方法,都可以调用Object类的所有属性、方法。 - 继承可以传递,包括直接父类和间接父类(爷 父 孙,孙子可以继承两代的属性和方法,孙和爷属于间接父类)
- 继承中的构造函数
- 构造函数不能被继承,所以子类需要自己声明构造函数,但是在子类的构造函数中,可以调用父类的构造函数。(意思就是,在子类中,构造函数必须要自己重新写,同时也可以在其中调用父类的构造函数)
- 如果要调用父类的构造函数,需要注意:在子类的构造函数【第一行】,用super(参数)调用父类的某个构造。
- super的隐式调用,假如子类构造函数中,没有在第一行写this()或者super(),
此时编译器会自动添加隐式的super(),即调用父类的空参构造。此时如果父类没有空参构造,那么将会编译报错!
比如:
class User{
private String userName;
private String password;
private String num;
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(String userName) {
this(userName,"123");
}
public User(String userName, String password, String num) {
super();//这里调用父类Object得super()空参构造器。
this.userName = userName;
this.password = password;
this.num = num;
}
}
class ZhangSan extends User{
//父类没有空参构造器,子类报错
public ZhangSan(){
}
}
显示调用和隐式调用父类构造器。
class User{
private String userName;
private String password;
private String num;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(String userName) {
this(userName,"123");
}
public User(String userName, String password, String num) {
super();//这里调用父类Object得super()空参构造器。
this.userName = userName;
this.password = password;
this.num = num;
}
}
class ZhangSan extends User{
public ZhangSan(){
// super();隐式调用父类空参构造器。
}
public ZhangSan(String userName, String password){
// super();隐式调用父类空参构造器。
}
public ZhangSan(String userName, String password, String num){
super( userName, password, num);//显示调用父类构造器。
}
}
当构造一个类的实例时,会递归调用父类的构造,直到Object。
public class Test1 {
public static void main(String[] args) {
A3 a3 = new A3();
}
}
class A1{
public A1(){
super();//可以不写,隐式调用
System.out.println("A1");
}
}
class A2 extends A1{
public A2(){
super();//可以不写,隐式调用
System.out.println("A2");
}
}
class A3 extends A2{
public A3(){
super();//可以不写,隐式调用
System.out.println("A3");
}
}
打印结果:
A1
A2
A3
网友评论