继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等
继承的注意事项:
- 父类中的私有变量子类不可以继承
- 子类重写父类方法,访问权限不能比父类低,public>默认>private
- 子类只能继承一个父类,但是可以有多层继承
首先讲一下java中super和this关键字的区别:
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
this | this.成员变量–访问本类成员变量 | this(…) --访问本类构造方法 | this.成员方法–访问本类成员方法 |
super | super.成员变量–访问父类成员变量 | super(…) --访问父类构造方法 | super.成员方法–访问父类成员方法 |
java中继承的语法为:
public class 子类 extends 父类{ }
- 先看一段代码:
public class father {
public int age=40;//年龄
public father() {
System.out.println("father中无参构造方法被调用");
}
public father(int age) {
System.out.println("father中带参构造方法被调用");
}
}
public class son extends father{
public int age=20;
public son() {
System.out.println("son中无参构造方法被调用");
}
public son(int age) {
System.out.println("son中带参构造方法被调用");
}
public void show() {
int age=30;
System.out.println(age);//30
System.out.println(this.age);//20
System.out.println(super.age);//40
}
}
public class Demo {
public static void main(String[] args) {
son s=new son();
s.show();
son s1=new son(32);
s1.show();
}
}
main方法中创建son对象,最终输出为:
father中无参构造方法被调用
son中无参构造方法被调用
30
20
40
father中无参构造方法被调用
son中带参构造方法被调用
30
20
40
无论调用子类的有参构造还是无参构造,都会调用父类的无参构造,这是为什么呢?
这是因为:
- 子类中所有构造方法默认都会访问父类中无参构造方法
- 因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化前,一定要先完成父类数据初始化
- 每一个子类构造方法的第一条语句默认都是:super()
因此,每次在调用子类的时候,系统默认先执行了super()语句,先调用了父类的无参构造方法
那么如何才能调用父类带参构造方法呢?
public class son extends father{
public int age=20;
public son() {
super(20);
System.out.println("son中无参构造方法被调用");
}
public son(int age) {
super(20);
System.out.println("son中带参构造方法被调用");
}
public void show() {
int age=30;
System.out.println(age);//30
System.out.println(this.age);//20
System.out.println(super.age);//40
}
}
只需在子类构造函数中加上super(x)即可(x为参数)
- 利用super实现子类方法重写
直接看代码
父类:
public class Phone {
public void call(String name) {
System.out.println("给"+name+"打电话");
}
}
子类:
public class newPhone extends Phone {
@Override
public void call(String name) {
System.out.println("开启视频");
super.call(name);
}
}
main方法:
public class test {
public static void main(String[] args) {
newPhone p=new newPhone();
p.call("小李");
}
}
通过super关键字可直接调用父类方法,然后子类中再写上本类特有属性即可
其中 @Override是一个注解,可以用于检查重写方法声明的正确性